/*******************************************************************************
* 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.provider.settings;
import java.util.ArrayList;
import javax2.sip.ListeningPoint;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.os.Environment;
import com.orangelabs.rcs.R;
import com.orangelabs.rcs.utils.logger.Logger;
/**
* RCS settings provider
*
* @author jexa7410
*/
public class RcsSettingsProvider extends ContentProvider {
/**
* Database table
*/
private static final String TABLE = "settings";
// Create the constants used to differentiate between the different URI requests
private static final int SETTINGS = 1;
private static final int SETTINGS_ID = 2;
// Allocate the UriMatcher object, where a URI ending in 'settings'
// will correspond to a request for all settings, and 'settings'
// with a trailing '/[rowID]' will represent a single settings row.
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI("com.orangelabs.rcs.settings", "settings", SETTINGS);
uriMatcher.addURI("com.orangelabs.rcs.settings", "settings/#", SETTINGS_ID);
}
/**
* Database helper class
*/
private SQLiteOpenHelper openHelper;
/**
* Database name
*/
public static final String DATABASE_NAME = "rcs_settings.db";
/**
* Helper class for opening, creating and managing database version control
*/
private static class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 86;
private Context ctx;
public DatabaseHelper(Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
this.ctx = ctx;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE + " ("
+ RcsSettingsData.KEY_ID + " integer primary key autoincrement,"
+ RcsSettingsData.KEY_KEY + " TEXT,"
+ RcsSettingsData.KEY_VALUE + " TEXT);");
// Insert default values for parameters
addParameter(db, RcsSettingsData.SERVICE_ACTIVATED, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.PRESENCE_INVITATION_RINGTONE, "");
addParameter(db, RcsSettingsData.PRESENCE_INVITATION_VIBRATE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CSH_INVITATION_RINGTONE, "");
addParameter(db, RcsSettingsData.CSH_INVITATION_VIBRATE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CSH_AVAILABLE_BEEP, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.FILETRANSFER_INVITATION_RINGTONE, "");
addParameter(db, RcsSettingsData.FILETRANSFER_INVITATION_VIBRATE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CHAT_INVITATION_RINGTONE, "");
addParameter(db, RcsSettingsData.CHAT_INVITATION_VIBRATE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CHAT_DISPLAYED_NOTIFICATION, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.FREETEXT1, ctx.getString(R.string.rcs_settings_label_default_freetext_1));
addParameter(db, RcsSettingsData.FREETEXT2, ctx.getString(R.string.rcs_settings_label_default_freetext_2));
addParameter(db, RcsSettingsData.FREETEXT3, ctx.getString(R.string.rcs_settings_label_default_freetext_3));
addParameter(db, RcsSettingsData.FREETEXT4, ctx.getString(R.string.rcs_settings_label_default_freetext_4));
addParameter(db, RcsSettingsData.MIN_BATTERY_LEVEL, "0");
addParameter(db, RcsSettingsData.MAX_PHOTO_ICON_SIZE, "256");
addParameter(db, RcsSettingsData.MAX_FREETXT_LENGTH, "100");
addParameter(db, RcsSettingsData.MAX_GEOLOC_LABEL_LENGTH, "100");
addParameter(db, RcsSettingsData.GEOLOC_EXPIRATION_TIME, "3600");
addParameter(db, RcsSettingsData.MIN_STORAGE_CAPACITY, "10240");
addParameter(db, RcsSettingsData.MAX_CHAT_PARTICIPANTS, "10");
addParameter(db, RcsSettingsData.MAX_CHAT_MSG_LENGTH, "100");
addParameter(db, RcsSettingsData.MAX_GROUPCHAT_MSG_LENGTH, "100");
addParameter(db, RcsSettingsData.CHAT_IDLE_DURATION, "300");
addParameter(db, RcsSettingsData.MAX_FILE_TRANSFER_SIZE, "3072");
addParameter(db, RcsSettingsData.WARN_FILE_TRANSFER_SIZE, "2048");
addParameter(db, RcsSettingsData.MAX_IMAGE_SHARE_SIZE, "3072");
addParameter(db, RcsSettingsData.MAX_VIDEO_SHARE_DURATION, "54000");
addParameter(db, RcsSettingsData.MAX_CHAT_SESSIONS, "20");
addParameter(db, RcsSettingsData.MAX_FILE_TRANSFER_SESSIONS, "10");
addParameter(db, RcsSettingsData.MAX_IP_CALL_SESSIONS, "5");
addParameter(db, RcsSettingsData.SMS_FALLBACK_SERVICE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.WARN_SF_SERVICE, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.AUTO_ACCEPT_CHAT, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.AUTO_ACCEPT_GROUP_CHAT, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.AUTO_ACCEPT_FILE_TRANSFER, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IM_SESSION_START, "1");
addParameter(db, RcsSettingsData.USERPROFILE_IMS_USERNAME, "");
addParameter(db, RcsSettingsData.USERPROFILE_IMS_DISPLAY_NAME, "");
addParameter(db, RcsSettingsData.USERPROFILE_IMS_HOME_DOMAIN, "");
addParameter(db, RcsSettingsData.USERPROFILE_IMS_PRIVATE_ID, "");
addParameter(db, RcsSettingsData.USERPROFILE_IMS_PASSWORD, "");
addParameter(db, RcsSettingsData.USERPROFILE_IMS_REALM, "");
addParameter(db, RcsSettingsData.IMS_PROXY_ADDR_MOBILE, "");
addParameter(db, RcsSettingsData.IMS_PROXY_PORT_MOBILE, "5060");
addParameter(db, RcsSettingsData.IMS_PROXY_ADDR_WIFI, "");
addParameter(db, RcsSettingsData.IMS_PROXY_PORT_WIFI, "5060");
addParameter(db, RcsSettingsData.XDM_SERVER, "");
addParameter(db, RcsSettingsData.XDM_LOGIN, "");
addParameter(db, RcsSettingsData.XDM_PASSWORD, "");
addParameter(db, RcsSettingsData.FT_HTTP_SERVER, "");
addParameter(db, RcsSettingsData.FT_HTTP_LOGIN, "");
addParameter(db, RcsSettingsData.FT_HTTP_PASSWORD, "");
addParameter(db, RcsSettingsData.FT_PROTOCOL, RcsSettingsData.FT_PROTOCOL_MSRP);
addParameter(db, RcsSettingsData.IM_CONF_URI, RcsSettingsData.DEFAULT_GROUP_CHAT_URI);
addParameter(db, RcsSettingsData.ENDUSER_CONFIRMATION_URI, "");
addParameter(db, RcsSettingsData.COUNTRY_CODE, "+33");
addParameter(db, RcsSettingsData.COUNTRY_AREA_CODE, "0");
addParameter(db, RcsSettingsData.MSISDN, "");
addParameter(db, RcsSettingsData.CAPABILITY_CS_VIDEO, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_IMAGE_SHARING, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_VIDEO_SHARING, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_IP_VOICE_CALL, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_IP_VIDEO_CALL, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_IM_SESSION, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_IM_GROUP_SESSION, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_FILE_TRANSFER, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_FILE_TRANSFER_HTTP, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_PRESENCE_DISCOVERY, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_SOCIAL_PRESENCE, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_GEOLOCATION_PUSH, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_FILE_TRANSFER_THUMBNAIL,RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_GROUP_CHAT_SF, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_FILE_TRANSFER_SF, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_RCS_EXTENSIONS, "");
addParameter(db, RcsSettingsData.IMS_SERVICE_POLLING_PERIOD, "300");
addParameter(db, RcsSettingsData.SIP_DEFAULT_PORT, "5060");
addParameter(db, RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_MOBILE, ListeningPoint.UDP);
addParameter(db, RcsSettingsData.SIP_DEFAULT_PROTOCOL_FOR_WIFI, ListeningPoint.TCP);
addParameter(db, RcsSettingsData.TLS_CERTIFICATE_ROOT, "");
addParameter(db, RcsSettingsData.TLS_CERTIFICATE_INTERMEDIATE, "");
addParameter(db, RcsSettingsData.SIP_TRANSACTION_TIMEOUT, "120");
addParameter(db, RcsSettingsData.MSRP_DEFAULT_PORT, "20000");
addParameter(db, RcsSettingsData.RTP_DEFAULT_PORT, "10000");
addParameter(db, RcsSettingsData.MSRP_TRANSACTION_TIMEOUT, "5");
addParameter(db, RcsSettingsData.REGISTER_EXPIRE_PERIOD, "600000");
addParameter(db, RcsSettingsData.REGISTER_RETRY_BASE_TIME, "30");
addParameter(db, RcsSettingsData.REGISTER_RETRY_MAX_TIME, "1800");
addParameter(db, RcsSettingsData.PUBLISH_EXPIRE_PERIOD, "3600");
addParameter(db, RcsSettingsData.REVOKE_TIMEOUT, "300");
addParameter(db, RcsSettingsData.IMS_AUTHENT_PROCEDURE_MOBILE, RcsSettingsData.DIGEST_AUTHENT);
addParameter(db, RcsSettingsData.IMS_AUTHENT_PROCEDURE_WIFI, RcsSettingsData.DIGEST_AUTHENT);
addParameter(db, RcsSettingsData.TEL_URI_FORMAT, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.RINGING_SESSION_PERIOD, "60");
addParameter(db, RcsSettingsData.SUBSCRIBE_EXPIRE_PERIOD, "3600");
addParameter(db, RcsSettingsData.IS_COMPOSING_TIMEOUT, "5");
addParameter(db, RcsSettingsData.SESSION_REFRESH_EXPIRE_PERIOD, "0");
addParameter(db, RcsSettingsData.PERMANENT_STATE_MODE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.TRACE_ACTIVATED, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.TRACE_LEVEL, "" + Logger.DEBUG_LEVEL);
addParameter(db, RcsSettingsData.SIP_TRACE_ACTIVATED, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.SIP_TRACE_FILE, Environment.getExternalStorageDirectory() + "/sip.txt");
addParameter(db, RcsSettingsData.MEDIA_TRACE_ACTIVATED, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CAPABILITY_REFRESH_TIMEOUT, "1");
addParameter(db, RcsSettingsData.CAPABILITY_EXPIRY_TIMEOUT, "86400");
addParameter(db, RcsSettingsData.CAPABILITY_POLLING_PERIOD, "3600");
addParameter(db, RcsSettingsData.IM_CAPABILITY_ALWAYS_ON, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.FT_CAPABILITY_ALWAYS_ON, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IM_USE_REPORTS, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.NETWORK_ACCESS, ""+RcsSettingsData.ANY_ACCESS);
addParameter(db, RcsSettingsData.SIP_TIMER_T1, "2000");
addParameter(db, RcsSettingsData.SIP_TIMER_T2, "16000");
addParameter(db, RcsSettingsData.SIP_TIMER_T4, "17000");
addParameter(db, RcsSettingsData.SIP_KEEP_ALIVE, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.SIP_KEEP_ALIVE_PERIOD, "60");
addParameter(db, RcsSettingsData.RCS_APN, "");
addParameter(db, RcsSettingsData.RCS_OPERATOR, "");
addParameter(db, RcsSettingsData.MAX_CHAT_LOG_ENTRIES, "500");
addParameter(db, RcsSettingsData.MAX_RICHCALL_LOG_ENTRIES, "200");
addParameter(db, RcsSettingsData.MAX_IPCALL_LOG_ENTRIES, "200");
addParameter(db, RcsSettingsData.GRUU, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.USE_IMEI_AS_DEVICE_ID, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CPU_ALWAYS_ON, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.AUTO_CONFIG_MODE, ""+RcsSettingsData.HTTPS_AUTO_CONFIG);
addParameter(db, RcsSettingsData.PROVISIONING_TERMS_ACCEPTED, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.PROVISIONING_VERSION, "0");
addParameter(db, RcsSettingsData.PROVISIONING_TOKEN, "");
addParameter(db, RcsSettingsData.SECONDARY_PROVISIONING_ADDRESS, "");
addParameter(db, RcsSettingsData.SECONDARY_PROVISIONING_ADDRESS_ONLY,RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.DIRECTORY_PATH_PHOTOS, "/joyn/photos/");
addParameter(db, RcsSettingsData.DIRECTORY_PATH_VIDEOS, "/joyn/videos/");
addParameter(db, RcsSettingsData.DIRECTORY_PATH_FILES, "/joyn/files/");
addParameter(db, RcsSettingsData.SECURE_MSRP_OVER_WIFI, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.SECURE_RTP_OVER_WIFI, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.CONVERGENT_MESSAGING_UX, RcsSettingsData.TRUE);
addParameter(db, RcsSettingsData.CAPABILITY_SIP_AUTOMATA, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.KEY_GSMA_RELEASE, RcsSettingsData.VALUE_GSMA_REL_BLACKBIRD);
addParameter(db, RcsSettingsData.BE_IPVOICECALL_AUTH, "15");
addParameter(db, RcsSettingsData.BE_IPVIDEOCALL_AUTH, "15");
addParameter(db, RcsSettingsData.IPVOICECALL_BREAKOUT, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IPVOICECALL_BREAKOUT_CS, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IPVIDEOCALL_UPGRADE_FROM_CS, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IPVIDEOCALL_UPGRADE_ON_CAPERROR, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IPVIDEOCALL_UPGRADE_ATTEMPT_EARLY, RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.IPCALL_E2E_LABEL, "");
addParameter(db, RcsSettingsData.IPCALL_BREAKOUT_LABEL, "");
addParameter(db, RcsSettingsData.IPCALL_E2E_VOICECAPABILITYHANDLING,RcsSettingsData.FALSE);
addParameter(db, RcsSettingsData.KEY_TCP_FALLBACK, RcsSettingsData.FALSE);
}
/**
* Add a parameter in the database
*
* @param db Database
* @param key Key
* @param value Value
*/
private void addParameter(SQLiteDatabase db, String key, String value) {
String sql = "INSERT INTO " + TABLE + " (" +
RcsSettingsData.KEY_KEY + "," +
RcsSettingsData.KEY_VALUE + ") VALUES ('" +
key + "','" + value + "');";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
// Get old data before deleting the table
Cursor oldDataCursor = db.query(TABLE, null, null, null, null, null, null);
// Get all the pairs key/value of the old table to insert them back
// after update
ArrayList<ContentValues> valuesList = new ArrayList<ContentValues>();
while(oldDataCursor.moveToNext()){
String key = null;
String value = null;
int index = oldDataCursor.getColumnIndex(RcsSettingsData.KEY_KEY);
if (index!=-1) {
key = oldDataCursor.getString(index);
}
if ((oldVersion < 86) && (key.equals(RcsSettingsData.DIRECTORY_PATH_FILES)
|| key.equals(RcsSettingsData.DIRECTORY_PATH_PHOTOS)
|| key.equals(RcsSettingsData.DIRECTORY_PATH_VIDEOS))) {
// Don't save the previous values of DIRECTORY_PATH
// Nothing to do
} else {
// Save all others previous values
index = oldDataCursor.getColumnIndex(RcsSettingsData.KEY_VALUE);
if (index!=-1) {
value = oldDataCursor.getString(index);
}
if (key!=null && value!=null) {
ContentValues values = new ContentValues();
values.put(RcsSettingsData.KEY_KEY, key);
values.put(RcsSettingsData.KEY_VALUE, value);
valuesList.add(values);
}
}
}
oldDataCursor.close();
// Delete old table
db.execSQL("DROP TABLE IF EXISTS " + TABLE);
// Recreate table
onCreate(db);
// Put the old values back when possible
for (int i=0; i<valuesList.size();i++) {
ContentValues values = valuesList.get(i);
String whereClause = RcsSettingsData.KEY_KEY + "=" + "\""+ values.getAsString(RcsSettingsData.KEY_KEY) + "\"";
// Update the value with this key in the newly created database
// If key is not present in the new version, this won't do anything
db.update(TABLE, values, whereClause, null);
}
}
}
@Override
public boolean onCreate() {
openHelper = new DatabaseHelper(getContext());
return true;
}
@Override
public String getType(Uri uri) {
int match = uriMatcher.match(uri);
switch(match) {
case SETTINGS:
return "vnd.android.cursor.dir/com.orangelabs.rcs.settings";
case SETTINGS_ID:
return "vnd.android.cursor.item/com.orangelabs.rcs.settings";
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
}
@Override
public Cursor query(Uri uri, String[] projectionIn, String selection, String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE);
// Generate the body of the query
int match = uriMatcher.match(uri);
switch(match) {
case SETTINGS:
break;
case SETTINGS_ID:
qb.appendWhere(RcsSettingsData.KEY_ID + "=");
qb.appendWhere(uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor c = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
// Register the contexts ContentResolver to be notified if
// the cursor result set changes.
if (c != null) {
c.setNotificationUri(getContext().getContentResolver(), uri);
}
return c;
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
int count;
SQLiteDatabase db = openHelper.getWritableDatabase();
int match = uriMatcher.match(uri);
switch (match) {
case SETTINGS:
count = db.update(TABLE, values, where, null);
break;
case SETTINGS_ID:
String segment = uri.getPathSegments().get(1);
int id = Integer.parseInt(segment);
count = db.update(TABLE, values, RcsSettingsData.KEY_ID + "=" + id, null);
break;
default:
throw new UnsupportedOperationException("Cannot update URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
throw new UnsupportedOperationException("Cannot insert URI " + uri);
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
throw new UnsupportedOperationException();
}
}