Deview/src/com/nhn/android/deview/dao/DeviewUri.java
public class DeviewUri extends UriObject{
	public DeviewUri(Uri uri) {
		super(uri);
	}
	public int version;
	public String host;
	public String sessionCode; 
	public String action; //VIEW, ADD, REMOVE
	
}
Deview/src/com/nhn/android/deview/dao/program/ProgramData.java
public class ProgramData {
	public ProgramData(JSONObject json) {
		try {
			Field[] fields = ProgramData.class.getFields();
			for(Field field: fields) 
			{
				String sname = field.getType().getSimpleName();
				String name = field.getName();
				try {
					if (sname.equals("String") == true) {
						String value = json.getString(name);
						field.set(this, value);
					} if (sname.equals("int") == true)  {
						field.setInt(this, json.getInt(name));
					}
				} catch(org.json.JSONException e1) {
					
				}
			}
		} catch(Exception e) {
			e.printStackTrace();
		}		
	}
	
	@DataField(attr = "PRIMARY KEY")
	public String id;
	
	@DataField(name = "name")
	public String name;
	
	@DataField
	public String speaker;
	
	@DataField
	public int seq;
	
	@DataField(name = "programStrt")
	public String programStrt;

	@DataField(name = "programEnd")
	public String programEnd;
	
	@DataField
	public String trackName; //D
	
	@DataField
	public String programName; //Session 1
	
	@DataField
	public String episodeName; //Day 2 
	
	@DataField
	public String url;
	
	
	@DataField
	public boolean isbooked; //	
	public boolean isPassed; //TimePassed
	
	public void checkTime() {
		
	}
	
	public MySchedule mMySchedule = null;
}
Deview/src/com/nhn/android/deview/core/connector/DataConnectorListener.java
public interface DataConnectorListener {
	void onResult(int code,DefaultDataConnector connector);
}
Deview/src/com/nhn/android/deview/core/db/DbTable.java
public class DbTable {
	static HashMap<String,String> TYPEMAP = new HashMap<String, String>(); 
	static {
		TYPEMAP.put("byte", "INTEGER");
		TYPEMAP.put("short", "INTEGER");
		TYPEMAP.put("int", "INTEGER");
		TYPEMAP.put("long", "INTEGER");
		TYPEMAP.put("float", "REAL");
		TYPEMAP.put("double", "REAL");
		TYPEMAP.put("String", "TEXT");
		TYPEMAP.put("byte[]", "BLOB");
		
	}
	public static  boolean createTable(SQLiteDatabase db,String name,Class<?> cls) {
		StringBuilder sb = new StringBuilder();
		sb.append("CREATE TABLE IF NOT EXISTS ");
		sb.append(name);
		sb.append(" (");

		Field[] fields = cls.getFields();
		
		for(int i = 0; i < fields.length; i++) {			
			DataField ref = fields[i].getAnnotation(DataField.class);			
			if (ref != null) {
				String type = fields[i].getType().getSimpleName();
				String colType = TYPEMAP.get(type);
				if (colType == null) {
					return false;
				}
				
				String attr = ref.attr();
				
				if (ref.name().length() > 0) {
					sb.append(ref.name());
				} else {
					sb.append(fields[i].getName());
				}
				sb.append(" ");
				sb.append(type);
				sb.append(" ");
				sb.append(attr);
				if ( fields.length-1 > i ) {
					sb.append(",");
				}
			}
		}
		sb.append(");");
		try {
			db.execSQL(sb.toString());
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		
		return true;
		
	}
	
	public static ContentValues toContentValues(Object object,String[] names) {
		ContentValues values = new ContentValues();
		
		if (names == null) {
		  Field[] fields = object.getClass().getFields();
		  names = new String[fields.length];
		  
		  for(int i = 0; i < fields.length; i++) {
			names[i] = fields[i].getName();  
		  }
		}
		
		for(String name:names) {
			try {
				Field field = object.getClass().getField(name);
				String stype = field.getType().getSimpleName();
				if (stype.equals("int") == true) {
					values.put(name,field.getInt(object));
				} else if (stype.equals("float") == true) {
					values.put(name,field.getFloat(object));
				} else if (stype.equals("String") == true) {
					values.put(name, (String)field.get(object));
				}
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return values;
	}
}
Deview/src/com/nhn/android/deview/dao/program/ProgramTrack.java
public class ProgramTrack {
	
	@DataField
	public int seq;
	
	@DataField
	public int episodeSeq;
	
	@DataField
	public String name;

	@DataField
	public int order;
	
	
	public ProgramTrack(JSONObject track) {	
		try {
			Field[] fields = ProgramTrack.class.getFields();
			for(Field field: fields) 
			{
				String sname = field.getType().getSimpleName();
				String name = field.getName();
				if (sname.equals("String") == true) {
					String value = track.getString(name);
					field.set(this, value);
				} if (sname.equals("int") == true)  {
					field.setInt(this, track.getInt(name));
				}
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public Vector<ProgramData> mTimeTable = new Vector<ProgramData>();
	public Vector<ProgramData> getTrack(int trackId) {
		return mTimeTable;
	}
	
	public boolean hasProgmList() {
		return mTimeTable.size() > 0;
	}
}
Deview/src/com/nhn/android/deview/AppTable.java
public class AppTable {
	public final static String PROGRAM = "program";
	public final static String MYSCHEDULE = "myschedule_tbl";
	public final static String MYMEMO = "mymemo_tbl";
	
}
Deview/src/com/nhn/android/deview/ui/note/MyScheduleActivity.java
public class MyScheduleActivity extends CycleControllerActivity implements OnItemClickListener {
	public String SCHEDULE_TABLE = "memo_tbl";
	
	@DeclareView(id = R.id.scheduleList)
	public ListView mListView;	
	
	@BundleField //
	int seq; 
	
	@BundleField 
	String name;
	
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.activity_myschedule, true);
		BundleMapper.fromIntent(this, getIntent());
		
		Vector<ProgramData> mMyProgram = ProgramManager.getInstance().getMyProgramList();		
		mListView.setAdapter(new ListCellViewAdapter<ProgramData>(ProgramCellView.class,mMyProgram));
		mListView.setOnItemClickListener(this);
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {

		ProgramCellView cellView = (ProgramCellView)view;
		if (cellView.mData != null) {
			Uri uri = Uri.parse("http://deview.kr/2014/session?seq=" + cellView.mData.seq);
			Intent intent = new Intent(Intent.ACTION_VIEW, uri);
			intent.setClass(this, ProgramWebActivity.class);
			startActivity(intent);
		}	
	}


}
Deview/src/com/nhn/android/deview/webviewer/ProgramWebActivity.java
public class ProgramWebActivity extends CycleControllerActivity {
	
	@DeclareView(id = R.id.webPanel)
	FrameLayout webPanel;
	
	@DeclareView(id = R.id.gnbPanel)
	View mGnbPanel;
	
	MemoWebToolbar mToolbar;
	WebPageView mWebPageView ;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_programweb, true);
		Uri uri = getIntent().getData();
		
		mWebPageView = new WebPageView(this);
		webPanel.addView(mWebPageView);
	

		mToolbar = new MemoWebToolbar(mGnbPanel);
		mToolbar.mProgramData = AppContext.getValue(ProgramWebActivity.class, true);
		
		mWebPageView.loadUrl(uri.toString());
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent arg2) {
		super.onActivityResult(requestCode, resultCode, arg2);
		if (requestCode == 100 && resultCode == RESULT_OK) {
			MyMemo memo = mToolbar.mMyMemo;
			MyMemoManager.addMemo(memo);	
		}
		
	}
}
Deview/src/com/nhn/android/deview/ui/note/MemoRecorder.java
public class MemoRecorder extends CycleControllerActivity implements SurfaceHolder.Callback {
	@BundleField
	public boolean isAuidoOnly;
	
	@BundleField
	public String pathName;
	
	@DeclareView(id = R.id.memoVideoPreview)
	SurfaceView mPreview;
		
	MediaRecorder mRecorder;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		BundleMapper.fromIntent(this,getIntent());	
		setContentView(R.layout.activity_memo_recorder, true);
	}
	
	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		startRecord(isAuidoOnly);

	}
	
	//
	@TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
	void startRecord(boolean audioOnly) {
		try {
			mRecorder = new MediaRecorder();
			if (audioOnly == false) {
				mRecorder.setVideoSource(VideoSource.CAMERA);
			}
			
			mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
			
			CamcorderProfile camcorderProfile_HQ = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
			mRecorder.setProfile(camcorderProfile_HQ);
			mPreview.getHolder().addCallback(this);
			mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
			
			//mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
			mRecorder.setOutputFile(pathName);
	
		  // Recording is now started
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	void stopRecord() {

		 if (mRecorder != null) {
			 mRecorder.stop();
			 mRecorder.reset();   // You can reuse the object by going back to setAudioSource() step
			 mRecorder.release();	
			 mRecorder = null;
		 }
	}

	@TargetApi(Build.VERSION_CODES.GINGERBREAD)
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		mRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
		try {
			//mRecorder.setOrientationHint(180);
			mRecorder.prepare();
			mRecorder.start();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
	}
	
}
Deview/src/com/nhn/android/deview/core/connector/DefaultDataConnector.java
public class DefaultDataConnector {

	AsyncHttpClient mHttpClient;
	
	Class<?> mRoot;
	public boolean open(InputStream in,Class<?> cls) {
		String json = "";
		try {
			JSONObject jobject = new JSONObject(json);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return true;
	}
	
	public boolean open(String url) {
		mHttpClient = new AsyncHttpClient();
		mHttpClient.get(url, mResponseHandler);
		return false;
		
	}
	
	public DataDoc getResultDoc() {
		return null;
	}
	
	public void onReceive(byte[] response) {
		
	}

	AsyncHttpResponseHandler mResponseHandler = new AsyncHttpResponseHandler() {
		    @Override
		    public void onStart() {
		    }

		    @Override
		    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
		        // called when response HTTP status is "200 OK"
		    	onReceive(response);
		    	
		    }

		    @Override
		    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
		        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
		    }

		    @Override
		    public void onRetry(int retryNo) {
			}
		};
}
Deview/src/com/nhn/android/deview/core/lifecycle/CycleControllerActivity.java
public class CycleControllerActivity extends FragmentActivity {
	protected CycleController mLFContoller = new CycleController();
	
	public CycleController getCycleController() {
		return mLFContoller;
	}
	
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
    	requestWindowFeature(Window.FEATURE_NO_TITLE);
	}
	
	public void setContentView(int layoutResID,boolean isViewMap) {
		if (isViewMap == true) {
			setContentView(layoutResID);			
			ViewMapper.mapLayout(this, getWindow().getDecorView());
		} else {
			setContentView(layoutResID);
		}
	}
	@Override
	protected void onResume() {
		super.onResume();
		mLFContoller.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		mLFContoller.onPause();
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		mLFContoller.onStop();
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		mLFContoller.finish();
	}
	
	@Override
	protected void onActivityResult(int arg0, int arg1, Intent arg2) {
		super.onActivityResult(arg0, arg1, arg2);
		mLFContoller.onActivityResult();
	}
}
Deview/src/com/nhn/android/deview/dao/program/TrackListConnector.java
public class TrackListConnector extends DefaultDataConnector {
	DataConnectorListener mListener;
	
	public void open(DataConnectorListener l) {
		mListener = l;
		open("http://deview.kr/2014/app/trackMap");
	}
	
	@Override
	public void onReceive(byte[] response) {
		String json;
		try {
			json = new String(response,"UTF-8");
			ProgramManager.getInstance().parseTrack(json);
			mHandler.obtainMessage(200).sendToTarget();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	

	final Handler mHandler = new Handler(new Handler.Callback() {
		@Override
		public boolean handleMessage(Message arg0) {
			mListener.onResult(200, TrackListConnector.this);
			return false;
		}
	});
	
	
}
Deview/src/com/nhn/android/deview/core/listview/PageViewPagerAdapter.java
public class PageViewPagerAdapter<TYPE> extends PagerAdapter {
	public Vector<ProgramTrack> mTracks = null;
	public HashMap<Integer, Object> mViews = new HashMap();
	
	Class<?> mPageCls;
	public PageViewPagerAdapter(Class<?> pagecls) {
		mPageCls = pagecls;
	}
	
	@Override
	public int getCount() {
		if (mTracks != null) {
			return mTracks.size();
		}
		return 0;
	}

	
	@Override
	public CharSequence getPageTitle(int position) {
		return mTracks.get(position).name;
	}
	
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;
	}
	
	public Object getView(int position) {
		return mViews.get(position);
	}
	
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		PageView<TYPE> pageView = null;
		try {
			pageView = (PageView<TYPE>)mPageCls.getConstructor(Context.class).
					newInstance(container.getContext());
		} catch (Exception e) {
			e.printStackTrace();
		}
		pageView.setItemData(position,(TYPE) mTracks.get(position));
		container.addView(pageView);
		
		mViews.put(position, pageView);
		return pageView;
	}
	
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView((View)object);
		mViews.remove(position);
	}

}
Deview/src/com/nhn/android/deview/AppContext.java
public class AppContext {
	public static final String PREF_KEY = "deview";
	
	public static Context getContext() {
		return DeViewApplication.mInstance;
	}
	
	public static SQLiteDatabase getDB() {
		return DeViewApplication.mInstance.mDB.mDB;
	}
	
	/* AppContext Storage: Data Transfer  */
	public static void putValue(Class<?> cls,Object value) {
		String key = cls.getName();
		 DeViewApplication.mInstance.saveObject(key, value);
	}
	
	public static<T> T getValue(Class<?> cls,boolean remove) {
		String key = cls.getName();
		T t = (T)DeViewApplication.mInstance.loadObject(key,remove);	 
		return t;
	}
	//TO store key-values
	public static void putValue(String key,Object value) {
		 DeViewApplication.mInstance.saveObject(key, value);
	}
	
	public static<T> T getValue(String key,boolean remove) {
		T t = (T)DeViewApplication.mInstance.loadObject(key,remove);	 
		return t;
	}
	
	//Shared Preference 
	public static SharedPreferences getAppPref() {
		SharedPreferences pref = getContext().getSharedPreferences(PREF_KEY, 0);
		return pref;
	}

	//To redirect  to UI Thread
	public static void post(Runnable r) {
		DeViewApplication.mInstance.mHandler.post(r);
	}
	
	public static void postDelayed(Runnable r,int millis) {
		DeViewApplication.mInstance.mHandler.postDelayed(r,millis);
	}
	
	// UI Conversion
	public static int dp2px(float dp) {
		return (int)(DeViewApplication.mInstance.mDesity * dp);
	}
	
	public static int getScreenWidth() {
		return DeViewApplication.mInstance.mDisplay.getWidth();
	}
}
Deview/src/com/nhn/android/deview/dao/program/ProgramManager.java
public class ProgramManager {
	
	static ProgramManager mInstance = null;
	public static ProgramManager getInstance() {
		if (mInstance == null) {
			mInstance = new ProgramManager();
		}
		return mInstance;
	}
	
	public Vector<ProgramTrack>  mTracks = new Vector<ProgramTrack>();	
	public HashMap<String,ProgramData> mProgramMap = new HashMap<String, ProgramData>();
	
	public void parseTrack(String json) {
		JSONObject root;
		try {
			root = new JSONObject(json);
			JSONObject trackMap = root.getJSONObject("trackMap");
			JSONArray trackArray = trackMap.getJSONArray("DAY 1");
			for (int i = 0; i< trackArray.length(); i++) {
				ProgramTrack trackData = new ProgramTrack((JSONObject)trackArray.get(i));
				mTracks.add(trackData);
			}
						
			trackArray = trackMap.getJSONArray("DAY 2");
			for (int i = 0; i< trackArray.length(); i++) {
				ProgramTrack trackData = new ProgramTrack((JSONObject)trackArray.get(i));
				mTracks.add(trackData);
			}
			/*
			for (ProgramTrack t: mTracks) {
				ProgramListConnector c= new ProgramListConnector();
				c.open(t, null);
			}*/
		} catch (JSONException e) {
			e.printStackTrace();
		}
	
		
	}

	public void setProgramList(ProgramTrack track,Vector<ProgramData> list) {
	{
				Collections.sort(list,new Comparator<ProgramData>() {
					@Override
					public int compare(ProgramData lhs, ProgramData rhs) {
						return lhs.programStrt.compareTo(rhs.programStrt);
					}
				});
				
				track.mTimeTable = list;
				for (ProgramData data:list) {
					mProgramMap.put(data.id, data);
				}
				
				return;
			}
		
	}

	public Vector<ProgramData> getProgramList(String trackName,int seq) {
		for(ProgramTrack t: mTracks) {
			if (t.seq == seq) {
				return t.mTimeTable;
			}
		}
		return null;
	}
	
	public ProgramData getProgram(String id) {
		return mProgramMap.get(id);
	}
	
	public Vector<ProgramData> getMyProgramList() {

		Vector<ProgramData> mMyProgram = new Vector<ProgramData>();
		
		Cursor c = AppContext.getDB().query(AppTable.MYSCHEDULE, null , null, null, null, null, null);
		
		Vector<MySchedule> listData = CursorReader.readAll(c, MySchedule.class);
		
		for (int i = 0; i < listData.size(); i++) {
			MySchedule schedule = listData.get(i);
			ProgramData item = ProgramManager.getInstance().mProgramMap.get(schedule.id);
			
			if (item != null) {
				item.mMySchedule = schedule;
				mMyProgram.add(item);
			}
		}
		
		Collections.sort(mMyProgram,new Comparator<ProgramData>() {
			@Override
			public int compare(ProgramData lhs, ProgramData rhs) {
				return lhs.programStrt.compareTo(rhs.programStrt);
			}
		});
		return mMyProgram;
	}
		
	
	public boolean addMySchedule(ProgramData data) {
 		ContentValues values = DbTable.toContentValues(new MySchedule(data), null);
		SQLiteDatabase db = AppContext.getDB();
		long result = db.insert(AppTable.MYSCHEDULE , null, values);
		return result >= 0;
	}
}


Question: package com.nhn.android.deview.ui.main;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import com.nhn.android.deview.AppContext;
import com.nhn.android.deview.R;
import com.nhn.android.deview.R.id;
import com.nhn.android.deview.R.layout;
import com.nhn.android.deview.AppTable;
import com.nhn.android.deview.core.connector.DataConnectorListener;
import com.nhn.android.deview.core.connector.DefaultDataConnector;
import com.nhn.android.deview.core.db.DbTable;
import com.nhn.android.deview.core.lifecycle.CycleControllerActivity;
import com.nhn.android.deview.core.listview.PageViewPagerAdapter;
import com.nhn.android.deview.core.view.DeclareView;
import com.nhn.android.deview.dao.DeviewUri;
import com.nhn.android.deview.dao.program.ProgramData;
import com.nhn.android.deview.dao.program.ProgramManager;
import com.nhn.android.deview.dao.program.ProgramTrack;
import com.nhn.android.deview.dao.program.TrackListConnector;
import com.nhn.android.deview.ui.note.MemoRecorder;
import com.nhn.android.deview.ui.note.MyScheduleActivity;
import com.nhn.android.deview.webviewer.ProgramWebActivity;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.PopupMenu;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentPagerAdapter;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;




public class MainActivity extends CycleControllerActivity implements View.OnClickListener {

	@DeclareView(id = R.id.mainButton,click = "this")
	Button mMenuButton;
	
	@DeclareView(id = R.id.pager)
    ViewPager mViewPager;

	@DeclareView(id = R.id.day1Button,click = "this")
	Button mDay1Button;

	@DeclareView(id = R.id.day2Button,click = "this")
	Button mDay2Button;

	@Override
	public void onClick(View  view) {
		switch (view.getId()) {
		case R.id.day1Button:
			mViewPager.setCurrentItem(0);
			break;
		case R.id.day2Button:
			mViewPager.setCurrentItem(4);
			break;
		case R.id.mainButton:
	          PopupMenu popup = new PopupMenu(MainActivity.this, mMenuButton);  
	          popup.getMenuInflater().inflate(R.menu.main, popup.getMenu());  
	          popup.setOnMenuItemClickListener(mOnMenuItemClickListener);  
	          popup.show();//showing popup menu  			
			break;
		}
	}
   
   private  PageViewPagerAdapter<ProgramTrack> adapter ;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.activity_main,true); //setViewMap
  
        TrackListConnector connector = new TrackListConnector();
        connector.open(new DataConnectorListener() {
			@Override
Answer: 			public void onResult(int code, DefaultDataConnector connector) {