I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
LogFragment.java 5.08 KiB
package net.i2p.android.router.fragment;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;
import net.i2p.I2PAppContext;
import net.i2p.android.router.R;

public class LogFragment extends ListFragment {

    String _logLevel;
    private Handler _handler;
    private Runnable _updater;
    private ArrayAdapter<String> _adap;
    private TextView _headerView;

    public static final String LOG_LEVEL = "log_level";
    private static final int MAX = 250;

    public static LogFragment newInstance(String level) {
        LogFragment f = new LogFragment();
        Bundle args = new Bundle();
        args.putString(LOG_LEVEL, level);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);

        // Grab context if router has started, otherwise create new
        // FIXME dup contexts, locking, ...
        List<String> msgs;
        String header;
        I2PAppContext ctx = I2PAppContext.getCurrentContext();
        if (ctx != null) {
            Bundle args = getArguments();
            _logLevel = args.getString(LOG_LEVEL);
            if ("ERROR".equals(_logLevel)) {
                msgs = ctx.logManager().getBuffer().getMostRecentCriticalMessages();
            } else {
                msgs = ctx.logManager().getBuffer().getMostRecentMessages();
            }
            int sz = msgs.size();
            header = getHeader(sz, ("ERROR".equals(_logLevel)));
            if (sz > 1) {
                Collections.reverse(msgs);
            }
        } else {
            //msgs = Collections.EMPTY_LIST;
            msgs = Collections.emptyList();
            header = "No messages, router has not started yet.";
        }

        // set the header
        _headerView = (TextView) getActivity().getLayoutInflater().inflate(R.layout.logs_header, null);
        _headerView.setText(header);
        ListView lv = getListView();
        lv.addHeaderView(_headerView, "", false);
        _adap = new ArrayAdapter<String>(getActivity(), R.layout.logs_list_item, msgs);
        setListAdapter(_adap);

/***
        // set the callback
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView parent, View view, int pos, long id) {
                // make it bigger or something
            }
        });
***/

        _handler = new Handler();
        _updater = new Updater();
    }

    @Override
    public void onStart() {
        super.onStart();
        _handler.removeCallbacks(_updater);
        _handler.postDelayed(_updater, 10*1000);
    }

    @Override
    public void onStop() {
        super.onStop();
        _handler.removeCallbacks(_updater);
    }

    private class Updater implements Runnable {
        private int counter;

        public void run() {
            I2PAppContext ctx = I2PAppContext.getCurrentContext();
            if (ctx != null) {
                List<String> msgs;
                if ("ERROR".equals(_logLevel)) {
                    msgs = ctx.logManager().getBuffer().getMostRecentCriticalMessages();
                } else {
                    msgs = ctx.logManager().getBuffer().getMostRecentMessages();
                }
		int sz = msgs.size();
                if (sz > 0) {
                    Collections.reverse(msgs);
                    String oldNewest = _adap.getCount() > 0 ? _adap.getItem(0) : null;
                    boolean changed = false;
                    for (int i = 0; i < sz; i++) {
                        String newItem = msgs.get(i);
                        if (newItem.equals(oldNewest))
                            break;
                        _adap.insert(newItem, i);
                        changed = true;
                    }
                    int newSz = _adap.getCount();
                    for (int i = newSz - 1; i > MAX; i--) {
                        _adap.remove(_adap.getItem(i));
                    }
                    if (changed) {
                        // fixme update header
                        newSz = _adap.getCount();
                        String header = getHeader(newSz, (_logLevel == "ERROR"));
                        _headerView.setText(header);
                        _adap.notifyDataSetChanged();
                    }
                }
            }
            // LogWriter only processes queue every 10 seconds
            _handler.postDelayed(this, 10*1000);
        }
    }

    /** fixme plurals */
    private static String getHeader(int sz, boolean errorsOnly) {
        if (errorsOnly) {
            if (sz == 0)
                return "No error messages";
            if (sz == 1)
                return "1 error message";
            return sz + " error messages, newest first";
        }
        if (sz == 0)
            return "No messages";
        if (sz == 1)
            return "1 message";
        return sz + " messages, newest first";
    }
}