package yuku.alkitab.base.sync; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.text.SpannableStringBuilder; import android.text.style.BackgroundColorSpan; import android.text.style.LeadingMarginSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.TextView; import yuku.afw.V; import yuku.afw.widget.EasyAdapter; import yuku.alkitab.base.App; import yuku.alkitab.base.S; import yuku.alkitab.base.ac.base.BaseActivity; import yuku.alkitab.base.model.SyncLog; import yuku.alkitab.debug.R; import java.text.SimpleDateFormat; import java.util.List; import java.util.Locale; import java.util.Map; public class SyncLogActivity extends BaseActivity { ListView lsLog; LogAdapter adapter; static final ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); } }; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sync_log); final Toolbar toolbar = V.get(this, R.id.toolbar); setSupportActionBar(toolbar); final ActionBar ab = getSupportActionBar(); assert ab != null; ab.setDisplayHomeAsUpEnabled(true); lsLog = V.get(this, R.id.lsLog); lsLog.setAdapter(adapter = new LogAdapter()); } @Override protected void onStart() { super.onStart(); adapter.load(); } public static Intent createIntent() { return new Intent(App.context, SyncLogActivity.class); } class LogAdapter extends EasyAdapter { List<SyncLog> logs; final float density = getResources().getDisplayMetrics().density; void load() { logs = S.getDb().listLatestSyncLog(500); notifyDataSetChanged(); } @Override public View newView(final int position, final ViewGroup parent) { return getLayoutInflater().inflate(android.R.layout.simple_list_item_1, parent, false); } @Override public void bindView(final View view, final int position, final ViewGroup parent) { final SyncLog log = logs.get(position); final SpannableStringBuilder sb = new SpannableStringBuilder(); sb.append(dateFormat.get().format(log.createTime)); sb.append("\n"); { final SyncRecorder.EventKind kind = SyncRecorder.EventKind.fromCode(log.kind_code); final int sb_len = sb.length(); if (kind == null) { sb.append(String.valueOf(log.kind_code)); sb.setSpan(new BackgroundColorSpan(0xff222222), sb_len, sb.length(), 0); } else { sb.append(kind.toString()); sb.setSpan(new BackgroundColorSpan(kind.backgroundColor), sb_len, sb.length(), 0); } if (log.syncSetName != null) { sb.append(" "); sb.append(log.syncSetName); } } if (log.params != null) { final int sb_len0 = sb.length(); for (final Map.Entry<String, Object> entry : log.params.entrySet()) { sb.append("\n"); final int sb_len = sb.length(); sb.append(entry.getKey()); sb.setSpan(new StyleSpan(Typeface.BOLD), sb_len, sb.length(), 0); sb.append(" "); final Object value = entry.getValue(); if (value instanceof Number) { final double doubleValue = ((Number) value).doubleValue(); final double floored = Math.floor(doubleValue); if (floored == doubleValue) { sb.append(String.valueOf((long) floored)); } else { sb.append(String.valueOf(doubleValue)); } } else { sb.append(String.valueOf(value)); } } sb.setSpan(new RelativeSizeSpan(0.8f), sb_len0, sb.length(), 0); sb.setSpan(new LeadingMarginSpan.Standard(((int) (8 * density))), sb_len0, sb.length(), 0); } final TextView text = (TextView) view; text.setTextSize(14.f); text.setText(sb); text.setPadding((int) (4 * density), (int) (4 * density), (int) (4 * density), (int) (4 * density)); } @Override public int getCount() { return logs == null ? 0 : logs.size(); } } }