blob: f2676150390e026e3e367e3633b7a409d398074b [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* 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.android.contacts.util;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.provider.ContactsContract.Data;
import android.text.TextUtils;
import android.text.format.DateUtils;
import com.android.contacts.R;
/**
* Storage for a social status update. Holds a single update, but can use
* {@link #possibleUpdate(Cursor)} to consider updating when a better status
* exists. Statuses with timestamps, or with newer timestamps win.
*/
public class DataStatus {
private int mPresence = -1;
private String mStatus = null;
private long mTimestamp = -1;
private String mResPackage = null;
private int mIconRes = -1;
private int mLabelRes = -1;
public DataStatus() {
}
public DataStatus(Cursor cursor) {
// When creating from cursor row, fill normally
fromCursor(cursor);
}
/**
* Attempt updating this {@link DataStatus} based on values at the
* current row of the given {@link Cursor}.
*/
public void possibleUpdate(Cursor cursor) {
final boolean hasStatus = !isNull(cursor, Data.STATUS);
final boolean hasTimestamp = !isNull(cursor, Data.STATUS_TIMESTAMP);
// Bail early when not valid status, or when previous status was
// found and we can't compare this one.
if (!hasStatus) return;
if (isValid() && !hasTimestamp) return;
if (hasTimestamp) {
// Compare timestamps and bail if older status
final long newTimestamp = getLong(cursor, Data.STATUS_TIMESTAMP, -1);
if (newTimestamp < mTimestamp) return;
mTimestamp = newTimestamp;
}
// Fill in remaining details from cursor
fromCursor(cursor);
}
private void fromCursor(Cursor cursor) {
mPresence = getInt(cursor, Data.PRESENCE, -1);
mStatus = getString(cursor, Data.STATUS);
mTimestamp = getLong(cursor, Data.STATUS_TIMESTAMP, -1);
mResPackage = getString(cursor, Data.STATUS_RES_PACKAGE);
mIconRes = getInt(cursor, Data.STATUS_ICON, -1);
mLabelRes = getInt(cursor, Data.STATUS_LABEL, -1);
}
public boolean isValid() {
return !TextUtils.isEmpty(mStatus);
}
public int getPresence() {
return mPresence;
}
public CharSequence getStatus() {
return mStatus;
}
public long getTimestamp() {
return mTimestamp;
}
/**
* Build any timestamp and label into a single string.
*/
public CharSequence getTimestampLabel(Context context) {
final PackageManager pm = context.getPackageManager();
// Use local package for resources when none requested
if (mResPackage == null) mResPackage = context.getPackageName();
final boolean validTimestamp = mTimestamp > 0;
final boolean validLabel = mResPackage != null && mLabelRes != -1;
final CharSequence timeClause = validTimestamp ? DateUtils.getRelativeTimeSpanString(
mTimestamp, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS,
DateUtils.FORMAT_ABBREV_RELATIVE) : null;
final CharSequence labelClause = validLabel ? pm.getText(mResPackage, mLabelRes,
null) : null;
if (validTimestamp && validLabel) {
return context.getString(
R.string.contact_status_update_attribution_with_date,
timeClause, labelClause);
} else if (validLabel) {
return context.getString(
R.string.contact_status_update_attribution,
labelClause);
} else if (validTimestamp) {
return timeClause;
} else {
return null;
}
}
public Drawable getIcon(Context context) {
final PackageManager pm = context.getPackageManager();
// Use local package for resources when none requested
if (mResPackage == null) mResPackage = context.getPackageName();
final boolean validIcon = mResPackage != null && mIconRes != -1;
return validIcon ? pm.getDrawable(mResPackage, mIconRes, null) : null;
}
private static String getString(Cursor cursor, String columnName) {
return cursor.getString(cursor.getColumnIndex(columnName));
}
private static int getInt(Cursor cursor, String columnName) {
return cursor.getInt(cursor.getColumnIndex(columnName));
}
private static int getInt(Cursor cursor, String columnName, int missingValue) {
final int columnIndex = cursor.getColumnIndex(columnName);
return cursor.isNull(columnIndex) ? missingValue : cursor.getInt(columnIndex);
}
private static long getLong(Cursor cursor, String columnName, long missingValue) {
final int columnIndex = cursor.getColumnIndex(columnName);
return cursor.isNull(columnIndex) ? missingValue : cursor.getLong(columnIndex);
}
private static boolean isNull(Cursor cursor, String columnName) {
return cursor.isNull(cursor.getColumnIndex(columnName));
}
}