package com.nolanlawson.apptracker.data;
import java.util.Comparator;
import java.util.Date;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import com.nolanlawson.apptracker.db.AppHistoryEntry;
import com.nolanlawson.apptracker.db.SortType;
import com.nolanlawson.apptracker.helper.ActivityInfoHelper;
/**
* representation of an AppHistoryEntry whose data has already been loaded (e.g. icon and label)
* @author nolan
*
*/
public class LoadedAppHistoryEntry {
private AppHistoryEntry appHistoryEntry;
private Bitmap iconBitmap;
private CharSequence title;
public AppHistoryEntry getAppHistoryEntry() {
return appHistoryEntry;
}
public void setAppHistoryEntry(AppHistoryEntry appHistoryEntry) {
this.appHistoryEntry = appHistoryEntry;
}
public Bitmap getIconBitmap() {
return iconBitmap;
}
public void setIconBitmap(Bitmap iconBitmap) {
this.iconBitmap = iconBitmap;
}
public CharSequence getTitle() {
return title;
}
public void setTitle(CharSequence title) {
this.title = title;
}
public static LoadedAppHistoryEntry fromAppHistoryEntry(
AppHistoryEntry appHistoryEntry, ActivityInfo activityInfo, PackageManager packageManager,
Context context) {
LoadedAppHistoryEntry loadedAppHistoryEntry = new LoadedAppHistoryEntry();
loadedAppHistoryEntry.setAppHistoryEntry(appHistoryEntry);
String label = ActivityInfoHelper.loadLabelFromAppHistoryEntry(context, appHistoryEntry,
activityInfo, packageManager);
loadedAppHistoryEntry.setTitle(label);
Bitmap iconBitmap = ActivityInfoHelper.loadIconFromAppHistoryEntry(context, appHistoryEntry,
activityInfo, packageManager);
loadedAppHistoryEntry.setIconBitmap(iconBitmap);
return loadedAppHistoryEntry;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((appHistoryEntry == null) ? 0 : appHistoryEntry.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
LoadedAppHistoryEntry other = (LoadedAppHistoryEntry) obj;
if (appHistoryEntry == null) {
if (other.appHistoryEntry != null)
return false;
} else if (!appHistoryEntry.equals(other.appHistoryEntry))
return false;
return true;
}
public static Comparator<LoadedAppHistoryEntry> orderByLabel() {
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return object1.getTitle().toString().toLowerCase().compareTo(object2.getTitle().toString().toLowerCase());
}
};
}
public static Comparator<LoadedAppHistoryEntry> orderBy(final SortType sortType) {
switch (sortType) {
case Recent:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return object2.getAppHistoryEntry().getLastAccessed()
.compareTo(object1.getAppHistoryEntry().getLastAccessed());
}
};
case MostUsed:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return object2.getAppHistoryEntry().getCount() -
object1.getAppHistoryEntry().getCount();
}
};
case TimeDecay:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return Double.compare(object2.getAppHistoryEntry().getDecayScore(),
object1.getAppHistoryEntry().getDecayScore());
}
};
case Alphabetic:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return object1.getTitle().toString().toLowerCase().compareTo(object2.getTitle().toString().toLowerCase());
}
};
case LeastUsed:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return object1.getAppHistoryEntry().getCount() - object2.getAppHistoryEntry().getCount();
}
};
case RecentlyInstalled:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return compareDates(object2.getAppHistoryEntry().getInstallDate(), object1.getAppHistoryEntry().getInstallDate());
}
};
case RecentlyUpdated:
return new Comparator<LoadedAppHistoryEntry>() {
@Override
public int compare(LoadedAppHistoryEntry object1,
LoadedAppHistoryEntry object2) {
return compareDates(object2.getAppHistoryEntry().getUpdateDate(), object1.getAppHistoryEntry().getUpdateDate());
}
};
}
throw new IllegalArgumentException("this should never be " +
"reached unless we don't know this sortType: " + sortType);
}
private static int compareDates(Date first, Date second) {
long firstTime = first != null ? first.getTime() : 0;
long secondTime = second != null ? second.getTime() : 0;
return new Long(firstTime).compareTo(new Long(secondTime));
}
}