// Path: sample/src/main/java/com/danikula/aibolit/test/support/Message.java
// public class Message {
//     
//     private Date time;
//     
//     private String text;
// 
//     public Message(Date time, String text) {
//         this.time = time;
//         this.text = text;
//     }
// 
//     public Date getTime() {
//         return time;
//     }
// 
//     public String getText() {
//         return text;
//     }
// 
// }
// 
// Path: sample/src/main/java/com/danikula/aibolit/test/support/MutableListAdapter.java
// public abstract class MutableListAdapter<T> extends BaseAdapter {
// 
//     private static final int UNDEFINED_LAYOUT_ID = -1;
// 
//     private Context context;
// 
//     private int layoutId;
// 
//     private List<T> objects = new ArrayList<T>();
// 
//     public MutableListAdapter(Context context, int layoutId) {
//         Validate.notNull(context, "Context should not be null");
//         this.context = context;
//         this.layoutId = layoutId;
//     }
// 
//     @Override
//     public View getView(int position, View convertView, ViewGroup parent) {
//         View view = convertView == null ? createView(context, position) : convertView;
// 
//         if (isViewBindable(position)) {
//             T object = getObject(position);
//             bind(object, view, position);
//         }
// 
//         return view;
//     }
// 
//     @Override
//     public int getCount() {
//         return objects.size();
//     }
// 
//     @Override
//     public Object getItem(int position) {
//         return getObject(position);
//     }
// 
//     @Override
//     public long getItemId(int position) {
//         return position;
//     }
// 
//     public void setObjects(List<T> objects) {
//         this.objects = new ArrayList<T>(objects == null ? Collections.<T>emptyList() : objects);
//         super.notifyDataSetChanged();
//     }
// 
//     public void addAll(List<T> newItems) {
//         objects.addAll(newItems);
//         super.notifyDataSetChanged();
//     }
// 
//     public void add(T newItems) {
//         objects.add(newItems);
//         super.notifyDataSetChanged();
//     }
// 
//     public void addTo(T newItems, int index) {
//         objects.add(index, newItems);
//         super.notifyDataSetChanged();
//     }
// 
//     public T getObject(int position) {
//         return objects.get(position);
//     }
// 
//     public void clear() {
//         setObjects(new ArrayList<T>());
//         super.notifyDataSetChanged();
//     }
//     
//     protected Context getContext() {
//         return context;
//     }
// 
//     protected View createView(Context context, int position) {
//         if (layoutId == UNDEFINED_LAYOUT_ID) {
//             throw new IllegalStateException("Layout identifier for row view is not specified!");
//         }
//         return LayoutInflater.from(context).inflate(layoutId, null);
//     }
// 
//     protected abstract void bind(T object, View view, int position);
// 
//     protected boolean isViewBindable(int position) {
//         return true;
//     }
// }


import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.danikula.aibolit.test.support.Message;
import com.danikula.aibolit.test.support.MutableListAdapter;
            symbolsCountTextVew.setText(symbolsCountText);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    }

    private final class OnSendButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            String text = messageEditText.getText().toString();
            adapter.add(new Message(new Date(), text));
            messageEditText.getEditableText().clear();
        }
    }
    
    private final class OnClearHistoryButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            adapter.clear();
        }
    }

// Path: sample/src/main/java/com/danikula/aibolit/test/support/Message.java
// public class Message {
//     
//     private Date time;
//     
//     private String text;
// 
//     public Message(Date time, String text) {
//         this.time = time;
//         this.text = text;
//     }
// 
//     public Date getTime() {
//         return time;
//     }
// 
//     public String getText() {
//         return text;
//     }
// 
// }
// 
// Path: sample/src/main/java/com/danikula/aibolit/test/support/MutableListAdapter.java
// public abstract class MutableListAdapter<T> extends BaseAdapter {
// 
//     private static final int UNDEFINED_LAYOUT_ID = -1;
// 
//     private Context context;
// 
//     private int layoutId;
// 
//     private List<T> objects = new ArrayList<T>();
// 
//     public MutableListAdapter(Context context, int layoutId) {
//         Validate.notNull(context, "Context should not be null");
//         this.context = context;
//         this.layoutId = layoutId;
//     }
// 
//     @Override
//     public View getView(int position, View convertView, ViewGroup parent) {
//         View view = convertView == null ? createView(context, position) : convertView;
// 
//         if (isViewBindable(position)) {
//             T object = getObject(position);
//             bind(object, view, position);
//         }
// 
//         return view;
//     }
// 
//     @Override
//     public int getCount() {
//         return objects.size();
//     }
// 
//     @Override
//     public Object getItem(int position) {
//         return getObject(position);
//     }
// 
//     @Override
//     public long getItemId(int position) {
//         return position;
//     }
// 
//     public void setObjects(List<T> objects) {
//         this.objects = new ArrayList<T>(objects == null ? Collections.<T>emptyList() : objects);
//         super.notifyDataSetChanged();
//     }
// 
//     public void addAll(List<T> newItems) {
//         objects.addAll(newItems);
//         super.notifyDataSetChanged();
//     }
// 
//     public void add(T newItems) {
//         objects.add(newItems);
//         super.notifyDataSetChanged();
//     }
// 
//     public void addTo(T newItems, int index) {
//         objects.add(index, newItems);
//         super.notifyDataSetChanged();
//     }
// 
//     public T getObject(int position) {
//         return objects.get(position);
//     }
// 
//     public void clear() {
//         setObjects(new ArrayList<T>());
//         super.notifyDataSetChanged();
//     }
//     
//     protected Context getContext() {
//         return context;
//     }
// 
//     protected View createView(Context context, int position) {
//         if (layoutId == UNDEFINED_LAYOUT_ID) {
//             throw new IllegalStateException("Layout identifier for row view is not specified!");
//         }
//         return LayoutInflater.from(context).inflate(layoutId, null);
//     }
// 
//     protected abstract void bind(T object, View view, int position);
// 
//     protected boolean isViewBindable(int position) {
//         return true;
//     }
// }


// Path: sample/src/main/java/com/danikula/aibolit/test/ClassicChatActivity.java
import java.util.Date;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.danikula.aibolit.test.support.Message;
import com.danikula.aibolit.test.support.MutableListAdapter;

            symbolsCountTextVew.setText(symbolsCountText);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    }

    private final class OnSendButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            String text = messageEditText.getText().toString();
            adapter.add(new Message(new Date(), text));
            messageEditText.getEditableText().clear();
        }
    }
    
    private final class OnClearHistoryButtonClickListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            adapter.clear();
        }
    }

    private class LogAdapter extends MutableListAdapter<Message> {