package com.github.andlyticsproject;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.AsyncTask;
import android.support.v4.content.ContextCompat;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.view.animation.BounceInterpolator;
import android.view.animation.Interpolator;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.github.andlyticsproject.Preferences.StatsMode;
import com.github.andlyticsproject.cache.AppIconInMemoryCache;
import com.github.andlyticsproject.chart.Chart.ChartSet;
import com.github.andlyticsproject.model.AdmobStats;
import com.github.andlyticsproject.model.AppInfo;
import com.github.andlyticsproject.model.AppStats;
import com.github.andlyticsproject.model.Revenue;
import com.github.andlyticsproject.model.RevenueSummary;
import java.io.File;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Currency;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
public class MainListAdapter extends BaseAdapter {
// initialized only once based on AdMob revenue currency
private NumberFormat numberFormat = null;
private static int BLACK_TEXT;
private static final int RED_TEXT = Color.RED;
private static int BLUE_TEXT;
public static final int TAG_IMAGE_REF = R.id.tag_mainlist_image_reference;
public static final int TAG_IS_EXPANDED = R.id.tag_mainlist_expanded;
private static final int TAG_ROW_ID = R.id.tag_mainlist_rowid;
private static final int ANIMATION_DURATION = 1200;
private List<AppInfo> appInfos;
private LayoutInflater layoutInflater;
private Activity activity;
private Drawable spacerIcon;
protected String accountname;
private File cachDir;
private AppIconInMemoryCache inMemoryCache;
private List<Integer> animationList;
private int expandViewHeight;
private Drawable iconDown;
private Drawable iconUp;
private int expandMargin;
private AccelerateInterpolator upInterpolator;
private BounceInterpolator downInterpolator;
private StatsMode statsMode;
private DisplayMetrics displayMetrics;
public MainListAdapter(Activity activity, String accountname, StatsMode statsMode) {
BLACK_TEXT = activity.getResources().getColor(R.color.blackText);
BLUE_TEXT = activity.getResources().getColor(R.color.lightBlue);
this.setAppInfos(new ArrayList<AppInfo>());
this.layoutInflater = activity.getLayoutInflater();
this.activity = activity;
this.spacerIcon = ContextCompat.getDrawable(activity, R.drawable.app_icon_spacer);
this.accountname = accountname;
this.cachDir = activity.getCacheDir();
this.inMemoryCache = AppIconInMemoryCache.getInstance();
this.animationList = Collections.synchronizedList(new ArrayList<Integer>());
this.upInterpolator = new AccelerateInterpolator(1.7f);
this.downInterpolator = new BounceInterpolator();
displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
this.expandViewHeight = Math.round(displayMetrics.scaledDensity * 150);
this.expandMargin = Math.round(displayMetrics.scaledDensity * 5);
this.iconDown = ContextCompat.getDrawable(activity, R.drawable.icon_down);
this.iconUp = ContextCompat.getDrawable(activity, R.drawable.icon_up);
this.setStatsMode(statsMode);
}
@Override
public int getCount() {
return appInfos.size();
}
@Override
public AppInfo getItem(int position) {
return appInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.main_list_item, null);
holder = new ViewHolder();
holder.avgrating = (TextView) convertView.findViewById(R.id.main_app_avgrating);
holder.avgratingPercent = (TextView) convertView
.findViewById(R.id.main_app_avgratingPercent);
holder.name = (TextView) convertView.findViewById(R.id.main_app_name);
holder.packageName = (TextView) convertView.findViewById(R.id.main_package_name);
holder.activeInstalls = (TextView) convertView
.findViewById(R.id.main_app_activeinstalls);
holder.activeInstallsPercent = (TextView) convertView
.findViewById(R.id.main_app_activeinstallsPercent);
holder.revenueFrame = (View) convertView.findViewById(R.id.main_app_revenue_frame);
holder.totalRevenue = (TextView) convertView
.findViewById(R.id.main_app_revenue_total_text);
holder.totalRevenueLabel = (TextView) convertView
.findViewById(R.id.main_app_revenue_total_label);
holder.totalRevenuePercent = (TextView) convertView
.findViewById(R.id.main_app_revenue_totalPercent);
holder.last30DaysRevenue = (TextView) convertView
.findViewById(R.id.main_app_revenue_last_30days_text);
holder.last30DaysRevenueLabel = (TextView) convertView
.findViewById(R.id.main_app_revenue_last_30days_label);
holder.admobFrame = (View) convertView.findViewById(R.id.main_app_admob_frame);
holder.admobRequests = (TextView) convertView
.findViewById(R.id.main_app_admob_requests);
holder.admobRevenue = (TextView) convertView.findViewById(R.id.main_app_admob_revenue);
holder.ratingCount = (TextView) convertView.findViewById(R.id.main_app_rating);
holder.ratingCountPercent = (TextView) convertView
.findViewById(R.id.main_app_ratingPercent);
holder.downloadsCount = (TextView) convertView.findViewById(R.id.main_app_downloads);
holder.downloadsCountPercent = (TextView) convertView
.findViewById(R.id.main_app_downloadsPercent);
holder.commentsCount = (TextView) convertView.findViewById(R.id.main_app_commentscount);
holder.commentsCountPercent = (TextView) convertView
.findViewById(R.id.main_app_commentscountPercent);
holder.icon = (ImageView) convertView.findViewById(R.id.main_app_icon);
holder.expand = (ImageView) convertView.findViewById(R.id.main_app_expand_image);
holder.ratingbar = (RatingBar) convertView.findViewById(R.id.main_app_ratingbar);
holder.row = (RelativeLayout) convertView.findViewById(R.id.main_app_row);
holder.ratingtext1 = (TextView) convertView.findViewById(R.id.main_app_rating_1_text);
holder.ratingtext2 = (TextView) convertView.findViewById(R.id.main_app_rating_2_text);
holder.ratingtext3 = (TextView) convertView.findViewById(R.id.main_app_rating_3_text);
holder.ratingtext4 = (TextView) convertView.findViewById(R.id.main_app_rating_4_text);
holder.ratingtext5 = (TextView) convertView.findViewById(R.id.main_app_rating_5_text);
holder.ratings1 = (ProgressBar) convertView
.findViewById(R.id.main_app_rating_1_rating_progressbar);
holder.ratings2 = (ProgressBar) convertView
.findViewById(R.id.main_app_rating_2_rating_progressbar);
holder.ratings3 = (ProgressBar) convertView
.findViewById(R.id.main_app_rating_3_rating_progressbar);
holder.ratings4 = (ProgressBar) convertView
.findViewById(R.id.main_app_rating_4_rating_progressbar);
holder.ratings5 = (ProgressBar) convertView
.findViewById(R.id.main_app_rating_5_rating_progressbar);
holder.ratingpercent1 = (TextView) convertView
.findViewById(R.id.main_app_rating_1_percent);
holder.ratingpercent2 = (TextView) convertView
.findViewById(R.id.main_app_rating_2_percent);
holder.ratingpercent3 = (TextView) convertView
.findViewById(R.id.main_app_rating_3_percent);
holder.ratingpercent4 = (TextView) convertView
.findViewById(R.id.main_app_rating_4_percent);
holder.ratingpercent5 = (TextView) convertView
.findViewById(R.id.main_app_rating_5_percent);
holder.buttonHistory = (View) convertView.findViewById(R.id.main_app_button_history);
holder.ratingFrame = (View) convertView.findViewById(R.id.main_app_ratingdetain_frame);
holder.downloadFrame = (View) convertView.findViewById(R.id.main_app_download_frame);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final AppInfo appInfo = getItem(position);
final AppStats appStats = appInfo.getLatestStats();
int ai = appStats.getActiveInstalls();
int td = appStats.getTotalDownloads();
holder.avgrating.setText(appStats.getAvgRatingString());
holder.ratingbar.setRating(appStats.getAvgRating());
holder.activeInstalls.setText(ai + "");
holder.downloadsCount.setText(td + "");
String packageNameText = appInfo.getPackageName();
// if(appStats.getVersionCode() != null) {
// packageNameText += " - " + appStats.getVersionCode();
// }
holder.packageName.setText(packageNameText);
// Map<Integer, Integer> ratings = appDownloadInfo.getRatings();
holder.ratingCount.setText(appStats.getRatingCount() + "");
holder.commentsCount.setText(appStats.getNumberOfComments() + "");
holder.ratingtext1.setText(appStats.getRating1().toString());
holder.ratingtext2.setText(appStats.getRating2().toString());
holder.ratingtext3.setText(appStats.getRating3().toString());
holder.ratingtext4.setText(appStats.getRating4().toString());
holder.ratingtext5.setText(appStats.getRating5().toString());
int numRatings = appStats.getRatingCount();
holder.ratings1.setMax(numRatings);
holder.ratings1.setProgress(appStats.getRating1());
holder.ratings2.setMax(numRatings);
holder.ratings2.setProgress(appStats.getRating2());
holder.ratings3.setMax(numRatings);
holder.ratings3.setProgress(appStats.getRating3());
holder.ratings4.setMax(numRatings);
holder.ratings4.setProgress(appStats.getRating4());
holder.ratings5.setMax(numRatings);
holder.ratings5.setProgress(appStats.getRating5());
if (statsMode.equals(StatsMode.DAY_CHANGES)) {
setupValueDiff(holder.ratingpercent1, appStats.getRating1Diff());
setupValueDiff(holder.ratingpercent2, appStats.getRating2Diff());
setupValueDiff(holder.ratingpercent3, appStats.getRating3Diff());
setupValueDiff(holder.ratingpercent4, appStats.getRating4Diff());
setupValueDiff(holder.ratingpercent5, appStats.getRating5Diff());
setupValueDiff(holder.ratingCountPercent, appStats.getRatingCountDiff());
setupFloatValueDiff(holder.avgratingPercent, appStats.getAvgRatingDiff(),
appStats.getAvgRatingDiffString());
setupValueDiff(holder.commentsCountPercent, appStats.getNumberOfCommentsDiff());
setupValueDiff(holder.activeInstallsPercent, appStats.getActiveInstallsDiff());
setupValueDiff(holder.downloadsCountPercent, appStats.getDailyDownloads());
} else {
holder.downloadsCountPercent.setText("");
holder.avgratingPercent.setText("");
holder.ratingCountPercent.setText(appStats.getRatingCountPercentString() + "%");
holder.ratingCountPercent.setTextColor(BLACK_TEXT);
holder.ratingpercent1.setText(appStats.getRatingPercentString(1));
holder.ratingpercent2.setText(appStats.getRatingPercentString(2));
holder.ratingpercent3.setText(appStats.getRatingPercentString(3));
holder.ratingpercent4.setText(appStats.getRatingPercentString(4));
holder.ratingpercent5.setText(appStats.getRatingPercentString(5));
holder.ratingpercent1.setTextColor(BLACK_TEXT);
holder.ratingpercent2.setTextColor(BLACK_TEXT);
holder.ratingpercent3.setTextColor(BLACK_TEXT);
holder.ratingpercent4.setTextColor(BLACK_TEXT);
holder.ratingpercent5.setTextColor(BLACK_TEXT);
holder.commentsCountPercent.setText(appStats.getNumberOfCommentsPercentString() + "%");
holder.commentsCountPercent.setTextColor(BLACK_TEXT);
holder.activeInstallsPercent.setText(appStats.getActiveInstallsPercentString() + "%");
holder.activeInstallsPercent.setTextColor(BLACK_TEXT);
}
int height = expandViewHeight;
RevenueSummary revenue = appInfo.getTotalRevenueSummary();
boolean showDeveloperCut = Preferences.isShowDeveloperCutRevenue(activity);
if (revenue != null && revenue.hasRevenue()) {
// 55dp for revenue section?
height = Math.round(height + 55 * displayMetrics.scaledDensity);
holder.revenueFrame.setVisibility(View.VISIBLE);
Revenue overall = revenue.getOverall();
if (showDeveloperCut) {
holder.totalRevenue.setText(overall == null ? "0.0" : overall
.developerCutAsString());
} else {
holder.totalRevenue.setText(overall == null ? "0.0" : overall.asString());
}
holder.totalRevenueLabel.setText(R.string.revenue_total);
Revenue last30Days = revenue.getLast30Days();
if (showDeveloperCut) {
holder.last30DaysRevenue.setText(last30Days == null ? "0.0" : last30Days
.developerCutAsString());
} else {
holder.last30DaysRevenue
.setText(last30Days == null ? "0.0" : last30Days.asString());
}
holder.last30DaysRevenueLabel.setText(R.string.revenue_last_30days);
// TODO Drive this with a diff/reset at midnight?
// XXX float
Revenue rev = appStats.getTotalRevenue();
if (rev != null) {
if (showDeveloperCut) {
setupFloatValueDiff(holder.totalRevenuePercent, rev.getDeveloperCut(),
rev.developerCutAsString());
} else {
setupFloatValueDiff(holder.totalRevenuePercent, rev.getAmount(), rev.asString());
}
}
} else {
holder.revenueFrame.setVisibility(View.GONE);
}
AdmobStats admobStats = appInfo.getAdmobStats();
if (admobStats != null) {
// 50dp for AdMob section?
height = Math.round(height + 50 * displayMetrics.scaledDensity);
holder.admobFrame.setVisibility(View.VISIBLE);
if (numberFormat == null) {
// default: old AdMob, USD only
if (admobStats.getCurrencyCode() == null) {
numberFormat = NumberFormat.getCurrencyInstance(Locale.US);
} else {
// start with locale default
numberFormat = NumberFormat.getCurrencyInstance();
Currency currency = Currency.getInstance(admobStats.getCurrencyCode());
numberFormat.setCurrency(currency);
}
}
holder.admobRevenue.setText(numberFormat.format(admobStats.getRevenue()));
holder.admobRequests.setText(admobStats.getRequests() + "");
} else {
holder.admobFrame.setVisibility(View.GONE);
}
final int expandHeight = height;
final String packageName = appInfo.getPackageName();
final File iconFile = new File(cachDir + "/" + appInfo.getIconName());
if (inMemoryCache.contains(packageName)) {
holder.icon.setImageBitmap(inMemoryCache.get(packageName));
holder.icon.setTag(TAG_IMAGE_REF, packageName);
holder.icon.clearAnimation();
} else {
holder.icon.setTag(TAG_IMAGE_REF, packageName);
holder.icon.setImageDrawable(null);
holder.icon.clearAnimation();
new GetCachedImageTask(holder.icon, appInfo.getPackageName())
.execute(new File[] { iconFile });
}
holder.icon.setTag(TAG_IMAGE_REF, packageName);
holder.icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(activity, AppInfoActivity.class);
intent.putExtra(BaseActivity.EXTRA_PACKAGE_NAME, packageName);
if (iconFile.exists()) {
intent.putExtra(BaseActivity.EXTRA_ICON_FILE, iconFile.getAbsolutePath());
}
intent.putExtra(BaseActivity.EXTRA_AUTH_ACCOUNT_NAME, accountname);
intent.putExtra(BaseActivity.EXTRA_DEVELOPER_ID, appInfo.getDeveloperId());
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
// Make the name look like a link
SpannableString name = new SpannableString(appInfo.getName());
name.setSpan(new UnderlineSpan(), 0, name.length(), 0);
holder.name.setText(name);
holder.name.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(activity, AppInfoActivity.class);
intent.putExtra(BaseActivity.EXTRA_PACKAGE_NAME, packageName);
if (iconFile.exists()) {
intent.putExtra(BaseActivity.EXTRA_ICON_FILE, iconFile.getAbsolutePath());
}
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
holder.row.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = createDetailsIntent(appInfo, iconFile, ChartSet.DOWNLOADS,
DetailsActivity.TAB_IDX_COMMENTS);
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
holder.downloadFrame.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = createDetailsIntent(appInfo, iconFile, ChartSet.DOWNLOADS,
DetailsActivity.TAB_IDX_DOWNLOADS);
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
holder.revenueFrame.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = createDetailsIntent(appInfo, iconFile, ChartSet.REVENUE,
DetailsActivity.TAB_IDX_REVENUE);
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
holder.admobFrame.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = createDetailsIntent(appInfo, iconFile, ChartSet.ADMOB,
DetailsActivity.TAB_IDX_ADMOB);
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
holder.ratingFrame.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = createDetailsIntent(appInfo, iconFile, ChartSet.RATINGS,
DetailsActivity.TAB_IDX_RATINGS);
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_next_in,
R.anim.activity_next_out);
}
});
android.widget.RelativeLayout.LayoutParams layout = ((RelativeLayout.LayoutParams) holder.ratingFrame
.getLayoutParams());
if (appInfo.isRatingDetailsExpanded()) {
holder.ratingFrame.setTag(TAG_IS_EXPANDED, true);
layout.topMargin = expandHeight;
holder.expand.clearAnimation();
holder.expand.setImageDrawable(iconUp);
layout.leftMargin = 0;
layout.rightMargin = expandMargin;
changeBackgroundDrawable(holder.buttonHistory,
ContextCompat.getDrawable(activity,
R.drawable.row_background_inner_borderless));
holder.buttonHistory.setSelected(false);
holder.buttonHistory.setPressed(false);
// holder.expand.setVisibility(View.INVISIBLE);
} else {
holder.ratingFrame.setTag(TAG_IS_EXPANDED, false);
((RelativeLayout.LayoutParams) holder.ratingFrame.getLayoutParams()).topMargin = 0;
holder.expand.clearAnimation();
holder.expand.setImageDrawable(iconDown);
layout.rightMargin = 0;
layout.leftMargin = expandMargin;
changeBackgroundDrawable(
holder.buttonHistory,
ContextCompat.getDrawable(activity,
R.drawable.row_background_inner_borderless_bottom));
holder.buttonHistory.setSelected(false);
holder.buttonHistory.setPressed(false);
// holder.expand.setVisibility(View.VISIBLE);
}
holder.ratingFrame.setTag(TAG_ROW_ID, position);
holder.buttonHistory.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
if (!animationList.contains(position)) {
animationList.add(position);
boolean isExpanded = (Boolean) holder.ratingFrame.getTag(TAG_IS_EXPANDED);
ContentAdapter db = ContentAdapter.getInstance(AndlyticsApp.getInstance());
db.setRatingExpanded(accountname, packageName, !isExpanded);
appInfo.setRatingDetailsExpanded(!isExpanded);
int margin = expandMargin;
holder.expand.setVisibility(View.VISIBLE);
if (isExpanded) {
holder.expand.setImageDrawable(iconDown);
Animation rotateUp = AnimationUtils.loadAnimation(
activity.getApplicationContext(), R.anim.rotate_up);
rotateUp.setInterpolator(upInterpolator);
changeBackgroundDrawable(
v,
ContextCompat.getDrawable(activity,
R.drawable.row_background_inner_borderless_bottom));
holder.expand.startAnimation(rotateUp);
(new ExpandAnimation(holder.ratingFrame, true, expandHeight, margin,
position)).execute();
} else {
holder.expand.setImageDrawable(iconUp);
Animation rotateDown = AnimationUtils.loadAnimation(
activity.getApplicationContext(), R.anim.rotate_down);
rotateDown.setFillAfter(true);
rotateDown.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
TransitionDrawable out = (TransitionDrawable)
ContextCompat.getDrawable(activity,
R.drawable.background_border_transition_out);
changeBackgroundDrawable(v, out);
out.startTransition(2000);
}
});
holder.expand.startAnimation(rotateDown);
(new ExpandAnimation(holder.ratingFrame, false, expandHeight, margin,
position)).execute();
}
}
}
});
return convertView;
}
private void setupValueDiff(TextView view, Integer diff) {
String value = diff.toString();
if (diff > 0) {
view.setTextColor(BLUE_TEXT);
value = "+" + value;
} else if (diff < 0) {
view.setTextColor(RED_TEXT);
} else {
view.setTextColor(BLACK_TEXT);
}
view.setText(value);
}
private void setupFloatValueDiff(TextView view, double diff, String diffvalue) {
String value = diffvalue;
if ("0.000".equals(diffvalue)) {
value = "0";
view.setTextColor(BLACK_TEXT);
} else {
if (diff > 0) {
value = diffvalue;
view.setTextColor(BLUE_TEXT);
value = "+" + value;
} else if (diff < 0) {
value = diffvalue;
view.setTextColor(RED_TEXT);
}
}
view.setText(value);
}
static class ViewHolder {
public TextView admobRevenue;
public TextView admobRequests;
public View admobFrame;
public TextView downloadsCountPercent;
public View downloadFrame;
public ScrollView scrollview;
public TextView ratingCountPercent;
public TextView commentsCountPercent;
public RelativeLayout row;
public TextView commentsCount;
public RatingBar ratingbar;
public ImageView icon;
public ImageView expand;
public TextView ratingtext1;
public TextView ratingtext2;
public TextView ratingtext3;
public TextView ratingtext4;
public TextView ratingtext5;
public TextView ratingpercent1;
public TextView ratingpercent2;
public TextView ratingpercent3;
public TextView ratingpercent4;
public TextView ratingpercent5;
public ProgressBar ratings1;
public ProgressBar ratings2;
public ProgressBar ratings3;
public ProgressBar ratings4;
public ProgressBar ratings5;
public TextView name;
public TextView packageName;
public TextView downloadsCount;
public TextView ratingCount;
public TextView activeInstallsPercent;
public TextView activeInstalls;
public TextView avgrating;
public TextView avgratingPercent;
public View buttonHistory;
public View ratingFrame;
public View revenueFrame;
public TextView totalRevenue;
public TextView totalRevenueLabel;
public TextView last30DaysRevenueLabel;
public TextView last30DaysRevenue;
public TextView totalRevenuePercent;
}
private class GetCachedImageTask extends AsyncTask<File, Void, Bitmap> {
private ImageView imageView;
private String reference;
public GetCachedImageTask(ImageView imageView, String reference) {
this.imageView = imageView;
this.reference = reference;
}
protected void onPostExecute(Bitmap result) {
// only update the image if tag==reference
// (view may have been reused as convertView)
if (imageView.getTag(TAG_IMAGE_REF).equals(reference)) {
if (result == null) {
imageView.setImageDrawable(spacerIcon);
} else {
inMemoryCache.put(reference, result);
updateMainImage(imageView, R.anim.fade_in_fast, result);
}
}
}
@Override
protected Bitmap doInBackground(File... params) {
File iconFile = params[0];
if (iconFile.exists()) {
Bitmap bm = BitmapFactory.decodeFile(iconFile.getAbsolutePath());
return bm;
}
return null;
}
}
public void setAppInfos(List<AppInfo> appInfos) {
this.appInfos = appInfos;
}
public List<AppInfo> getAppInfos() {
return appInfos;
}
public void updateMainImage(ImageView imageView, int animationId, Bitmap result) {
imageView.setImageBitmap(result);
imageView.clearAnimation();
Animation fadeInAnimation = AnimationUtils.loadAnimation(activity.getApplicationContext(),
animationId);
imageView.startAnimation(fadeInAnimation);
}
@SuppressWarnings("deprecation")
private void changeBackgroundDrawable(final View v, Drawable drawable) {
LayoutParams l = v.getLayoutParams();
int paddingBottom = v.getPaddingBottom();
int paddingLeft = v.getPaddingLeft();
int paddingRight = v.getPaddingRight();
int paddingTop = v.getPaddingTop();
v.setBackgroundDrawable(drawable);
v.setLayoutParams(l);
v.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
}
public void setStatsMode(StatsMode statsMode) {
this.statsMode = statsMode;
}
public StatsMode getStatsMode() {
return statsMode;
}
private Intent createDetailsIntent(AppInfo appInfo, File iconFile, ChartSet chartSet,
int selectedTab) {
Intent intent = new Intent(activity, DetailsActivity.class);
intent.putExtra(BaseActivity.EXTRA_PACKAGE_NAME, appInfo.getPackageName());
intent.putExtra(DetailsActivity.EXTRA_CHART_NAME, R.string.ratings);
if (iconFile.exists()) {
intent.putExtra(BaseActivity.EXTRA_ICON_FILE, iconFile.getAbsolutePath());
}
intent.putExtra(BaseActivity.EXTRA_AUTH_ACCOUNT_NAME, accountname);
intent.putExtra(BaseActivity.EXTRA_DEVELOPER_ID, appInfo.getDeveloperId());
intent.putExtra(DetailsActivity.EXTRA_CHART_SET, chartSet.name());
intent.putExtra(DetailsActivity.EXTRA_SELECTED_TAB_IDX, selectedTab);
RevenueSummary revenue = appInfo.getTotalRevenueSummary();
boolean hasRevenue = revenue != null && revenue.hasRevenue();
intent.putExtra(DetailsActivity.EXTRA_HAS_REVENUE, hasRevenue);
return intent;
}
class ExpandAnimation extends AsyncTask<Void, LayoutParams, Void> {
private static final int SLEEP_TIME = 20;
private View view;
private boolean up;
private int height;
private int margin;
private Integer rowId;
public ExpandAnimation(View viewToExpand, boolean up, int height, int margin, int rowid) {
this.view = viewToExpand;
this.up = up;
this.height = height;
this.margin = margin;
this.rowId = rowid;
}
@Override
protected Void doInBackground(Void... params) {
long startAnimation = System.currentTimeMillis() - 1;
float animationtime = 1;
Interpolator inter = null;
if (up) {
inter = upInterpolator;
} else {
inter = downInterpolator;
}
final RelativeLayout.LayoutParams layoutParams = (android.widget.RelativeLayout.LayoutParams) view
.getLayoutParams();
while (animationtime < ANIMATION_DURATION && (Integer) view.getTag(TAG_ROW_ID) == rowId) {
int diffHeight = 0;
if (up) {
diffHeight = height
- ((int) (height * inter.getInterpolation(animationtime
/ ANIMATION_DURATION)));
} else {
diffHeight = (int) (height * inter.getInterpolation(animationtime
/ ANIMATION_DURATION));
}
int diffLeft = 0;
int diffRight = 0;
int diffMargin = (int) (margin * inter.getInterpolation(animationtime
/ ANIMATION_DURATION));
if (up) {
diffLeft = diffMargin;
diffRight = margin - diffMargin;
} else {
diffLeft = margin - diffMargin;
diffRight = diffMargin;
}
layoutParams.topMargin = diffHeight;
layoutParams.leftMargin = diffLeft;
layoutParams.rightMargin = diffRight;
publishProgress(layoutParams);
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
animationtime = (System.currentTimeMillis()) - startAnimation;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if ((Integer) view.getTag(TAG_ROW_ID) == rowId) {
if (up) {
final RelativeLayout.LayoutParams layoutParams = (android.widget.RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.topMargin = 0;
layoutParams.leftMargin = margin;
layoutParams.rightMargin = 0;
view.setLayoutParams(layoutParams);
view.setTag(TAG_IS_EXPANDED, false);
} else {
final RelativeLayout.LayoutParams layoutParams = (android.widget.RelativeLayout.LayoutParams) view
.getLayoutParams();
layoutParams.topMargin = height;
layoutParams.leftMargin = 0;
layoutParams.rightMargin = margin;
view.setLayoutParams(layoutParams);
view.setTag(TAG_IS_EXPANDED, true);
}
}
Iterator<Integer> iterator = animationList.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals(rowId)) {
iterator.remove();
break;
}
}
}
@Override
protected void onProgressUpdate(LayoutParams... values) {
view.setLayoutParams(values[0]);
}
}
}