// Path: framework/src/main/java/com/kifile/android/cornerstone/core/DataObserver.java
// public interface DataObserver<DATA> {
// 
//     /**
//      * Watch if the data of {@link DataProvider} is changed.
//      *
//      * @param data
//      */
//     void onDataChanged(DATA data);
// }
// 
// Path: framework/src/main/java/com/kifile/android/cornerstone/impl/Cornerstone.java
// public class Cornerstone extends AbstractDataProviderManager {
// 
//     private static Cornerstone sInstance;
// 
//     private Cornerstone() {
//         // Make Cornerstone singleton.
//     }
// 
//     /**
//      * Use singleton here.
//      *
//      * @return
//      */
//     public static Cornerstone getInstance() {
//         if (sInstance == null) {
//             synchronized (Cornerstone.class) {
//                 if (sInstance == null) {
//                     sInstance = new Cornerstone();
//                 }
//             }
//         }
//         return sInstance;
//     }
// 
//     public static void registerProvider(String key, Class<? extends DataProvider> providerClazz) {
//         getInstance().register(key, providerClazz);
//     }
// 
//     public static DataProvider obtainProvider(String key) {
//         return getInstance().obtain(key);
//     }
// 
//     public static void releaseProvider(String key) {
//         getInstance().release(key);
//     }
// }
// 
// Path: app/src/main/java/com/kifile/android/sample/cornerstone/data/ContactsProvider.java
// public class ContactsProvider extends ContentDataProvider<List<ContactsProvider.Contact>> {
// 
//     public static final String KEY = ContactsProvider.class.getSimpleName();
// 
//     public ContactsProvider() {
//         super(SampleApplication.instance, ContactsContract.Contacts.CONTENT_URI);
//         setFetcher(new AnnotationCursorConverter<>(buildCursorFetcher(), Contact.class));
//     }
// 
//     //    public class ContactConverter extends AbstractFetcherConverter<Cursor, List<Contact>> {
// //
// //        /**
// //         * Wrap the DataFetcher will be transformed.
// //         *
// //         * @param proxy
// //         */
// //        public ContactConverter(DataFetcher<Cursor> proxy) {
// //            super(proxy);
// //        }
// //
// //        @Override
// //        protected List<Contact> convert(Cursor cursor) {
// //            if (cursor != null) {
// //                int nameColumn = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
// //                List<Contact> contacts = new ArrayList<>();
// //                for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
// //                    String name = cursor.getString(nameColumn);
// //                    Contact contact = new Contact();
// //                    contact.name = name;
// //                    contacts.add(contact);
// //                }
// //                cursor.close();
// //                return contacts;
// //            }
// //            return null;
// //        }
// //    }
// 
//     public static class Contact {
// 
//         @Property(name = ContactsContract.Contacts.DISPLAY_NAME)
//         public String name;
// 
//     }
// 
// }


import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.kifile.android.cornerstone.core.DataObserver;
import com.kifile.android.cornerstone.impl.Cornerstone;
import com.kifile.android.sample.cornerstone.data.ContactsProvider;
import java.util.List;
package com.kifile.android.sample.cornerstone;



/**
 * Created by kifile on 15/8/25.
 */
public class ContactFetcherActivity extends ListActivity {

    private ContactsProvider mProvider;

    private DataObserver<List<ContactsProvider.Contact>> mContactObserver = new DataObserver<List<ContactsProvider.Contact>>() {
        @Override
        public void onDataChanged(List<ContactsProvider.Contact> contacts) {
            setListAdapter(new ContactAdapter(ContactFetcherActivity.this, contacts));
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (mProvider == null) {
// Path: framework/src/main/java/com/kifile/android/cornerstone/core/DataObserver.java
// public interface DataObserver<DATA> {
// 
//     /**
//      * Watch if the data of {@link DataProvider} is changed.
//      *
//      * @param data
//      */
//     void onDataChanged(DATA data);
// }
// 
// Path: framework/src/main/java/com/kifile/android/cornerstone/impl/Cornerstone.java
// public class Cornerstone extends AbstractDataProviderManager {
// 
//     private static Cornerstone sInstance;
// 
//     private Cornerstone() {
//         // Make Cornerstone singleton.
//     }
// 
//     /**
//      * Use singleton here.
//      *
//      * @return
//      */
//     public static Cornerstone getInstance() {
//         if (sInstance == null) {
//             synchronized (Cornerstone.class) {
//                 if (sInstance == null) {
//                     sInstance = new Cornerstone();
//                 }
//             }
//         }
//         return sInstance;
//     }
// 
//     public static void registerProvider(String key, Class<? extends DataProvider> providerClazz) {
//         getInstance().register(key, providerClazz);
//     }
// 
//     public static DataProvider obtainProvider(String key) {
//         return getInstance().obtain(key);
//     }
// 
//     public static void releaseProvider(String key) {
//         getInstance().release(key);
//     }
// }
// 
// Path: app/src/main/java/com/kifile/android/sample/cornerstone/data/ContactsProvider.java
// public class ContactsProvider extends ContentDataProvider<List<ContactsProvider.Contact>> {
// 
//     public static final String KEY = ContactsProvider.class.getSimpleName();
// 
//     public ContactsProvider() {
//         super(SampleApplication.instance, ContactsContract.Contacts.CONTENT_URI);
//         setFetcher(new AnnotationCursorConverter<>(buildCursorFetcher(), Contact.class));
//     }
// 
//     //    public class ContactConverter extends AbstractFetcherConverter<Cursor, List<Contact>> {
// //
// //        /**
// //         * Wrap the DataFetcher will be transformed.
// //         *
// //         * @param proxy
// //         */
// //        public ContactConverter(DataFetcher<Cursor> proxy) {
// //            super(proxy);
// //        }
// //
// //        @Override
// //        protected List<Contact> convert(Cursor cursor) {
// //            if (cursor != null) {
// //                int nameColumn = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
// //                List<Contact> contacts = new ArrayList<>();
// //                for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
// //                    String name = cursor.getString(nameColumn);
// //                    Contact contact = new Contact();
// //                    contact.name = name;
// //                    contacts.add(contact);
// //                }
// //                cursor.close();
// //                return contacts;
// //            }
// //            return null;
// //        }
// //    }
// 
//     public static class Contact {
// 
//         @Property(name = ContactsContract.Contacts.DISPLAY_NAME)
//         public String name;
// 
//     }
// 
// }


// Path: app/src/main/java/com/kifile/android/sample/cornerstone/ContactFetcherActivity.java
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.kifile.android.cornerstone.core.DataObserver;
import com.kifile.android.cornerstone.impl.Cornerstone;
import com.kifile.android.sample.cornerstone.data.ContactsProvider;
import java.util.List;

package com.kifile.android.sample.cornerstone;



/**
 * Created by kifile on 15/8/25.
 */
public class ContactFetcherActivity extends ListActivity {

    private ContactsProvider mProvider;

    private DataObserver<List<ContactsProvider.Contact>> mContactObserver = new DataObserver<List<ContactsProvider.Contact>>() {
        @Override
        public void onDataChanged(List<ContactsProvider.Contact> contacts) {
            setListAdapter(new ContactAdapter(ContactFetcherActivity.this, contacts));
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (mProvider == null) {
            mProvider = (ContactsProvider) Cornerstone.obtainProvider(ContactsProvider.KEY);