/*******************************************************************************
* 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 static com.orangelabs.rcs.provisioning.local.Provisioning.setSpinnerParameter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
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.provisioning.ProvisioningParser;
import com.orangelabs.rcs.utils.logger.Logger;
/**
* End user profile parameters provisioning
*
* @author jexa7410
*/
public class ProfileProvisioning extends Activity {
/**
* IMS authentication for mobile access
*/
private static final String[] MOBILE_IMS_AUTHENT = { RcsSettingsData.GIBA_AUTHENT, RcsSettingsData.DIGEST_AUTHENT };
/**
* IMS authentication for Wi-Fi access
*/
private static final String[] WIFI_IMS_AUTHENT = { RcsSettingsData.DIGEST_AUTHENT };
/**
* IMS authentication for Wi-Fi access
*/
private static final String[] GSMA_RELEASE = { "Albatros", "Blackbird", "Crane" };
private static Logger logger = Logger.getLogger(ProfileProvisioning.class.getSimpleName());
private static final String PROVISIONING_EXTENSION = ".xml";
private String mInputedUserPhoneNumber = null;
private String mSelectedProvisioningFile = null;
private boolean isInFront;
/**
* Folder path for provisioning file
*/
private static final String PROVISIONING_FOLDER_PATH = Environment.getExternalStorageDirectory().getPath();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set layout
setContentView(R.layout.rcs_provisioning_profile);
// Set buttons callback
Button btn = (Button) findViewById(R.id.save_btn);
btn.setOnClickListener(saveBtnListener);
btn = (Button) findViewById(R.id.gen_btn);
btn.setOnClickListener(genBtnListener);
updateProfileProvisioningUI(savedInstanceState);
isInFront = true;
}
@Override
public void onResume() {
super.onResume();
if (isInFront == false) {
isInFront = true;
// Update UI (from DB)
updateProfileProvisioningUI(null);
}
}
@Override
protected void onPause() {
super.onPause();
isInFront = false;
}
/**
* Update Profile Provisioning UI
*
* @param bundle
* bundle to save parameters
*/
private void updateProfileProvisioningUI(Bundle bundle) {
// Display parameters
Spinner spinner = (Spinner) findViewById(R.id.ImsAuhtenticationProcedureForMobile);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(ProfileProvisioning.this, android.R.layout.simple_spinner_item,
MOBILE_IMS_AUTHENT);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
setSpinnerParameter(spinner, RcsSettingsData.IMS_AUTHENT_PROCEDURE_MOBILE, bundle, MOBILE_IMS_AUTHENT);
spinner = (Spinner) findViewById(R.id.ImsAuhtenticationProcedureForWifi);
adapter = new ArrayAdapter<String>(ProfileProvisioning.this, android.R.layout.simple_spinner_item, WIFI_IMS_AUTHENT);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(0);
setEditTextParameter(this, R.id.ImsUsername, RcsSettingsData.USERPROFILE_IMS_USERNAME, bundle);
setEditTextParameter(this, R.id.ImsDisplayName, RcsSettingsData.USERPROFILE_IMS_DISPLAY_NAME, bundle);
setEditTextParameter(this, R.id.ImsHomeDomain, RcsSettingsData.USERPROFILE_IMS_HOME_DOMAIN, bundle);
setEditTextParameter(this, R.id.ImsPrivateId, RcsSettingsData.USERPROFILE_IMS_PRIVATE_ID, bundle);
setEditTextParameter(this, R.id.ImsPassword, RcsSettingsData.USERPROFILE_IMS_PASSWORD, bundle);
setEditTextParameter(this, R.id.ImsRealm, RcsSettingsData.USERPROFILE_IMS_REALM, bundle);
setEditTextParameter(this, R.id.ImsOutboundProxyAddrForMobile, RcsSettingsData.IMS_PROXY_ADDR_MOBILE, bundle);
setEditTextParameter(this, R.id.ImsOutboundProxyPortForMobile, RcsSettingsData.IMS_PROXY_PORT_MOBILE, bundle);
setEditTextParameter(this, R.id.ImsOutboundProxyAddrForWifi, RcsSettingsData.IMS_PROXY_ADDR_WIFI, bundle);
setEditTextParameter(this, R.id.ImsOutboundProxyPortForWifi, RcsSettingsData.IMS_PROXY_PORT_WIFI, bundle);
setEditTextParameter(this, R.id.XdmServerAddr, RcsSettingsData.XDM_SERVER, bundle);
setEditTextParameter(this, R.id.XdmServerLogin, RcsSettingsData.XDM_LOGIN, bundle);
setEditTextParameter(this, R.id.XdmServerPassword, RcsSettingsData.XDM_PASSWORD, bundle);
setEditTextParameter(this, R.id.FtHttpServerAddr, RcsSettingsData.FT_HTTP_SERVER, bundle);
setEditTextParameter(this, R.id.FtHttpServerLogin, RcsSettingsData.FT_HTTP_LOGIN, bundle);
setEditTextParameter(this, R.id.FtHttpServerPassword, RcsSettingsData.FT_HTTP_PASSWORD, bundle);
setEditTextParameter(this, R.id.ImConferenceUri, RcsSettingsData.IM_CONF_URI, bundle);
setEditTextParameter(this, R.id.EndUserConfReqUri, RcsSettingsData.ENDUSER_CONFIRMATION_URI, bundle);
setEditTextParameter(this, R.id.RcsApn, RcsSettingsData.RCS_APN, bundle);
setEditTextParameter(this, R.id.CountryCode, RcsSettingsData.COUNTRY_CODE, bundle);
setEditTextParameter(this, R.id.CountryAreaCode, RcsSettingsData.COUNTRY_AREA_CODE, bundle);
setCheckBoxParameter(this, R.id.image_sharing, RcsSettingsData.CAPABILITY_IMAGE_SHARING, bundle);
setCheckBoxParameter(this, R.id.video_sharing, RcsSettingsData.CAPABILITY_VIDEO_SHARING, bundle);
setCheckBoxParameter(this, R.id.file_transfer, RcsSettingsData.CAPABILITY_FILE_TRANSFER, bundle);
setCheckBoxParameter(this, R.id.file_transfer_http, RcsSettingsData.CAPABILITY_FILE_TRANSFER_HTTP, bundle);
setCheckBoxParameter(this, R.id.im, RcsSettingsData.CAPABILITY_IM_SESSION, bundle);
setCheckBoxParameter(this, R.id.im_group, RcsSettingsData.CAPABILITY_IM_GROUP_SESSION, bundle);
setCheckBoxParameter(this, R.id.ipvoicecall, RcsSettingsData.CAPABILITY_IP_VOICE_CALL, bundle);
setCheckBoxParameter(this, R.id.ipvideocall, RcsSettingsData.CAPABILITY_IP_VIDEO_CALL, bundle);
setCheckBoxParameter(this, R.id.cs_video, RcsSettingsData.CAPABILITY_CS_VIDEO, bundle);
setCheckBoxParameter(this, R.id.presence_discovery, RcsSettingsData.CAPABILITY_PRESENCE_DISCOVERY, bundle);
setCheckBoxParameter(this, R.id.social_presence, RcsSettingsData.CAPABILITY_SOCIAL_PRESENCE, bundle);
setCheckBoxParameter(this, R.id.geolocation_push, RcsSettingsData.CAPABILITY_GEOLOCATION_PUSH, bundle);
setCheckBoxParameter(this, R.id.file_transfer_thumbnail, RcsSettingsData.CAPABILITY_FILE_TRANSFER_THUMBNAIL, bundle);
setCheckBoxParameter(this, R.id.file_transfer_sf, RcsSettingsData.CAPABILITY_FILE_TRANSFER_SF, bundle);
setCheckBoxParameter(this, R.id.group_chat_sf, RcsSettingsData.CAPABILITY_GROUP_CHAT_SF, bundle);
setCheckBoxParameter(this, R.id.sip_automata, RcsSettingsData.CAPABILITY_SIP_AUTOMATA, bundle);
TextView txt = (TextView) findViewById(R.id.release);
txt.setText(GSMA_RELEASE[RcsSettings.getInstance().getGsmaRelease() % GSMA_RELEASE.length]);
}
/**
* Save button listener
*/
private OnClickListener saveBtnListener = new OnClickListener() {
public void onClick(View v) {
// Save parameters
saveInstanceState(null);
Toast.makeText(ProfileProvisioning.this, getString(R.string.label_reboot_service), Toast.LENGTH_LONG).show();
}
};
@Override
protected void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
saveInstanceState(bundle);
}
/**
* Save parameters either in bundle or in RCS settings
*/
private void saveInstanceState(Bundle bundle) {
Spinner spinner = (Spinner) findViewById(R.id.ImsAuhtenticationProcedureForMobile);
if (bundle != null) {
bundle.putInt(RcsSettingsData.IMS_AUTHENT_PROCEDURE_MOBILE, spinner.getSelectedItemPosition());
} else {
RcsSettings.getInstance().writeParameter(RcsSettingsData.IMS_AUTHENT_PROCEDURE_MOBILE,
(String) spinner.getSelectedItem());
}
spinner = (Spinner) findViewById(R.id.ImsAuhtenticationProcedureForWifi);
if (bundle != null) {
bundle.putInt(RcsSettingsData.IMS_AUTHENT_PROCEDURE_WIFI, spinner.getSelectedItemPosition());
} else {
RcsSettings.getInstance()
.writeParameter(RcsSettingsData.IMS_AUTHENT_PROCEDURE_WIFI, (String) spinner.getSelectedItem());
}
saveEditTextParameter(this, R.id.ImsUsername, RcsSettingsData.USERPROFILE_IMS_USERNAME, bundle);
saveEditTextParameter(this, R.id.ImsDisplayName, RcsSettingsData.USERPROFILE_IMS_DISPLAY_NAME, bundle);
saveEditTextParameter(this, R.id.ImsHomeDomain, RcsSettingsData.USERPROFILE_IMS_HOME_DOMAIN, bundle);
saveEditTextParameter(this, R.id.ImsPrivateId, RcsSettingsData.USERPROFILE_IMS_PRIVATE_ID, bundle);
saveEditTextParameter(this, R.id.ImsPassword, RcsSettingsData.USERPROFILE_IMS_PASSWORD, bundle);
saveEditTextParameter(this, R.id.ImsRealm, RcsSettingsData.USERPROFILE_IMS_REALM, bundle);
saveEditTextParameter(this, R.id.ImsOutboundProxyAddrForMobile, RcsSettingsData.IMS_PROXY_ADDR_MOBILE, bundle);
saveEditTextParameter(this, R.id.ImsOutboundProxyPortForMobile, RcsSettingsData.IMS_PROXY_PORT_MOBILE, bundle);
saveEditTextParameter(this, R.id.ImsOutboundProxyAddrForWifi, RcsSettingsData.IMS_PROXY_ADDR_WIFI, bundle);
saveEditTextParameter(this, R.id.ImsOutboundProxyPortForWifi, RcsSettingsData.IMS_PROXY_PORT_WIFI, bundle);
saveEditTextParameter(this, R.id.XdmServerAddr, RcsSettingsData.XDM_SERVER, bundle);
saveEditTextParameter(this, R.id.XdmServerLogin, RcsSettingsData.XDM_LOGIN, bundle);
saveEditTextParameter(this, R.id.XdmServerPassword, RcsSettingsData.XDM_PASSWORD, bundle);
saveEditTextParameter(this, R.id.FtHttpServerAddr, RcsSettingsData.FT_HTTP_SERVER, bundle);
saveEditTextParameter(this, R.id.FtHttpServerLogin, RcsSettingsData.FT_HTTP_LOGIN, bundle);
saveEditTextParameter(this, R.id.FtHttpServerPassword, RcsSettingsData.FT_HTTP_PASSWORD, bundle);
saveEditTextParameter(this, R.id.ImConferenceUri, RcsSettingsData.IM_CONF_URI, bundle);
saveEditTextParameter(this, R.id.EndUserConfReqUri, RcsSettingsData.ENDUSER_CONFIRMATION_URI, bundle);
saveEditTextParameter(this, R.id.RcsApn, RcsSettingsData.RCS_APN, bundle);
saveEditTextParameter(this, R.id.CountryCode, RcsSettingsData.COUNTRY_CODE, bundle);
saveEditTextParameter(this, R.id.CountryAreaCode, RcsSettingsData.COUNTRY_AREA_CODE, bundle);
// Save capabilities
saveCheckBoxParameter(this, R.id.image_sharing, RcsSettingsData.CAPABILITY_IMAGE_SHARING, bundle);
saveCheckBoxParameter(this, R.id.video_sharing, RcsSettingsData.CAPABILITY_VIDEO_SHARING, bundle);
saveCheckBoxParameter(this, R.id.file_transfer, RcsSettingsData.CAPABILITY_FILE_TRANSFER, bundle);
saveCheckBoxParameter(this, R.id.file_transfer_http, RcsSettingsData.CAPABILITY_FILE_TRANSFER_HTTP, bundle);
saveCheckBoxParameter(this, R.id.im, RcsSettingsData.CAPABILITY_IM_SESSION, bundle);
saveCheckBoxParameter(this, R.id.im_group, RcsSettingsData.CAPABILITY_IM_GROUP_SESSION, bundle);
saveCheckBoxParameter(this, R.id.ipvoicecall, RcsSettingsData.CAPABILITY_IP_VOICE_CALL, bundle);
saveCheckBoxParameter(this, R.id.ipvideocall, RcsSettingsData.CAPABILITY_IP_VIDEO_CALL, bundle);
saveCheckBoxParameter(this, R.id.cs_video, RcsSettingsData.CAPABILITY_CS_VIDEO, bundle);
saveCheckBoxParameter(this, R.id.presence_discovery, RcsSettingsData.CAPABILITY_PRESENCE_DISCOVERY, bundle);
saveCheckBoxParameter(this, R.id.social_presence, RcsSettingsData.CAPABILITY_SOCIAL_PRESENCE, bundle);
saveCheckBoxParameter(this, R.id.geolocation_push, RcsSettingsData.CAPABILITY_GEOLOCATION_PUSH, bundle);
saveCheckBoxParameter(this, R.id.file_transfer_thumbnail, RcsSettingsData.CAPABILITY_FILE_TRANSFER_THUMBNAIL, bundle);
saveCheckBoxParameter(this, R.id.file_transfer_sf, RcsSettingsData.CAPABILITY_FILE_TRANSFER_SF, bundle);
saveCheckBoxParameter(this, R.id.group_chat_sf, RcsSettingsData.CAPABILITY_GROUP_CHAT_SF, bundle);
saveCheckBoxParameter(this, R.id.sip_automata, RcsSettingsData.CAPABILITY_SIP_AUTOMATA, bundle);
}
/**
* Generate profile button listener
*/
private OnClickListener genBtnListener = new OnClickListener() {
public void onClick(View v) {
// Load the user profile
loadProfile();
}
};
/**
* Load the user profile
*/
private void loadProfile() {
LayoutInflater factory = LayoutInflater.from(this);
final View view = factory.inflate(R.layout.rcs_provisioning_generate_profile, null);
final EditText textEdit = (EditText) view.findViewById(R.id.msisdn);
textEdit.setText(RcsSettings.getInstance().getUserProfileImsUserName());
String[] xmlFiles = getProvisioningFiles();
final Spinner spinner = (Spinner) view.findViewById(R.id.XmlProvisioningFile);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, xmlFiles);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle(R.string.label_generate_profile).setView(view)
.setNegativeButton(R.string.label_cancel, null)
.setPositiveButton(R.string.label_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mInputedUserPhoneNumber = textEdit.getText().toString();
mSelectedProvisioningFile = (String) spinner.getSelectedItem();
if (mSelectedProvisioningFile != null
&& !mSelectedProvisioningFile.equals(getString(R.string.label_no_xml_file))) {
String filePath = PROVISIONING_FOLDER_PATH + File.separator + mSelectedProvisioningFile;
if (logger.isActivated()) {
logger.debug("Selection of provisioning file: " + mSelectedProvisioningFile);
}
String mXMLFileContent = getFileContent(filePath);
if (mXMLFileContent != null) {
if (logger.isActivated()) {
logger.debug("Selection of provisioning file: " + filePath);
}
ProvisionTask mProvisionTask = new ProvisionTask();
mProvisionTask.execute(mXMLFileContent, mInputedUserPhoneNumber);
return;
}
}
Toast.makeText(ProfileProvisioning.this, getString(R.string.label_load_failed), Toast.LENGTH_LONG).show();
}
});
AlertDialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
/**
* Read a text file and convert it into a string
*
* @param filePath
* the file path
* @return the result string
*/
private String getFileContent(String filePath) {
if (filePath == null)
return null;
// Get the text file
File file = new File(filePath);
// Read text from file
StringBuilder text = new StringBuilder();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
text.append(line);
text.append('\n');
}
return text.toString();
} catch (Exception e) {
if (logger.isActivated()) {
logger.error("Error reading file content: " + e.getClass().getName() + " " + e.getMessage(), e);
}
} finally {
if (br != null)
try {
br.close();
} catch (IOException e) {
}
}
return null;
}
/**
* Asynchronous Tasks that loads the provisioning file.
*/
private class ProvisionTask extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
String UserPhoneNumber = params[1];
String mXMLFileContent = params[0];
return createProvisioning(mXMLFileContent, UserPhoneNumber);
}
/**
* Parse the provisioning data then save it into RCS settings provider
*
* @param mXMLFileContent
* the XML file containing provisioning data
* @param userPhoneNumber
* the user phone number
* @return true if loading the provisioning is successful
*/
private Boolean createProvisioning(String mXMLFileContent, String userPhoneNumber) {
ProvisioningParser parser = new ProvisioningParser(mXMLFileContent);
// Save GSMA release set into the provider
int gsmaRelease = RcsSettings.getInstance().getGsmaRelease();
// Before parsing the provisioning, the GSMA release is set to Albatros
RcsSettings.getInstance().setGsmaRelease(RcsSettingsData.VALUE_GSMA_REL_ALBATROS);
if (parser.parse(gsmaRelease)) {
// Customize provisioning data with user phone number
RcsSettings.getInstance().writeParameter(RcsSettingsData.USERPROFILE_IMS_USERNAME, userPhoneNumber);
RcsSettings.getInstance().writeParameter(RcsSettingsData.USERPROFILE_IMS_DISPLAY_NAME, userPhoneNumber);
String homeDomain = RcsSettings.getInstance().readParameter(RcsSettingsData.USERPROFILE_IMS_HOME_DOMAIN);
String sipUri = userPhoneNumber + "@" + homeDomain;
RcsSettings.getInstance().writeParameter(RcsSettingsData.USERPROFILE_IMS_PRIVATE_ID, sipUri);
RcsSettings.getInstance().writeParameter(RcsSettingsData.FT_HTTP_LOGIN, sipUri);
return true;
} else {
if (logger.isActivated()) {
logger.error("Can't parse provisioning document");
}
// Restore GSMA release saved before parsing of the provisioning
RcsSettings.getInstance().setGsmaRelease("" + gsmaRelease);
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
updateProfileProvisioningUI(null);
// set configuration mode to manual
RcsSettings.getInstance().writeParameter(RcsSettingsData.AUTO_CONFIG_MODE, "" + RcsSettingsData.NO_AUTO_CONFIG);
if (result)
Toast.makeText(ProfileProvisioning.this, getString(R.string.label_reboot_service), Toast.LENGTH_LONG).show();
else
Toast.makeText(ProfileProvisioning.this, getString(R.string.label_parse_failed), Toast.LENGTH_LONG).show();
}
}
/**
* Load a list of provisioning files from the SDCARD
*
* @return List of XML provisioning files
*/
private String[] getProvisioningFiles() {
String[] files = null;
File folder = new File(PROVISIONING_FOLDER_PATH);
try {
folder.mkdirs();
if (folder.exists()) {
// filter
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String filename) {
return filename.endsWith(PROVISIONING_EXTENSION);
}
};
files = folder.list(filter);
}
} catch (SecurityException e) {
// intentionally blank
}
if (files == null) {
// No provisioning file
return new String[] { getString(R.string.label_no_xml_file) };
} else {
if (files.length == 0) {
// No provisioning file
return new String[] { getString(R.string.label_no_xml_file) };
}
return files;
}
}
}