/******************************************************************************* * Software Name : RCS IMS Stack * * Copyright (C) 2010 France Telecom S.A. * * 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.orangelabs.rcs.provisioning.local; import static com.orangelabs.rcs.provisioning.local.Provisioning.saveCheckBoxParameter; import static com.orangelabs.rcs.provisioning.local.Provisioning.saveEditTextParameter; import static com.orangelabs.rcs.provisioning.local.Provisioning.setCheckBoxParameter; import static com.orangelabs.rcs.provisioning.local.Provisioning.setEditTextParameter; import java.io.File; import java.io.FilenameFilter; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import android.widget.Toast; import com.orangelabs.rcs.R; import com.orangelabs.rcs.provider.settings.RcsSettings; import com.orangelabs.rcs.provider.settings.RcsSettingsData; import com.orangelabs.rcs.utils.logger.Logger; /** * Stack parameters provisioning File * * @author jexa7410 */ public class StackProvisioning extends Activity { /** * Folder path for certificate */ public static final String CERTIFICATE_FOLDER_PATH = Environment.getExternalStorageDirectory().getPath(); /** * Auto config mode */ private static final String[] AUTO_CONFIG = { "None", "HTTPS" }; /** * SIP protocol */ private static final String[] SIP_PROTOCOL = { "UDP", "TCP", "TLS" }; /** * Network access */ private static final String[] NETWORK_ACCESS = { "All networks", "Mobile only", "Wi-Fi only" }; /** * FT protocol */ private static final String[] FT_PROTOCOL = { RcsSettingsData.FT_PROTOCOL_HTTP, RcsSettingsData.FT_PROTOCOL_MSRP }; private boolean isInFront; @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); // Set layout setContentView(R.layout.rcs_provisioning_stack); // Set buttons callback Button btn = (Button) findViewById(R.id.save_btn); btn.setOnClickListener(saveBtnListener); updateView(bundle); isInFront = true; } @Override protected void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); saveInstanceState(bundle); } @Override public void onResume() { super.onResume(); if (isInFront == false) { isInFront = true; // Update UI (from DB) updateView(null); } } @Override protected void onPause() { super.onPause(); isInFront = false; } /** * Save parameters either in bundle or in RCS settings */ private void saveInstanceState(Bundle bundle) { Spinner spinner = (Spinner) findViewById(R.id.Autoconfig); if (bundle != null) { bundle.putInt(RcsSettingsData.AUTO_CONFIG_MODE, spinner.getSelectedItemPosition()); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.AUTO_CONFIG_MODE, "" + spinner.getSelectedItemPosition()); } spinner = (Spinner) findViewById(R.id.SipDefaultProtocolForMobile); if (bundle != null) { bundle.putString(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_MOBILE, (String) spinner.getSelectedItem()); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_MOBILE, (String) spinner.getSelectedItem()); } spinner = (Spinner) findViewById(R.id.SipDefaultProtocolForWifi); if (bundle != null) { bundle.putString(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_WIFI, (String) spinner.getSelectedItem()); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_WIFI, (String) spinner.getSelectedItem()); } saveCheckBoxParameter(this, R.id.TcpFallback, RcsSettingsData.KEY_TCP_FALLBACK, bundle); spinner = (Spinner) findViewById(R.id.TlsCertificateRoot); if (spinner.getSelectedItemPosition() == 0) { if (bundle != null) { bundle.putString(RcsSettingsData.TLS_CERTIFICATE_ROOT, ""); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.TLS_CERTIFICATE_ROOT, ""); } } else { String path = CERTIFICATE_FOLDER_PATH + File.separator + (String) spinner.getSelectedItem(); if (bundle != null) { bundle.putString(RcsSettingsData.TLS_CERTIFICATE_ROOT, path); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.TLS_CERTIFICATE_ROOT, path); } } spinner = (Spinner) findViewById(R.id.TlsCertificateIntermediate); if (spinner.getSelectedItemPosition() == 0) { if (bundle != null) { bundle.putString(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE, ""); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE, ""); } } else { String path = CERTIFICATE_FOLDER_PATH + File.separator + (String) spinner.getSelectedItem(); if (bundle != null) { bundle.putString(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE, path); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE, path); } } spinner = (Spinner) findViewById(R.id.NetworkAccess); int index = spinner.getSelectedItemPosition(); switch (index) { case 0: if (bundle != null) { bundle.putInt(RcsSettingsData.NETWORK_ACCESS, RcsSettingsData.ANY_ACCESS); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.NETWORK_ACCESS, "" + RcsSettingsData.ANY_ACCESS); } break; case 1: if (bundle != null) { bundle.putInt(RcsSettingsData.NETWORK_ACCESS, RcsSettingsData.MOBILE_ACCESS); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.NETWORK_ACCESS, "" + RcsSettingsData.MOBILE_ACCESS); } break; case 2: if (bundle != null) { bundle.putInt(RcsSettingsData.NETWORK_ACCESS, RcsSettingsData.WIFI_ACCESS); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.NETWORK_ACCESS, "" + RcsSettingsData.WIFI_ACCESS); } break; } spinner = (Spinner) findViewById(R.id.FtProtocol); if (bundle != null) { bundle.putString(RcsSettingsData.FT_PROTOCOL, (String) spinner.getSelectedItem()); } else { RcsSettings.getInstance().writeParameter(RcsSettingsData.FT_PROTOCOL, (String) spinner.getSelectedItem()); } saveEditTextParameter(this, R.id.SecondaryProvisioningAddress, RcsSettingsData.SECONDARY_PROVISIONING_ADDRESS, bundle); saveCheckBoxParameter(this, R.id.SecondaryProvisioningAddressOnly, RcsSettingsData.SECONDARY_PROVISIONING_ADDRESS_ONLY, bundle); saveEditTextParameter(this, R.id.SipListeningPort, RcsSettingsData.SIP_DEFAULT_PORT, bundle); saveEditTextParameter(this, R.id.SipTimerT1, RcsSettingsData.SIP_TIMER_T1, bundle); saveEditTextParameter(this, R.id.SipTimerT2, RcsSettingsData.SIP_TIMER_T2, bundle); saveEditTextParameter(this, R.id.SipTimerT4, RcsSettingsData.SIP_TIMER_T4, bundle); saveEditTextParameter(this, R.id.SipTransactionTimeout, RcsSettingsData.SIP_TRANSACTION_TIMEOUT, bundle); saveEditTextParameter(this, R.id.SipKeepAlivePeriod, RcsSettingsData.SIP_KEEP_ALIVE_PERIOD, bundle); saveEditTextParameter(this, R.id.DefaultMsrpPort, RcsSettingsData.MSRP_DEFAULT_PORT, bundle); saveEditTextParameter(this, R.id.DefaultRtpPort, RcsSettingsData.RTP_DEFAULT_PORT, bundle); saveEditTextParameter(this, R.id.MsrpTransactionTimeout, RcsSettingsData.MSRP_TRANSACTION_TIMEOUT, bundle); saveEditTextParameter(this, R.id.RegisterExpirePeriod, RcsSettingsData.REGISTER_EXPIRE_PERIOD, bundle); saveEditTextParameter(this, R.id.RegisterRetryBaseTime, RcsSettingsData.REGISTER_RETRY_BASE_TIME, bundle); saveEditTextParameter(this, R.id.RegisterRetryMaxTime, RcsSettingsData.REGISTER_RETRY_MAX_TIME, bundle); saveEditTextParameter(this, R.id.PublishExpirePeriod, RcsSettingsData.PUBLISH_EXPIRE_PERIOD, bundle); saveEditTextParameter(this, R.id.RevokeTimeout, RcsSettingsData.REVOKE_TIMEOUT, bundle); saveEditTextParameter(this, R.id.RingingPeriod, RcsSettingsData.RINGING_SESSION_PERIOD, bundle); saveEditTextParameter(this, R.id.SubscribeExpirePeriod, RcsSettingsData.SUBSCRIBE_EXPIRE_PERIOD, bundle); saveEditTextParameter(this, R.id.IsComposingTimeout, RcsSettingsData.IS_COMPOSING_TIMEOUT, bundle); saveEditTextParameter(this, R.id.SessionRefreshExpirePeriod, RcsSettingsData.SESSION_REFRESH_EXPIRE_PERIOD, bundle); saveEditTextParameter(this, R.id.CapabilityRefreshTimeout, RcsSettingsData.CAPABILITY_REFRESH_TIMEOUT, bundle); saveEditTextParameter(this, R.id.CapabilityExpiryTimeout, RcsSettingsData.CAPABILITY_EXPIRY_TIMEOUT, bundle); saveEditTextParameter(this, R.id.CapabilityPollingPeriod, RcsSettingsData.CAPABILITY_POLLING_PERIOD, bundle); saveCheckBoxParameter(this, R.id.SipKeepAlive, RcsSettingsData.SIP_KEEP_ALIVE, bundle); saveCheckBoxParameter(this, R.id.PermanentState, RcsSettingsData.PERMANENT_STATE_MODE, bundle); saveCheckBoxParameter(this, R.id.TelUriFormat, RcsSettingsData.TEL_URI_FORMAT, bundle); saveCheckBoxParameter(this, R.id.ImAlwaysOn, RcsSettingsData.IM_CAPABILITY_ALWAYS_ON, bundle); saveCheckBoxParameter(this, R.id.FtAlwaysOn, RcsSettingsData.FT_CAPABILITY_ALWAYS_ON, bundle); saveCheckBoxParameter(this, R.id.ImUseReports, RcsSettingsData.IM_USE_REPORTS, bundle); saveCheckBoxParameter(this, R.id.Gruu, RcsSettingsData.GRUU, bundle); saveCheckBoxParameter(this, R.id.CpuAlwaysOn, RcsSettingsData.CPU_ALWAYS_ON, bundle); saveCheckBoxParameter(this, R.id.SecureMsrpOverWifi, RcsSettingsData.SECURE_MSRP_OVER_WIFI, bundle); saveCheckBoxParameter(this, R.id.SecureRtpOverWifi, RcsSettingsData.SECURE_RTP_OVER_WIFI, bundle); saveCheckBoxParameter(this, R.id.ImeiAsDeviceId, RcsSettingsData.USE_IMEI_AS_DEVICE_ID, bundle); } /** * Update UI (upon creation, rotation, tab switch...) * * @param bundle */ private void updateView(Bundle bundle) { // Display stack parameters Spinner spinner = (Spinner) findViewById(R.id.Autoconfig); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, AUTO_CONFIG); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); int mode = 0; if (bundle != null && bundle.containsKey(RcsSettingsData.AUTO_CONFIG_MODE)) { mode = bundle.getInt(RcsSettingsData.AUTO_CONFIG_MODE); } else { mode = RcsSettings.getInstance().getAutoConfigMode(); } spinner.setSelection((mode == RcsSettingsData.HTTPS_AUTO_CONFIG) ? 1 : 0); setEditTextParameter(this, R.id.SecondaryProvisioningAddress, RcsSettingsData.SECONDARY_PROVISIONING_ADDRESS, bundle); setCheckBoxParameter(this, R.id.SecondaryProvisioningAddressOnly, RcsSettingsData.SECONDARY_PROVISIONING_ADDRESS_ONLY, bundle); spinner = (Spinner) findViewById(R.id.NetworkAccess); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, NETWORK_ACCESS); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); int access = 0; if (bundle != null && bundle.containsKey(RcsSettingsData.NETWORK_ACCESS)) { access = bundle.getInt(RcsSettingsData.NETWORK_ACCESS); } else { access = RcsSettings.getInstance().getNetworkAccess(); } if (access == RcsSettingsData.WIFI_ACCESS) { spinner.setSelection(2); } else if (access == RcsSettingsData.MOBILE_ACCESS) { spinner.setSelection(1); } else { spinner.setSelection(0); } spinner = (Spinner) findViewById(R.id.SipDefaultProtocolForMobile); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SIP_PROTOCOL); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); String sipMobile = null; if (bundle != null && bundle.containsKey(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_MOBILE)) { sipMobile = bundle.getString(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_MOBILE); } else { sipMobile = RcsSettings.getInstance().getSipDefaultProtocolForMobile(); } if (sipMobile.equalsIgnoreCase(SIP_PROTOCOL[0])) { spinner.setSelection(0); } else if (sipMobile.equalsIgnoreCase(SIP_PROTOCOL[1])) { spinner.setSelection(1); } else { spinner.setSelection(2); } spinner = (Spinner) findViewById(R.id.SipDefaultProtocolForWifi); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, SIP_PROTOCOL); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); String sipWifi = null; if (bundle != null && bundle.containsKey(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_WIFI)) { sipWifi = bundle.getString(RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_WIFI); } else { sipWifi = RcsSettings.getInstance().getSipDefaultProtocolForWifi(); } if (sipWifi.equalsIgnoreCase(SIP_PROTOCOL[0])) { spinner.setSelection(0); } else if (sipWifi.equalsIgnoreCase(SIP_PROTOCOL[1])) { spinner.setSelection(1); } else { spinner.setSelection(2); } setCheckBoxParameter(this, R.id.TcpFallback, RcsSettingsData.KEY_TCP_FALLBACK, bundle); String[] certificates = loadCertificatesList(); spinner = (Spinner) findViewById(R.id.TlsCertificateRoot); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, certificates); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); boolean found = false; String certRoot = null; if (bundle != null && bundle.containsKey(RcsSettingsData.TLS_CERTIFICATE_ROOT)) { certRoot = bundle.getString(RcsSettingsData.TLS_CERTIFICATE_ROOT); } else { certRoot = RcsSettings.getInstance().getTlsCertificateRoot(); } for (int i = 0; i < certificates.length; i++) { if (certRoot.contains(certificates[i])) { spinner.setSelection(i); found = true; } } if (!found) { spinner.setSelection(0); RcsSettings.getInstance().writeParameter(RcsSettingsData.TLS_CERTIFICATE_ROOT, ""); } spinner = (Spinner) findViewById(R.id.TlsCertificateIntermediate); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, certificates); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); spinner.setSelection(0); found = false; String certInt = null; if (bundle != null && bundle.containsKey(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE)) { certInt = bundle.getString(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE); } else { certInt = RcsSettings.getInstance().getTlsCertificateIntermediate(); } for (int i = 0; i < certificates.length; i++) { if (certInt.contains(certificates[i])) { spinner.setSelection(i); found = true; } } if (!found) { spinner.setSelection(0); RcsSettings.getInstance().writeParameter(RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE, ""); } spinner = (Spinner) findViewById(R.id.FtProtocol); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, FT_PROTOCOL); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); String ftProtocol = null; if (bundle != null && bundle.containsKey(RcsSettingsData.FT_PROTOCOL)) { ftProtocol = bundle.getString(RcsSettingsData.FT_PROTOCOL); } else { ftProtocol = RcsSettings.getInstance().getFtProtocol(); } if ((ftProtocol != null) && ftProtocol.equalsIgnoreCase(FT_PROTOCOL[0])) { spinner.setSelection(0); } else { spinner.setSelection(1); } setEditTextParameter(this, R.id.ImsServicePollingPeriod, RcsSettingsData.IMS_SERVICE_POLLING_PERIOD, bundle); setEditTextParameter(this, R.id.SipListeningPort, RcsSettingsData.SIP_DEFAULT_PORT, bundle); setEditTextParameter(this, R.id.SipTimerT1, RcsSettingsData.SIP_TIMER_T1, bundle); setEditTextParameter(this, R.id.SipTimerT2, RcsSettingsData.SIP_TIMER_T2, bundle); setEditTextParameter(this, R.id.SipTimerT4, RcsSettingsData.SIP_TIMER_T4, bundle); setEditTextParameter(this, R.id.SipTransactionTimeout, RcsSettingsData.SIP_TRANSACTION_TIMEOUT, bundle); setEditTextParameter(this, R.id.SipKeepAlivePeriod, RcsSettingsData.SIP_KEEP_ALIVE_PERIOD, bundle); setEditTextParameter(this, R.id.DefaultMsrpPort, RcsSettingsData.MSRP_DEFAULT_PORT, bundle); setEditTextParameter(this, R.id.DefaultRtpPort, RcsSettingsData.RTP_DEFAULT_PORT, bundle); setEditTextParameter(this, R.id.MsrpTransactionTimeout, RcsSettingsData.MSRP_TRANSACTION_TIMEOUT, bundle); setEditTextParameter(this, R.id.RegisterExpirePeriod, RcsSettingsData.REGISTER_EXPIRE_PERIOD, bundle); setEditTextParameter(this, R.id.RegisterRetryBaseTime, RcsSettingsData.REGISTER_RETRY_BASE_TIME, bundle); setEditTextParameter(this, R.id.RegisterRetryMaxTime, RcsSettingsData.REGISTER_RETRY_MAX_TIME, bundle); setEditTextParameter(this, R.id.PublishExpirePeriod, RcsSettingsData.PUBLISH_EXPIRE_PERIOD, bundle); setEditTextParameter(this, R.id.RevokeTimeout, RcsSettingsData.REVOKE_TIMEOUT, bundle); setEditTextParameter(this, R.id.RingingPeriod, RcsSettingsData.RINGING_SESSION_PERIOD, bundle); setEditTextParameter(this, R.id.SubscribeExpirePeriod, RcsSettingsData.SUBSCRIBE_EXPIRE_PERIOD, bundle); setEditTextParameter(this, R.id.IsComposingTimeout, RcsSettingsData.IS_COMPOSING_TIMEOUT, bundle); setEditTextParameter(this, R.id.SessionRefreshExpirePeriod, RcsSettingsData.SESSION_REFRESH_EXPIRE_PERIOD, bundle); setEditTextParameter(this, R.id.CapabilityRefreshTimeout, RcsSettingsData.CAPABILITY_REFRESH_TIMEOUT, bundle); setEditTextParameter(this, R.id.CapabilityExpiryTimeout, RcsSettingsData.CAPABILITY_EXPIRY_TIMEOUT, bundle); setEditTextParameter(this, R.id.CapabilityPollingPeriod, RcsSettingsData.CAPABILITY_POLLING_PERIOD, bundle); setCheckBoxParameter(this, R.id.SipKeepAlive, RcsSettingsData.SIP_KEEP_ALIVE, bundle); setCheckBoxParameter(this, R.id.PermanentState, RcsSettingsData.PERMANENT_STATE_MODE, bundle); setCheckBoxParameter(this, R.id.TelUriFormat, RcsSettingsData.TEL_URI_FORMAT, bundle); setCheckBoxParameter(this, R.id.ImAlwaysOn, RcsSettingsData.IM_CAPABILITY_ALWAYS_ON, bundle); setCheckBoxParameter(this, R.id.FtAlwaysOn, RcsSettingsData.FT_CAPABILITY_ALWAYS_ON, bundle); setCheckBoxParameter(this, R.id.ImUseReports, RcsSettingsData.IM_USE_REPORTS, bundle); setCheckBoxParameter(this, R.id.Gruu, RcsSettingsData.GRUU, bundle); setCheckBoxParameter(this, R.id.CpuAlwaysOn, RcsSettingsData.CPU_ALWAYS_ON, bundle); setCheckBoxParameter(this, R.id.SecureMsrpOverWifi, RcsSettingsData.SECURE_MSRP_OVER_WIFI, bundle); setCheckBoxParameter(this, R.id.SecureRtpOverWifi, RcsSettingsData.SECURE_RTP_OVER_WIFI, bundle); setCheckBoxParameter(this, R.id.ImeiAsDeviceId, RcsSettingsData.USE_IMEI_AS_DEVICE_ID, bundle); } /** * Save button listener */ private OnClickListener saveBtnListener = new OnClickListener() { public void onClick(View v) { // Save parameters saveInstanceState(null); Toast.makeText(StackProvisioning.this, getString(R.string.label_reboot_service), Toast.LENGTH_LONG).show(); } }; /** * Load a list of certificates from the SDCARD * * @return List of certificates */ private String[] loadCertificatesList() { String[] files = null; File folder = new File(CERTIFICATE_FOLDER_PATH); try { folder.mkdirs(); if (folder.exists()) { // filter FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String filename) { return filename.contains(RcsSettingsData.CERTIFICATE_FILE_TYPE); } }; files = folder.list(filter); } } catch (SecurityException e) { // intentionally blank } if (files == null) { // No certificate return new String[] { getString(R.string.label_no_certificate) }; } else { // Add certificates in the list String[] temp = new String[files.length + 1]; temp[0] = getString(R.string.label_no_certificate); if (files.length > 0) { System.arraycopy(files, 0, temp, 1, files.length); } return temp; } } }