public void handleMessage(Message message) { switch (message.what) { case DID_SUCCEED: { // Here we get the credit info, now add a row in the interface String response = (String) message.obj; try { float value = Float.parseFloat(response.trim()); if (value >= 0) { customWizardText.setText( "Credit : " + Math.round(value * 100.0) / 100.0 + " euros"); customWizard.setVisibility(View.VISIBLE); } } catch (NumberFormatException e) { Log.e(THIS_FILE, "Impossible to parse result", e); } catch (NullPointerException e) { Log.e(THIS_FILE, "Null result"); } break; } case DID_ERROR: { Exception e = (Exception) message.obj; Log.e(THIS_FILE, "Error here", e); break; } } }
/** Reset the audio mode */ private synchronized void actualUnsetAudioInCall() { if (!prefs.getBoolean("isSavedAudioState", false) || !isSetAudioMode) { return; } Log.d(THIS_FILE, "Unset Audio In call"); int inCallStream = Compatibility.getInCallStream(userWantBluetooth); if (bluetoothWrapper != null) { // This fixes the BT activation but... but... seems to introduce a // lot of other issues // bluetoothWrapper.setBluetoothOn(true); Log.d(THIS_FILE, "Unset bt"); bluetoothWrapper.setBluetoothOn(false); } audioManager.setMicrophoneMute(false); if (doFocusAudio) { audioManager.setStreamSolo(inCallStream, false); audioFocusWrapper.unFocus(); } restoreAudioState(); if (wifiLock != null && wifiLock.isHeld()) { wifiLock.release(); } if (screenLock != null && screenLock.isHeld()) { Log.d(THIS_FILE, "Release screen lock"); screenLock.release(); } isSetAudioMode = false; }
@Override public void fillLayout(final SipProfile account) { super.fillLayout(account); accountUsername.setTitle(R.string.w_advanced_caller_id); accountUsername.setDialogTitle(R.string.w_advanced_caller_id_desc); boolean recycle = true; providerListPref = (ListPreference) findPreference(PROVIDER_LIST_KEY); if (providerListPref == null) { Log.d(THIS_FILE, "Create new list pref"); providerListPref = new ListPreference(parent); providerListPref.setKey(PROVIDER_LIST_KEY); recycle = false; } else { Log.d(THIS_FILE, "Recycle existing list pref"); } CharSequence[] v = new CharSequence[providers.size()]; int i = 0; for (String pv : providers.keySet()) { v[i] = pv; i++; } providerListPref.setEntries(v); providerListPref.setEntryValues(v); providerListPref.setKey(PROVIDER); providerListPref.setDialogTitle("Provider"); providerListPref.setTitle("Provider"); providerListPref.setSummary("Betamax clone provider"); providerListPref.setDefaultValue("12VoIP"); if (!recycle) { addPreference(providerListPref); } hidePreference(null, SERVER); String domain = account.getDefaultDomain(); if (domain != null) { for (Entry<String, String[]> entry : providers.entrySet()) { String[] val = entry.getValue(); if (val[0].equalsIgnoreCase(domain)) { Log.d(THIS_FILE, "Set provider list pref value to " + entry.getKey()); providerListPref.setValue(entry.getKey()); break; } } } Log.d(THIS_FILE, providerListPref.getValue()); // Get wizard specific row customWizardText = (TextView) parent.findViewById(R.id.custom_wizard_text); customWizard = (LinearLayout) parent.findViewById(R.id.custom_wizard_row); updateAccountInfos(account); }
@Override @SuppressWarnings("unchecked") public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info; try { info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); } catch (ClassCastException e) { Log.e(THIS_FILE, "bad menuInfo", e); return false; } HashMap<String, Object> codec = null; codec = (HashMap<String, Object>) mAdapter.getItem(info.position); if (codec == null) { // If for some reason the requested item isn't available, do nothing return false; } int selId = item.getItemId(); if (selId == MENU_ITEM_ACTIVATE) { boolean isDisabled = ((Short) codec.get(CODEC_PRIORITY) == 0); userActivateCodec(codec, isDisabled); return true; } return false; }
/** * Hide a preference from the preference screen. * * @param parentGroup key for parent group if any. If null no parent group are searched * @param fieldName key for the field to remove */ protected void hidePreference(String parentGroup, String fieldName) { PreferenceScreen pfs = parent.getPreferenceScreen(); PreferenceGroup parentPref = pfs; if (parentGroup != null) { parentPref = (PreferenceGroup) pfs.findPreference(parentGroup); } Preference toRemovePref = pfs.findPreference(fieldName); if (toRemovePref != null && parentPref != null) { boolean rem = parentPref.removePreference(toRemovePref); Log.d("Generic prefs", "Has removed it : " + rem); } else { Log.d("Generic prefs", "Not able to find" + parent + " " + fieldName); } }
@Override protected void onListItemClick(ListView l, View v, int position, long id) { Log.w(THIS_FILE, "Click at index " + position + " id " + id); super.onListItemClick(l, v, position, id); PrefGroup pref_gp = adapter.getItem(position); startActivity(pref_gp.intent); }
/** * Start ringing announce for a given contact. It will also focus audio for us. * * @param remoteContact the contact to ring for. May resolve the contact ringtone if any. */ public synchronized void startRing(String remoteContact) { saveAudioState(); if (!ringer.isRinging()) { ringer.ring(remoteContact, service.getPrefs().getRingtone()); } else { Log.d(THIS_FILE, "Already ringing ...."); } }
@Override public void onItemClick(AdapterView<?> ad, View view, int position, long arg3) { String number = (String) view.getTag(); SipProfile account = accountChooserButtonText.getSelectedAccount(); String rewritten = Filter.rewritePhoneNumber(getContext(), account.id, number); setTextValue(rewritten); Log.d(THIS_FILE, "Clicked contact " + number); }
public void stopService() { Log.i(THIS_FILE, "Remove media manager...."); if (bluetoothWrapper != null) { bluetoothWrapper.unregister(); bluetoothWrapper.setBluetoothChangeListener(null); bluetoothWrapper = null; } }
private static int getIntValue(EditTextPreference pref, int defaultValue) { try { return Integer.parseInt(pref.getText()); } catch (NumberFormatException e) { Log.e(THIS_FILE, "List item is not a number"); } return defaultValue; }
/** Initialize datas list */ private void initDatas() { if (codecsList == null) { codecsList = new ArrayList<Map<String, Object>>(); } else { codecsList.clear(); } bandtype = (String) getArguments().get(BAND_TYPE); mediatype = (Integer) getArguments().get(MEDIA_TYPE); String[] codecNames; if (mediatype == MEDIA_AUDIO) { codecNames = prefsWrapper.getCodecList(); } else { codecNames = prefsWrapper.getVideoCodecList(); } int current_prio = 130; for (String codecName : codecNames) { Log.d(THIS_FILE, "Fill codec " + codecName + " for " + bandtype); String[] codecParts = codecName.split("/"); if (codecParts.length >= 2) { HashMap<String, Object> codecInfo = new HashMap<String, Object>(); codecInfo.put(CODEC_ID, codecName); if (mediatype == MEDIA_AUDIO) { codecInfo.put( CODEC_NAME, codecParts[0] + " " + codecParts[1].substring(0, codecParts[1].length() - 3) + " kHz"); } else if (mediatype == MEDIA_VIDEO) { codecInfo.put(CODEC_NAME, codecParts[0]); } codecInfo.put( CODEC_PRIORITY, prefsWrapper.getCodecPriority(codecName, bandtype, Integer.toString(current_prio))); codecsList.add(codecInfo); current_prio--; Log.d(THIS_FILE, "Found priority is " + codecInfo.get(CODEC_PRIORITY)); } } Collections.sort(codecsList, codecsComparator); }
private int getAudioTargetMode() { int targetMode = modeSipInCall; if (service.getPrefs().useModeApi()) { Log.d(THIS_FILE, "User want speaker now..." + userWantSpeaker); if (!service.getPrefs().generateForSetCall()) { return userWantSpeaker ? AudioManager.MODE_NORMAL : AudioManager.MODE_IN_CALL; } else { return userWantSpeaker ? AudioManager.MODE_IN_CALL : AudioManager.MODE_NORMAL; } } if (userWantBluetooth) { targetMode = AudioManager.MODE_NORMAL; } Log.d(THIS_FILE, "Target mode... : " + targetMode); return targetMode; }
@Override public Bitmap getContactPhoto(Context ctxt, Uri uri, Integer defaultResource) { Bitmap img = null; try { img = People.loadContactPhoto(ctxt, uri, defaultResource, null); } catch (IllegalArgumentException e) { Log.w("Contact3", "Failed to find contact photo"); } return img; }
@Override public CallerInfo findSelfInfo(Context ctxt) { CallerInfo callerInfo = new CallerInfo(); String[] projection = new String[] {Profile._ID, Profile.DISPLAY_NAME, Profile.PHOTO_ID, Profile.PHOTO_URI}; Cursor cursor = ctxt.getContentResolver() .query(ContactsContract.Profile.CONTENT_URI, projection, null, null, null); if (cursor != null) { try { if (cursor.getCount() > 0) { cursor.moveToFirst(); ContentValues cv = new ContentValues(); DatabaseUtils.cursorRowToContentValues(cursor, cv); callerInfo.contactExists = true; if (cv.containsKey(Profile.DISPLAY_NAME)) { callerInfo.name = cv.getAsString(Profile.DISPLAY_NAME); } if (cv.containsKey(Profile._ID)) { callerInfo.personId = cv.getAsLong(Profile._ID); callerInfo.contactContentUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, callerInfo.personId); } if (cv.containsKey(Profile.PHOTO_ID)) { Long photoId = cv.getAsLong(Profile.PHOTO_ID); if (photoId != null) { callerInfo.photoId = photoId; } } if (cv.containsKey(Profile.PHOTO_URI)) { String photoUri = cv.getAsString(Profile.PHOTO_URI); if (!TextUtils.isEmpty(photoUri)) { callerInfo.photoUri = Uri.parse(photoUri); } } if (callerInfo.name != null && callerInfo.name.length() == 0) { callerInfo.name = null; } } } catch (Exception e) { Log.e(THIS_FILE, "Exception while retrieving cursor infos", e); } finally { cursor.close(); } } return callerInfo; }
public void setBluetoothOn(boolean on) throws SameThreadException { Log.d(THIS_FILE, "Set BT " + on); if (service != null && restartAudioWhenRoutingChange && !ringer.isRinging()) { service.setNoSnd(); userWantBluetooth = on; service.setSnd(); } else { userWantBluetooth = on; bluetoothWrapper.setBluetoothOn(on); } broadcastMediaChanged(); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); resetInternals(); // Sanity check if (TextUtils.isEmpty(getPhoneNumber())) { Log.e(THIS_FILE, "No number detected for : " + getIntent().getAction()); finish(); return; } setContentView(R.layout.outgoing_call_view); connectService(); }
/** * Hide a preference from the screen so that user can't see and modify it * * @param parent the parent group preference if any, leave null if preference is a root pref * @param fieldName the preference key name to hide */ public void hidePreference(String parent, String fieldName) { PreferenceScreen pfs = getPreferenceScreen(); PreferenceGroup parentPref = pfs; if (parent != null) { parentPref = (PreferenceGroup) pfs.findPreference(parent); } Preference toRemovePref = pfs.findPreference(fieldName); if (toRemovePref != null && parentPref != null) { parentPref.removePreference(toRemovePref); } else { Log.w("Generic prefs", "Not able to find" + parent + " " + fieldName); } }
private void sendMessage() { if (service != null) { SipProfile acc = accountChooserButton.getSelectedAccount(); if (acc != null && acc.id != SipProfile.INVALID_ID) { try { String textToSend = bodyInput.getText().toString(); if (!TextUtils.isEmpty(textToSend)) { service.sendMessage(textToSend, remoteFrom, (int) acc.id); bodyInput.getText().clear(); } } catch (RemoteException e) { Log.e(THIS_FILE, "Not able to send message"); } } } }
@Override public void onTrigger(int keyCode, int dialTone) { if (dialPadTextView != null) { // Update text view KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); char nbr = event.getNumber(); StringBuilder sb = new StringBuilder(dialPadTextView.getText()); sb.append(nbr); dialPadTextView.setText(sb.toString()); } if (getSherlockActivity() instanceof OnDtmfListener) { Integer callId = getArguments().getInt(EXTRA_CALL_ID); if (callId != null) { ((OnDtmfListener) getSherlockActivity()).OnDtmf(callId, keyCode, dialTone); } else { Log.w(THIS_FILE, "Impossible to find the call associated to this view"); } } }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(THIS_FILE, "On activity result"); if (requestCode == PICKUP_SIP_URI) { if (resultCode == Activity.RESULT_OK) { String from = data.getStringExtra(Intent.EXTRA_PHONE_NUMBER); setupFrom(from, from); } if (TextUtils.isEmpty(remoteFrom)) { if (quitListener != null) { quitListener.onQuit(); } } else { loadMessageContent(); } return; } super.onActivityResult(requestCode, resultCode, data); }
@Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info; try { info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); long id = info.id; int selId = item.getItemId(); if (id >= 0 && selId == MENU_ITEM_DELETE) { getContentResolver() .delete(ContentUris.withAppendedId(SipManager.FILTER_ID_URI_BASE, id), null, null); cursor.requery(); return true; } } catch (ClassCastException e) { Log.e(THIS_FILE, "bad menuInfo", e); } return super.onContextItemSelected(item); }
@Override @SuppressWarnings("unchecked") public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info; try { info = (AdapterView.AdapterContextMenuInfo) menuInfo; } catch (ClassCastException e) { Log.e(THIS_FILE, "bad menuInfo", e); return; } HashMap<String, Object> codec = (HashMap<String, Object>) mAdapter.getItem(info.position); if (codec == null) { // If for some reason the requested item isn't available, do nothing return; } boolean isDisabled = ((Short) codec.get(CODEC_PRIORITY) == 0); menu.add(0, MENU_ITEM_ACTIVATE, 0, isDisabled ? R.string.activate : R.string.deactivate); }
public void fillLayout(final SipProfile account) { bindFields(); accountDisplayName.setText(account.display_name); accountAccId.setText(account.acc_id); accountRegUri.setText(account.reg_uri); accountRealm.setText(account.realm); accountUserName.setText(account.username); accountData.setText(account.data); { String scheme = account.scheme; if (scheme != null && !scheme.equals("")) { accountScheme.setValue(scheme); } else { accountScheme.setValue(SipProfile.CRED_SCHEME_DIGEST); } } { int ctype = account.datatype; if (ctype == SipProfile.CRED_DATA_PLAIN_PASSWD) { accountDataType.setValueIndex(0); } else if (ctype == SipProfile.CRED_DATA_DIGEST) { accountDataType.setValueIndex(1); } // DISABLED SINCE NOT SUPPORTED YET /* else if (ctype ==SipProfile.CRED_CRED_DATA_EXT_AKA) { accountDataType.setValueIndex(2); } */ else { accountDataType.setValueIndex(0); } } accountInitAuth.setChecked(account.initial_auth); accountAuthAlgo.setText(account.auth_algo); accountTransport.setValue(account.transport.toString()); if (!TextUtils.isEmpty(account.default_uri_scheme)) { accountDefaultUriScheme.setValue(account.default_uri_scheme); } accountPublishEnabled.setChecked((account.publish_enabled == 1)); accountRegTimeout.setText(Long.toString(account.reg_timeout)); accountRegDelayRefresh.setText(Long.toString(account.reg_delay_before_refresh)); accountForceContact.setText(account.force_contact); accountAllowContactRewrite.setChecked(account.allow_contact_rewrite); accountAllowViaRewrite.setChecked(account.allow_via_rewrite); accountContactRewriteMethod.setValue(Integer.toString(account.contact_rewrite_method)); if (account.proxies != null) { accountProxy.setText(TextUtils.join(SipProfile.PROXIES_SEPARATOR, account.proxies)); } else { accountProxy.setText(""); } Log.d(THIS_FILE, "use srtp : " + account.use_srtp); accountUseSrtp.setValueIndex(account.use_srtp + 1); accountUseZrtp.setValueIndex(account.use_zrtp + 1); useRfc5626.setChecked(account.use_rfc5626); rfc5626_instanceId.setText(account.rfc5626_instance_id); rfc5626_regId.setText(account.rfc5626_reg_id); rtpEnableQos.setValue(Integer.toString(account.rtp_enable_qos)); rtpQosDscp.setText(Integer.toString(account.rtp_qos_dscp)); rtpPort.setText(Integer.toString(account.rtp_port)); rtpBoundAddr.setText(account.rtp_bound_addr); rtpPublicAddr.setText(account.rtp_public_addr); vidInAutoShow.setValue(Integer.toString(account.vid_in_auto_show)); vidOutAutoTransmit.setValue(Integer.toString(account.vid_out_auto_transmit)); accountVm.setText(account.vm_nbr); mwiEnabled.setChecked(account.mwi_enabled); tryCleanRegisters.setChecked(account.try_clean_registers != 0); sipStunUse.setValue(Integer.toString(account.sip_stun_use)); mediaStunUse.setValue(Integer.toString(account.media_stun_use)); iceCfgUse.setChecked(account.ice_cfg_use == 1); iceCfgEnable.setChecked(account.ice_cfg_enable == 1); turnCfgUse.setChecked(account.turn_cfg_use == 1); turnCfgEnable.setChecked(account.turn_cfg_enable == 1); turnCfgServer.setText(account.turn_cfg_server); turnCfgUser.setText(account.turn_cfg_user); turnCfgPassword.setText(account.turn_cfg_password); ipv6MediaEnable.setChecked(account.ipv6_media_use == 1); }
@Override public void onReceive(Context context, Intent intent) { PreferencesProviderWrapper prefWrapper = new PreferencesProviderWrapper(context); String intentAction = intent.getAction(); // // ACTION_DATA_STATE_CHANGED // Data state change is used to detect changes in the mobile // network such as a switch of network type (GPRS, EDGE, 3G) // which are not detected by the Connectivity changed broadcast. // // // ACTION_CONNECTIVITY_CHANGED // Connectivity change is used to detect changes in the overall // data network status as well as a switch between wifi and mobile // networks. // if ( /*intentAction.equals(ACTION_DATA_STATE_CHANGED) ||*/ intentAction.equals(ConnectivityManager.CONNECTIVITY_ACTION) || intentAction.equals(Intent.ACTION_BOOT_COMPLETED)) { if (prefWrapper.isValidConnectionForIncoming() && !prefWrapper.getPreferenceBooleanValue(PreferencesProviderWrapper.HAS_BEEN_QUIT)) { Log.d(THIS_FILE, "Try to start service if not already started"); Intent sip_service_intent = new Intent(context, SipService.class); context.startService(sip_service_intent); } } else if (intentAction.equals(SipManager.INTENT_SIP_ACCOUNT_ACTIVATE)) { context.enforceCallingOrSelfPermission(SipManager.PERMISSION_CONFIGURE_SIP, null); long accId; accId = intent.getLongExtra(SipProfile.FIELD_ID, SipProfile.INVALID_ID); if (accId == SipProfile.INVALID_ID) { // allow remote side to send us integers. // previous call will warn, but that's fine, no worries accId = intent.getIntExtra(SipProfile.FIELD_ID, (int) SipProfile.INVALID_ID); } if (accId != SipProfile.INVALID_ID) { boolean active = intent.getBooleanExtra(SipProfile.FIELD_ACTIVE, true); ContentValues cv = new ContentValues(); cv.put(SipProfile.FIELD_ACTIVE, active); int done = context .getContentResolver() .update( ContentUris.withAppendedId(SipProfile.ACCOUNT_ID_URI_BASE, accId), cv, null, null); if (done > 0) { if (prefWrapper.isValidConnectionForIncoming()) { Intent sipServiceIntent = new Intent(context, SipService.class); context.startService(sipServiceIntent); } } } } else if (Intent.ACTION_PACKAGE_ADDED.equalsIgnoreCase(intentAction) || Intent.ACTION_PACKAGE_REMOVED.equalsIgnoreCase(intentAction)) { CallHandlerPlugin.clearAvailableCallHandlers(); RewriterPlugin.clearAvailableRewriters(); ExtraPlugins.clearDynPlugins(); PhoneCapabilityTester.deinit(); } else if (APPLY_NIGHTLY_UPLOAD.equals(intentAction)) { NightlyUpdater nu = new NightlyUpdater(context); nu.applyUpdate(intent); } }
/** Set the audio mode as in call */ @SuppressWarnings("deprecation") private synchronized void actualSetAudioInCall() { // Ensure not already set if (isSetAudioMode) { return; } stopRing(); saveAudioState(); // Set the rest of the phone in a better state to not interferate with // current call // Do that only if we were not already in silent mode /* * Not needed anymore with on flight gsm call capture * if(audioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT) { * audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, * AudioManager.VIBRATE_SETTING_ON); * audioManager.setVibrateSetting(AudioManager * .VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_OFF); * audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); } */ // LOCKS // Wifi management if necessary ContentResolver ctntResolver = service.getContentResolver(); Settings.System.putInt( ctntResolver, Settings.System.WIFI_SLEEP_POLICY, Settings.System.WIFI_SLEEP_POLICY_NEVER); // Acquire wifi lock WifiManager wman = (WifiManager) service.getSystemService(Context.WIFI_SERVICE); if (wifiLock == null) { wifiLock = wman.createWifiLock( (Compatibility.isCompatible(9)) ? WifiManager.WIFI_MODE_FULL_HIGH_PERF : WifiManager.WIFI_MODE_FULL, "com.csipsimple.InCallLock"); wifiLock.setReferenceCounted(false); } WifiInfo winfo = wman.getConnectionInfo(); if (winfo != null) { DetailedState dstate = WifiInfo.getDetailedStateOf(winfo.getSupplicantState()); // We assume that if obtaining ip addr, we are almost connected so // can keep wifi lock if (dstate == DetailedState.OBTAINING_IPADDR || dstate == DetailedState.CONNECTED) { if (!wifiLock.isHeld()) { wifiLock.acquire(); } } // This wake lock purpose is to prevent PSP wifi mode if (service.getPrefs().getPreferenceBooleanValue(SipConfigManager.KEEP_AWAKE_IN_CALL)) { if (screenLock == null) { PowerManager pm = (PowerManager) service.getSystemService(Context.POWER_SERVICE); screenLock = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "com.csipsimple.onIncomingCall.SCREEN"); screenLock.setReferenceCounted(false); } // Ensure single lock if (!screenLock.isHeld()) { screenLock.acquire(); } } } if (!useWebRTCImpl) { // Audio routing int targetMode = getAudioTargetMode(); Log.d(THIS_FILE, "Set mode audio in call to " + targetMode); if (service.getPrefs().generateForSetCall()) { boolean needOutOfSilent = (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT); if (needOutOfSilent) { audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_VOICE_CALL, 1); toneGenerator.startTone(41 /* ToneGenerator.TONE_CDMA_CONFIRM */); toneGenerator.stopTone(); toneGenerator.release(); // Restore silent mode if (needOutOfSilent) { audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); } } // Set mode if (targetMode != AudioManager.MODE_IN_CALL && useSgsWrkAround) { // For galaxy S we need to set in call mode before to reset // stack audioManager.setMode(AudioManager.MODE_IN_CALL); } audioManager.setMode(targetMode); // Routing if (service.getPrefs().useRoutingApi()) { audioManager.setRouting( targetMode, userWantSpeaker ? AudioManager.ROUTE_SPEAKER : AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); } else { audioManager.setSpeakerphoneOn(userWantSpeaker ? true : false); } audioManager.setMicrophoneMute(false); if (bluetoothWrapper != null && userWantBluetooth && bluetoothWrapper.canBluetooth()) { Log.d(THIS_FILE, "Try to enable bluetooth"); bluetoothWrapper.setBluetoothOn(true); } } else { // WebRTC implementation for routing int apiLevel = Compatibility.getApiLevel(); // SetAudioMode // ***IMPORTANT*** When the API level for honeycomb (H) has been // decided, // the condition should be changed to include API level 8 to H-1. if (android.os.Build.BRAND.equalsIgnoreCase("Samsung") && (8 == apiLevel)) { // Set Samsung specific VoIP mode for 2.2 devices int mode = 4; audioManager.setMode(mode); if (audioManager.getMode() != mode) { Log.e(THIS_FILE, "Could not set audio mode for Samsung device"); } } // SetPlayoutSpeaker if ((3 == apiLevel) || (4 == apiLevel)) { // 1.5 and 1.6 devices if (userWantSpeaker) { // route audio to back speaker audioManager.setMode(AudioManager.MODE_NORMAL); } else { // route audio to earpiece audioManager.setMode(AudioManager.MODE_IN_CALL); } } else { // 2.x devices if ((android.os.Build.BRAND.equalsIgnoreCase("samsung")) && ((5 == apiLevel) || (6 == apiLevel) || (7 == apiLevel))) { // Samsung 2.0, 2.0.1 and 2.1 devices if (userWantSpeaker) { // route audio to back speaker audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(userWantSpeaker); } else { // route audio to earpiece audioManager.setSpeakerphoneOn(userWantSpeaker); audioManager.setMode(AudioManager.MODE_NORMAL); } } else { // Non-Samsung and Samsung 2.2 and up devices audioManager.setSpeakerphoneOn(userWantSpeaker); } } } // Set stream solo/volume/focus int inCallStream = Compatibility.getInCallStream(userWantBluetooth); if (doFocusAudio) { if (!accessibilityManager.isEnabled()) { audioManager.setStreamSolo(inCallStream, true); } audioFocusWrapper.focus(userWantBluetooth); } Log.d(THIS_FILE, "Initial volume level : " + service.getPrefs().getInitialVolumeLevel()); setStreamVolume( inCallStream, (int) (audioManager.getStreamMaxVolume(inCallStream) * service.getPrefs().getInitialVolumeLevel()), 0); isSetAudioMode = true; // System.gc(); }
@Override public void run() { Log.d(THIS_FILE, "InCallTonePlayer.run(toneId = " + mToneId + ")..."); int toneType; // passed to ToneGenerator.startTone() int toneVolume; // passed to the ToneGenerator constructor int toneLengthMillis; switch (mToneId) { case TONE_CALL_WAITING: toneType = ToneGenerator.TONE_SUP_CALL_WAITING; toneVolume = TONE_RELATIVE_VOLUME_HIPRI; toneLengthMillis = 5000; break; case TONE_BUSY: toneType = ToneGenerator.TONE_SUP_BUSY; toneVolume = TONE_RELATIVE_VOLUME_HIPRI; toneLengthMillis = 4000; break; case TONE_CONGESTION: toneType = ToneGenerator.TONE_SUP_CONGESTION; toneVolume = TONE_RELATIVE_VOLUME_HIPRI; toneLengthMillis = 4000; break; case TONE_BATTERY_LOW: // For now, use ToneGenerator.TONE_PROP_ACK (two quick // beeps). TODO: is there some other ToneGenerator // tone that would be more appropriate here? Or // should we consider adding a new custom tone? toneType = ToneGenerator.TONE_PROP_ACK; toneVolume = TONE_RELATIVE_VOLUME_HIPRI; toneLengthMillis = 1000; break; case TONE_CALL_ENDED: toneType = ToneGenerator.TONE_PROP_PROMPT; toneVolume = TONE_RELATIVE_VOLUME_LOPRI; toneLengthMillis = 2000; break; default: throw new IllegalArgumentException("Bad toneId: " + mToneId); } // If the mToneGenerator creation fails, just continue without it. // It is // a local audio signal, and is not as important. ToneGenerator toneGenerator; try { toneGenerator = new ToneGenerator(AudioManager.STREAM_VOICE_CALL, toneVolume); // if (DBG) log("- created toneGenerator: " + toneGenerator); } catch (RuntimeException e) { Log.w(THIS_FILE, "InCallTonePlayer: Exception caught while creating ToneGenerator: " + e); toneGenerator = null; } // Using the ToneGenerator (with the CALL_WAITING / BUSY / // CONGESTION tones at least), the ToneGenerator itself knows // the right pattern of tones to play; we do NOT need to // manually start/stop each individual tone, or manually // insert the correct delay between tones. (We just start it // and let it run for however long we want the tone pattern to // continue.) // // TODO: When we stop the ToneGenerator in the middle of a // "tone pattern", it sounds bad if we cut if off while the // tone is actually playing. Consider adding API to the // ToneGenerator to say "stop at the next silent part of the // pattern", or simply "play the pattern N times and then // stop." if (toneGenerator != null) { toneGenerator.startTone(toneType); SystemClock.sleep(toneLengthMillis); toneGenerator.stopTone(); Log.v(THIS_FILE, "- InCallTonePlayer: done playing."); toneGenerator.release(); } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = getIntent().getExtras(); if (extras != null) { accountId = extras.getLong(SipProfile.FIELD_ID, -1); } if (accountId == -1) { Log.e(THIS_FILE, "You provide an empty account id...."); finish(); } // Custom title listing the account name for filters // final boolean customTitleOk = // requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.filters_list); /* * if(customTitleOk) { * getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, * R.layout.account_filters_title); final TextView titleText = * (TextView) findViewById(R.id.account_filters_title); if (titleText != * null) { SipProfile acct = SipProfile.getProfileFromDbId(this, * accountId, new String[] {SipProfile.FIELD_ID, * SipProfile.FIELD_DISPLAY_NAME}); * titleText.setText(R.string.filters_for); titleText.append(" " + * acct.display_name); } } */ database = new DBAdapter(this); database.open(); // Add add row TextView add_row = (TextView) findViewById(R.id.add_filter); add_row.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { editFilterActivity(-1); } }); cursor = database.getFiltersForAccount(accountId); if (cursor != null) { startManagingCursor(cursor); } CursorAdapter adapter = new FiltersCursorAdapter(this, cursor); setListAdapter(adapter); DragnDropListView listView = (DragnDropListView) getListView(); listView.setOnDropListener( new DropListener() { @Override public void drop(int from, int to) { // Update priorities CursorAdapter ad = (CursorAdapter) getListAdapter(); int numRows = ad.getCount(); for (int i = 0; i < numRows; i++) { // Log.d(THIS_FILE, "i= "+i+" from ="+from+" to="+to); if (i != from) { if (from > i && i >= to) { updateFilterPriority(ad.getItemId(i), i + 1); } else if (from < i && i <= to) { updateFilterPriority(ad.getItemId(i), i - 1); } else { updateFilterPriority(ad.getItemId(i), i); } } else { updateFilterPriority(ad.getItemId(from), to); } } cursor.requery(); } }); listView.setOnCreateContextMenuListener(this); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(THIS_FILE, "Upgrading database from version " + oldVersion + " to " + newVersion); if (oldVersion < 1) { db.execSQL("DROP TABLE IF EXISTS " + SipProfile.ACCOUNTS_TABLE_NAME); } if (oldVersion < 5) { try { db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_KA_INTERVAL + " INTEGER"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 6) { db.execSQL("DROP TABLE IF EXISTS " + SipManager.FILTERS_TABLE_NAME); } if (oldVersion < 10) { try { db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_ALLOW_CONTACT_REWRITE + " INTEGER"); db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_CONTACT_REWRITE_METHOD + " INTEGER"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 13) { try { db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_TRANSPORT + " INTEGER"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRANSPORT + "=" + SipProfile.TRANSPORT_UDP + " WHERE prevent_tcp=1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRANSPORT + "=" + SipProfile.TRANSPORT_TCP + " WHERE use_tcp=1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRANSPORT + "=" + SipProfile.TRANSPORT_AUTO + " WHERE use_tcp=0 AND prevent_tcp=0"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 17) { try { db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_KA_INTERVAL + "=0"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 18) { try { // As many users are crying... remove auto transport and force udp db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRANSPORT + "=" + SipProfile.TRANSPORT_UDP + " WHERE " + SipProfile.FIELD_TRANSPORT + "=" + SipProfile.TRANSPORT_AUTO); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 22) { try { // Add use proxy row db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_REG_USE_PROXY + " INTEGER"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_REG_USE_PROXY + "=3"); // Add stack field db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_SIP_STACK + " INTEGER"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_SIP_STACK + "=0"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 23) { try { // Add use zrtp row db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_USE_ZRTP + " INTEGER"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_USE_ZRTP + "=-1"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 24) { try { // Add voice mail row db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_VOICE_MAIL_NBR + " TEXT"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_VOICE_MAIL_NBR + "=''"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 25) { try { // Add voice mail row db.execSQL( "ALTER TABLE " + SipMessage.MESSAGES_TABLE_NAME + " ADD " + SipMessage.FIELD_FROM_FULL + " TEXT"); db.execSQL( "UPDATE " + SipMessage.MESSAGES_TABLE_NAME + " SET " + SipMessage.FIELD_FROM_FULL + "=" + SipMessage.FIELD_FROM); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 26) { try { // Add reg delay before refresh row addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_REG_DELAY_BEFORE_REFRESH, "INTEGER DEFAULT -1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_REG_DELAY_BEFORE_REFRESH + "=-1"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 27) { try { // Add reg delay before refresh row addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_TRY_CLEAN_REGISTERS, "INTEGER DEFAULT 0"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRY_CLEAN_REGISTERS + "=0"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 28) { try { // Add call log profile id addColumn( db, SipManager.CALLLOGS_TABLE_NAME, SipManager.CALLLOG_PROFILE_ID_FIELD, "INTEGER"); // Add call log status code addColumn( db, SipManager.CALLLOGS_TABLE_NAME, SipManager.CALLLOG_STATUS_CODE_FIELD, "INTEGER"); db.execSQL( "UPDATE " + SipManager.CALLLOGS_TABLE_NAME + " SET " + SipManager.CALLLOG_STATUS_CODE_FIELD + "=200"); // Add call log status text addColumn( db, SipManager.CALLLOGS_TABLE_NAME, SipManager.CALLLOG_STATUS_TEXT_FIELD, "TEXT"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 30) { try { // Add reg delay before refresh row addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_USE_RFC5626, "INTEGER DEFAULT 1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RFC5626_INSTANCE_ID, "TEXT"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RFC5626_REG_ID, "TEXT"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_VID_IN_AUTO_SHOW, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_VID_OUT_AUTO_TRANSMIT, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RTP_PORT, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RTP_ENABLE_QOS, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RTP_QOS_DSCP, "INTEGER DEFAULT -1"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RTP_PUBLIC_ADDR, "TEXT"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_RTP_BOUND_ADDR, "TEXT"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } // Nightly build bug -- restore mime type field to mime_type if (oldVersion == 30) { try { addColumn(db, SipMessage.MESSAGES_TABLE_NAME, SipMessage.FIELD_MIME_TYPE, "TEXT"); db.execSQL( "UPDATE " + SipMessage.MESSAGES_TABLE_NAME + " SET " + SipMessage.FIELD_MIME_TYPE + "='text/plain'"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 32) { try { // Add android group for buddy list addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_ANDROID_GROUP, "TEXT"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 33) { try { addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_ALLOW_VIA_REWRITE, "INTEGER DEFAULT 0"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_ALLOW_VIA_REWRITE + "=0"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 34) { try { addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_SIP_STUN_USE, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_MEDIA_STUN_USE, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_ICE_CFG_USE, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_ICE_CFG_ENABLE, "INTEGER DEFAULT 0"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_TURN_CFG_USE, "INTEGER DEFAULT -1"); addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_TURN_CFG_ENABLE, "INTEGER DEFAULT 0"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_TURN_CFG_SERVER, "TEXT"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_TURN_CFG_USER, "TEXT"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_TURN_CFG_PASSWORD, "TEXT"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_SIP_STUN_USE + "=-1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_MEDIA_STUN_USE + "=-1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_ICE_CFG_USE + "=-1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_ICE_CFG_ENABLE + "=0"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TURN_CFG_USE + "=-1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TURN_CFG_ENABLE + "=0"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 35) { try { addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_IPV6_MEDIA_USE, "INTEGER DEFAULT 0"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_IPV6_MEDIA_USE + "=0"); Log.d(THIS_FILE, "Upgrade done"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 36) { try { // Enable try to clean register for all but ones that doesn't support contact rewrite // normal (legacy) db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRY_CLEAN_REGISTERS + "=1 WHERE 1"); db.execSQL( "UPDATE " + SipProfile.ACCOUNTS_TABLE_NAME + " SET " + SipProfile.FIELD_TRY_CLEAN_REGISTERS + "=0 WHERE " + SipProfile.FIELD_CONTACT_REWRITE_METHOD + "=1"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 37) { try { addColumn( db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_AUTH_INITIAL_AUTH, "INTEGER DEFAULT 0"); addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_AUTH_ALGO, "TEXT"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 38) { try { addColumn(db, SipProfile.ACCOUNTS_TABLE_NAME, SipProfile.FIELD_WIZARD_DATA, "TEXT"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } if (oldVersion < 39) { try { db.execSQL( "ALTER TABLE " + SipProfile.ACCOUNTS_TABLE_NAME + " ADD " + SipProfile.FIELD_DEFAULT_URI_SCHEME + " TEXT"); } catch (SQLiteException e) { Log.e(THIS_FILE, "Upgrade fail... maybe a crappy rom...", e); } } onCreate(db); }
@Override public void onResume() { Log.d(THIS_FILE, "Resume compose message act"); super.onResume(); notifications.setViewingMessageFrom(remoteFrom); }