Show badge icon if any participant in the conversation is work contact

Precompute is_enterprise and stored the value in conversation table.
Include is_enterprise in the ConversationList view.

Change-Id: I2e31bd61c08d25a296aaa3e99cb24631ae2e7976
This commit is contained in:
Tony Mak
2016-06-29 10:58:33 +01:00
parent dec1aca348
commit 7ad7ac27f1
6 changed files with 100 additions and 15 deletions
@@ -841,6 +841,11 @@ public class BugleDatabaseOperations {
values.put(ConversationColumns.NAME,
getDefaultConversationName(participants));
// Fill in IS_ENTERPRISE.
final boolean hasAnyEnterpriseContact =
ConversationListItemData.hasAnyEnterpriseContact(participants);
values.put(ConversationColumns.IS_ENTERPRISE, hasAnyEnterpriseContact);
fillParticipantData(values, participants);
// Used by background thread when refreshing conversation so conversation could be deleted.
@@ -149,6 +149,9 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// is present (TP-Reply-Path), so that we could use it for the subsequent message to send.
// Refer to TS 23.040 D.6 and SmsMessageSender.java in Android Messaging app.
public static final String SMS_SERVICE_CENTER = "sms_service_center";
// A conversation is enterprise if one of the participant is a enterprise contact.
public static final String IS_ENTERPRISE = "IS_ENTERPRISE";
}
// Conversation table SQL
@@ -182,7 +185,8 @@ public class DatabaseHelper extends SQLiteOpenHelper {
+ ConversationColumns.NOTIFICATION_SOUND_URI + " TEXT, "
+ ConversationColumns.NOTIFICATION_VIBRATION + " INT DEFAULT(1), "
+ ConversationColumns.INCLUDE_EMAIL_ADDRESS + " INT DEFAULT(0), "
+ ConversationColumns.SMS_SERVICE_CENTER + " TEXT "
+ ConversationColumns.SMS_SERVICE_CENTER + " TEXT ,"
+ ConversationColumns.IS_ENTERPRISE + " INT DEFAULT(0)"
+ ");";
private static final String CONVERSATIONS_TABLE_SMS_THREAD_ID_INDEX_SQL =
@@ -668,6 +672,12 @@ public class DatabaseHelper extends SQLiteOpenHelper {
}
}
public static void rebuildAllViews(final DatabaseWrapper db) {
for (final String sql : DatabaseHelper.CREATE_VIEW_SQLS) {
db.execSQL(sql);
}
}
/**
* Drops all user-defined tables from the given database.
*/
@@ -733,7 +743,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
/**
* Drops all user-defined views from the given database.
*/
private static void dropAllViews(final SQLiteDatabase db) {
public static void dropAllViews(final SQLiteDatabase db) {
final Cursor viewCursor =
db.query(MASTER_TABLE, MASTER_COLUMNS, "type='view'", null, null, null, null);
if (viewCursor != null) {
@@ -15,8 +15,10 @@
*/
package com.android.messaging.datamodel;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.android.messaging.Factory;
import com.android.messaging.util.Assert;
import com.android.messaging.util.LogUtil;
@@ -30,8 +32,61 @@ public class DatabaseUpgradeHelper {
}
LogUtil.i(TAG, "Database upgrade started from version " + oldVersion + " to " + newVersion);
try {
doUpgradeWithExceptions(db, oldVersion, newVersion);
LogUtil.i(TAG, "Finished database upgrade");
} catch (final Exception ex) {
LogUtil.e(TAG, "Failed to perform db upgrade from version " +
oldVersion + " to version " + newVersion, ex);
DatabaseHelper.rebuildTables(db);
}
}
// Add future upgrade code here
public void doUpgradeWithExceptions(final SQLiteDatabase db, final int oldVersion,
final int newVersion) throws Exception {
int currentVersion = oldVersion;
if (currentVersion < 2) {
currentVersion = upgradeToVersion2(db);
}
// Rebuild all the views
final Context context = Factory.get().getApplicationContext();
DatabaseHelper.dropAllViews(db);
DatabaseHelper.rebuildAllViews(new DatabaseWrapper(context, db));
// Finally, check if we have arrived at the final version.
checkAndUpdateVersionAtReleaseEnd(currentVersion, Integer.MAX_VALUE, newVersion);
}
private int upgradeToVersion2(final SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + DatabaseHelper.CONVERSATIONS_TABLE + " ADD COLUMN " +
DatabaseHelper.ConversationColumns.IS_ENTERPRISE + " INT DEFAULT(0)");
LogUtil.i(TAG, "Ugraded database to version 2");
return 2;
}
/**
* Checks db version correctness at the end of each milestone release. If target database
* version lies beyond the version range that the current release may handle, we snap the
* current version to the end of the release, so that we may go on to the next release' upgrade
* path. Otherwise, if target version is within reach of the current release, but we are not
* at the target version, then throw an exception to force a table rebuild.
*/
private int checkAndUpdateVersionAtReleaseEnd(final int currentVersion,
final int maxVersionForRelease, final int targetVersion) throws Exception {
if (maxVersionForRelease < targetVersion) {
// Target version is beyond the current release. Snap to max version for the
// current release so we can go on to the upgrade path for the next release.
return maxVersionForRelease;
}
// If we are here, this means the current release' upgrade handler should upgrade to
// target version...
if (currentVersion != targetVersion) {
// No more upgrade handlers. So we can't possibly upgrade to the final version.
throw new Exception("Missing upgrade handler from version " +
currentVersion + " to version " + targetVersion);
}
// Upgrade succeeded.
return targetVersion;
}
public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
@@ -67,6 +67,7 @@ public class ConversationListItemData {
private String mDraftSubject;
private String mSnippetSenderFirstName;
private String mSnippetSenderDisplayDestination;
private boolean mIsEnterprise;
public ConversationListItemData() {
}
@@ -118,6 +119,7 @@ public class ConversationListItemData {
mSnippetSenderFirstName = cursor.getString(INDEX_SNIPPET_SENDER_FIRST_NAME);
mSnippetSenderDisplayDestination =
cursor.getString(INDEX_SNIPPET_SENDER_DISPLAY_DESTINATION);
mIsEnterprise = cursor.getInt(INDEX_IS_ENTERPRISE) == 1;
}
public String getConversationId() {
@@ -157,20 +159,19 @@ public class ConversationListItemData {
}
/**
* @see DatabaseHelper.ConversationColumns#PARTICIPANT_CONTACT_ID
* @return the contact id of the participant if it is a 1:1 conversation, -1 for group.
*/
* @see ConversationColumns#PARTICIPANT_CONTACT_ID
* @return the contact id of the participant if it is a 1:1 conversation, -1 for group.
*/
public long getParticipantContactId() {
return mParticipantContactId;
}
/**
* TODO: support group conversation.
* @see android.provider.ContactsContract#isEnterpriseContactId(long)
* @return is the participant an enterprise contact. False if it is a group conversation.
* @see ConversationColumns#IS_ENTERPRISE
* @return whether the conversation is enterprise.
*/
public boolean isParticipantEnterpriseContact() {
return ContactUtil.isEnterpriseContactId(getParticipantContactId());
public boolean isEnterprise() {
return mIsEnterprise;
}
public String getParticipantLookupKey() {
@@ -345,7 +346,9 @@ public class ConversationListItemData {
+ DatabaseHelper.PARTICIPANTS_TABLE + '.' + ParticipantColumns.FIRST_NAME
+ " as " + ConversationListViewColumns.SNIPPET_SENDER_FIRST_NAME + ", "
+ DatabaseHelper.PARTICIPANTS_TABLE + '.' + ParticipantColumns.DISPLAY_DESTINATION
+ " as " + ConversationListViewColumns.SNIPPET_SENDER_DISPLAY_DESTINATION;
+ " as " + ConversationListViewColumns.SNIPPET_SENDER_DISPLAY_DESTINATION + ", "
+ DatabaseHelper.CONVERSATIONS_TABLE + '.' + ConversationColumns.IS_ENTERPRISE
+ " as " + ConversationListViewColumns.IS_ENTERPRISE;
private static final String JOIN_PARTICIPANTS =
" LEFT JOIN " + DatabaseHelper.PARTICIPANTS_TABLE + " ON ("
@@ -404,6 +407,7 @@ public class ConversationListItemData {
static final String SNIPPET_SENDER_FIRST_NAME = "snippet_sender_first_name";
static final String SNIPPET_SENDER_DISPLAY_DESTINATION =
"snippet_sender_display_destination";
static final String IS_ENTERPRISE = ConversationColumns.IS_ENTERPRISE;
}
public static final String[] PROJECTION = {
@@ -436,6 +440,7 @@ public class ConversationListItemData {
ConversationListViewColumns.MESSAGE_RAW_TELEPHONY_STATUS,
ConversationListViewColumns.SNIPPET_SENDER_FIRST_NAME,
ConversationListViewColumns.SNIPPET_SENDER_DISPLAY_DESTINATION,
ConversationListViewColumns.IS_ENTERPRISE,
};
private static final int INDEX_ID = 0;
@@ -467,9 +472,20 @@ public class ConversationListItemData {
private static final int INDEX_MESSAGE_RAW_TELEPHONY_STATUS = 26;
private static final int INDEX_SNIPPET_SENDER_FIRST_NAME = 27;
private static final int INDEX_SNIPPET_SENDER_DISPLAY_DESTINATION = 28;
private static final int INDEX_IS_ENTERPRISE = 29;
private static final String DIVIDER_TEXT = ", ";
public static boolean hasAnyEnterpriseContact(
final List<ParticipantData> participants) {
for (final ParticipantData participant : participants) {
if (ContactUtil.isEnterpriseContactId(participant.getContactId())) {
return true;
}
}
return false;
}
/**
* Get a conversation from the local DB based on the conversation id.
*
@@ -186,8 +186,7 @@ public class ConversationListItemView extends FrameLayout implements OnClickList
}
private void setWorkProfileIcon() {
mWorkProfileIconView.setVisibility(
mData.isParticipantEnterpriseContact() ? View.VISIBLE : View.GONE);
mWorkProfileIconView.setVisibility(mData.isEnterprise() ? View.VISIBLE : View.GONE);
}
private void setConversationName() {