Ray Zhang 12 年 前
コミット
741b920445

+ 7 - 2
Apex/AndroidManifest.xml

@@ -7,7 +7,7 @@
     <!-- Copied from Google Maps Library/AndroidManifest.xml. -->
     <uses-sdk
         android:maxSdkVersion="19"
-        android:minSdkVersion="10"
+        android:minSdkVersion="14"
         android:targetSdkVersion="17" />
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -56,7 +56,7 @@
         <activity
             android:name="com.usai.apex.DirectTrackingFragment"
             android:label="@string/title_activity_direct_tracking" >
-        </activity>

+        </activity>


         -->
         <activity
             android:name="com.usai.apex.FunctionSelectActivity"
@@ -86,6 +86,11 @@
             android:name="com.usai.apex.InnerMapActivity"
             android:label="@string/title_activity_inner_map" >
         </activity>
+        <activity
+            android:name="com.usai.apex.HelpActivity"
+            android:theme="@android:style/Theme.Holo.NoActionBar"
+            android:label="@string/title_activity_help" >
+        </activity>
     </application>
 
 </manifest>

BIN
Apex/res/drawable/help_fields.jpg


BIN
Apex/res/drawable/help_search.jpg


+ 1 - 0
Apex/res/layout/activity_customize_fields.xml

@@ -41,4 +41,5 @@
                 android:text="@android:string/ok" />
         </LinearLayout>
     </LinearLayout>
+
 </RelativeLayout>

+ 17 - 0
Apex/res/layout/activity_help.xml

@@ -0,0 +1,17 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+
+    tools:context=".HelpActivity" >
+
+    <ImageView
+        android:id="@+id/iv_help"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_alignParentTop="true"
+        android:layout_centerHorizontal="true"
+        android:scaleType="fitXY"
+        android:src="@drawable/help_fields" />
+
+</RelativeLayout>

+ 1 - 1
Apex/res/layout/fragment_login.xml

@@ -46,7 +46,7 @@
                 android:id="@+id/user"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:hint="@string/prompt_email"
+                android:hint="@string/prompt_user"
                 android:inputType="textAutoComplete"
                 android:maxLines="1"
                 android:singleLine="true"

+ 1 - 0
Apex/res/layout/search_lvitem_edit.xml

@@ -17,6 +17,7 @@
         android:id="@+id/edit_val"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
+        android:hint="@string/prompt_search_criterion"
         android:layout_alignParentLeft="true"
         android:layout_below="@+id/aliasName"
         android:ems="15"

+ 8 - 3
Apex/res/menu/customize_fields.xml

@@ -1,9 +1,14 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 
-    <item
+<!--     <item
         android:id="@+id/action_settings"
         android:orderInCategory="100"
         android:showAsAction="never"
-        android:title="@string/action_settings"/>
-
+        android:title="@string/action_settings"/> -->
+    <item
+        android:id="@+id/action_help"
+        android:orderInCategory="200"
+        android:showAsAction="always"
+        android:icon="@android:drawable/ic_menu_help"
+        android:title="@string/action_help"/>
 </menu>

+ 9 - 0
Apex/res/menu/help.xml

@@ -0,0 +1,9 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <item
+        android:id="@+id/action_settings"
+        android:orderInCategory="100"
+        android:showAsAction="never"
+        android:title="@string/action_settings"/>
+
+</menu>

+ 6 - 0
Apex/res/menu/search.xml

@@ -5,5 +5,11 @@
         android:orderInCategory="100"
         android:showAsAction="never"
         android:title="@string/action_custom_fields"/>
+    <item
+        android:id="@+id/action_help"
+        android:orderInCategory="200"
+        android:showAsAction="always"
+        android:icon="@android:drawable/ic_menu_help"
+        android:title="@string/action_help"/>
 
 </menu>

+ 17 - 0
Apex/res/values/strings.xml

@@ -4,6 +4,7 @@
     <string name="app_name">Apex</string>
     <string name="action_settings">Settings</string>
     <string name="action_custom_fields">Customize Fields</string>
+    <string name="action_help">Help</string>
     <string name="hello_world">Hello world!</string>
     <string name="msg_net_resulterror">An error occur on server</string>
     <string name="msg_net_error">Can not connect to server</string>
@@ -17,5 +18,21 @@
     <string name="title_activity_result">ResultActivity</string>
     <string name="title_activity_location_detail">LocationDetail</string>
     <string name="title_activity_inner_map">InnerMapActivity</string>
+    <string name="title_activity_login">Login</string>
+    <string name="prompt_search_criterion">Enter criterion</string>
+
+    <!-- Strings related to login -->
+    <string name="prompt_email">Email</string>
+    <string name="prompt_user">User</string>
+    <string name="prompt_password">Password</string>
+    <string name="action_sign_in_register"><b>Sign in</b></string>
+    <string name="action_sign_in_short">Sign in</string>
+    <string name="action_forgot_password">Recover lost password</string>
+    <string name="login_progress_signing_in">Signing in&#8230;</string>
+    <string name="error_invalid_email">This email address is invalid</string>
+    <string name="error_invalid_password">This password is too short</string>
+    <string name="error_incorrect_password">This password is incorrect</string>
+    <string name="error_field_required">This field is required</string>
+    <string name="title_activity_help">HelpActivity</string>
 
 </resources>

+ 0 - 17
Apex/res/values/strings_activity_login.xml

@@ -1,17 +0,0 @@
-<resources>
-
-    <string name="title_activity_login">Login</string>
-
-    <!-- Strings related to login -->
-    <string name="prompt_email">Email</string>
-    <string name="prompt_password">Password</string>
-    <string name="action_sign_in_register"><b>Sign in</b></string>
-    <string name="action_sign_in_short">Sign in</string>
-    <string name="action_forgot_password">Recover lost password</string>
-    <string name="login_progress_signing_in">Signing in&#8230;</string>
-    <string name="error_invalid_email">This email address is invalid</string>
-    <string name="error_invalid_password">This password is too short</string>
-    <string name="error_incorrect_password">This password is incorrect</string>
-    <string name="error_field_required">This field is required</string>
-
-</resources>

+ 118 - 95
Apex/src/com/usai/apex/ApexActivity.java

@@ -8,13 +8,32 @@ import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentTransaction;
+import android.view.KeyEvent;
 import android.view.Menu;
 import android.widget.TabHost;
 
-public class ApexActivity extends FragmentActivity /*implements OnTabChangeListener*/
+public class ApexActivity extends FragmentActivity /*
+													 * implements
+													 * OnTabChangeListener
+													 */
 {
 
+	@Override
+	public boolean onKeyDown(int keyCode, KeyEvent event)
+	{
+		if (keyCode == KeyEvent.KEYCODE_BACK)
+		{
+			// Intent myIntent = new Intent();
+			// myIntent = new Intent(EditActivity.this, tabActivity.class);
+			// startActivity(myIntent);
+			finish();
+			return true;
+		}
+		return super.onKeyDown(keyCode, event);
+	}
+
 	TabHost mTabHost;
+
 	@Override
 	protected void onCreate(Bundle savedInstanceState)
 	{
@@ -30,98 +49,102 @@ public class ApexActivity extends FragmentActivity /*implements OnTabChangeListe
 		getMenuInflater().inflate(R.menu.apex, menu);
 		return true;
 	}
-    private void setupTabs() {
-        mTabHost = (TabHost) this.findViewById(R.id.tabhost);
-        
-        mTabHost.setup();
-//        // 生成底部自定义样式的按钮
-//        String[] title = new String[] { "Login", "Not login" };
-//        int[] tabIds = new int[] { R.id.tab1, R.id.tab2 };
-        mTabHost.addTab(mTabHost.newTabSpec("Login").setIndicator("Login").setContent(R.id.tab1));
-//        mTabHost.addTab(mTabHost.newTabSpec("Direct Tracking").setIndicator("Direct Tracking").setContent(R.id.tab2));
-        mTabHost.addTab(mTabHost.newTabSpec("Service Location").setIndicator("Service Location").setContent(R.id.tab3));
-        
-		//FragmentManager manager = this.getFragmentManager();
-	   
-	    // Instantiate a new fragment.
-	    Fragment loginFragment = new LoginFragment();
-	    Fragment dtFragement = new DirectTrackingFragment();
-	    Fragment slFragment=  new ServiceLocationFragment();
-	    // Add the fragment to the activity, pushing this transaction
-	    // on to the back stack.
-	    
-	    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-	    ft.replace(R.id.tab1, loginFragment);
-	    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
-	    ft.addToBackStack("Login");
-	    
-//	    ft.replace(R.id.tab2, dtFragement);
-//	    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
-//	    ft.addToBackStack("Tracking");
-
-	    ft.replace(R.id.tab3, (Fragment)slFragment);
-	    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
-	    ft.addToBackStack("Location");
-	    
-	    ft.commit();
-
-//		if (manager.findFragmentByTag(tabId) == null)
-//		{
-//			FragmentTransaction trans = manager.beginTransaction();
-//			trans.replace(contentViewID, frag, tabId);
-//			trans.commit();
-//		}
-//        for (int i = 0; i < title.length; i++) {
-//            Button button = new Button(this);
-//            button.setText(title[i]);
-//            button.setBackgroundDrawable(this.getResources().getDrawable(
-//                    R.drawable.tab_lable));  //自定义按钮样式
-//            mTabHost.addTab(mTabHost.newTabSpec(title[i]).setIndicator(button)
-//                    .setContent(tabIds[i]));
-//        }
-
-    //    mTabHost.setOnTabChangedListener(this);
-    }
-
-//	@Override
-//	public void onTabChanged(String tabId)
-//	{
-		// TODO Auto-generated method stub
-//        Fragment frag = null;
-//        int contentViewID = 0;
-//        if (tabId.equals("Login")) {
-//            frag = new LoginFragment(); //自定义继承Fragment的UI,放了一个简单的显示文本标题的控件。
-//            contentViewID = R.id.tab1;
-//        } else if (tabId.equals("Not login")) {
-//            frag = new DirectTrackingFragment();
-//            contentViewID = R.id.tab2;
-//        }
-//        if (frag == null)
-//            return;
-//
-//        FragmentManager manager = this.getFragmentManager();
-//
-//        if (manager.findFragmentByTag(tabId) == null) {
-//            FragmentTransaction trans = manager.beginTransaction();
-//            trans.replace(contentViewID, frag, tabId);
-//            trans.commit();
-//        }		
-//	}
-//	public class LoginFragment extends Fragment implements OnClickListener{
-//	    @Override
-//	    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-//	                    Bundle savedInstanceState) {
-//	        View view = inflater.inflate(R.layout.activity_login, null);
-//	        Button btn = (Button)view.findViewById(R.id.sign_in_button);
-//	        btn.setOnClickListener(this);
-//	        return view;
-//	    }
-//
-//		@Override
-//		public void onClick(View v)
-//		{
-//			// TODO Auto-generated method stub
-//			
-//		}
-//	}
+
+	private void setupTabs()
+	{
+		mTabHost = (TabHost) this.findViewById(R.id.tabhost);
+
+		mTabHost.setup();
+		// // 生成底部自定义样式的按钮
+		// String[] title = new String[] { "Login", "Not login" };
+		// int[] tabIds = new int[] { R.id.tab1, R.id.tab2 };
+		mTabHost.addTab(mTabHost.newTabSpec("Login").setIndicator("Login")
+				.setContent(R.id.tab1));
+		// mTabHost.addTab(mTabHost.newTabSpec("Direct Tracking").setIndicator("Direct Tracking").setContent(R.id.tab2));
+		mTabHost.addTab(mTabHost.newTabSpec("Service Location")
+				.setIndicator("Service Location").setContent(R.id.tab3));
+
+		// FragmentManager manager = this.getFragmentManager();
+
+		// Instantiate a new fragment.
+		Fragment loginFragment = new LoginFragment();
+		Fragment dtFragement = new DirectTrackingFragment();
+		Fragment slFragment = new ServiceLocationFragment();
+		// Add the fragment to the activity, pushing this transaction
+		// on to the back stack.
+
+		FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+		ft.replace(R.id.tab1, loginFragment);
+		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+		ft.addToBackStack("Login");
+
+		// ft.replace(R.id.tab2, dtFragement);
+		// ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+		// ft.addToBackStack("Tracking");
+
+		ft.replace(R.id.tab3, (Fragment) slFragment);
+		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+		ft.addToBackStack("Location");
+
+		ft.commit();
+
+		// if (manager.findFragmentByTag(tabId) == null)
+		// {
+		// FragmentTransaction trans = manager.beginTransaction();
+		// trans.replace(contentViewID, frag, tabId);
+		// trans.commit();
+		// }
+		// for (int i = 0; i < title.length; i++) {
+		// Button button = new Button(this);
+		// button.setText(title[i]);
+		// button.setBackgroundDrawable(this.getResources().getDrawable(
+		// R.drawable.tab_lable)); //自定义按钮样式
+		// mTabHost.addTab(mTabHost.newTabSpec(title[i]).setIndicator(button)
+		// .setContent(tabIds[i]));
+		// }
+
+		// mTabHost.setOnTabChangedListener(this);
+	}
+
+	// @Override
+	// public void onTabChanged(String tabId)
+	// {
+	// TODO Auto-generated method stub
+	// Fragment frag = null;
+	// int contentViewID = 0;
+	// if (tabId.equals("Login")) {
+	// frag = new LoginFragment(); //自定义继承Fragment的UI,放了一个简单的显示文本标题的控件。
+	// contentViewID = R.id.tab1;
+	// } else if (tabId.equals("Not login")) {
+	// frag = new DirectTrackingFragment();
+	// contentViewID = R.id.tab2;
+	// }
+	// if (frag == null)
+	// return;
+	//
+	// FragmentManager manager = this.getFragmentManager();
+	//
+	// if (manager.findFragmentByTag(tabId) == null) {
+	// FragmentTransaction trans = manager.beginTransaction();
+	// trans.replace(contentViewID, frag, tabId);
+	// trans.commit();
+	// }
+	// }
+	// public class LoginFragment extends Fragment implements OnClickListener{
+	// @Override
+	// public View onCreateView(LayoutInflater inflater, ViewGroup container,
+	// Bundle savedInstanceState) {
+	// View view = inflater.inflate(R.layout.activity_login, null);
+	// Button btn = (Button)view.findViewById(R.id.sign_in_button);
+	// btn.setOnClickListener(this);
+	// return view;
+	// }
+	//
+	// @Override
+	// public void onClick(View v)
+	// {
+	// // TODO Auto-generated method stub
+	//
+	// }
+	// }
 }

+ 120 - 57
Apex/src/com/usai/apex/CustomizeFieldsActivity.java

@@ -10,10 +10,15 @@ import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager.NameNotFoundException;
 //import android.content.DialogInterface.OnClickListener;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
@@ -21,7 +26,8 @@ import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.TextView;
 
-public class CustomizeFieldsActivity extends Activity implements OnClickListener
+public class CustomizeFieldsActivity extends Activity implements
+		OnClickListener
 {
 	//
 	// @Override
@@ -31,15 +37,13 @@ public class CustomizeFieldsActivity extends Activity implements OnClickListener
 	// setContentView(R.layout.activity_customize_fields);
 	// }
 	//
-	// @Override
-	// public boolean onCreateOptionsMenu(Menu menu)
-	// {
-	// // Inflate the menu; this adds items to the action bar if it is present.
-	// getMenuInflater().inflate(R.menu.customize_fields, menu);
-	// return true;
-	// }
-
-
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu)
+	{
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.customize_fields, menu);
+		return true;
+	}
 
 	private static List<fieldedit> list = null;
 	private DragListAdapter adapter = null;
@@ -73,19 +77,65 @@ public class CustomizeFieldsActivity extends Activity implements OnClickListener
 		function_name = getIntent().getStringExtra("function_name");
 		behavior = getIntent().getIntExtra("behavior", -1);
 		setContentView(R.layout.activity_customize_fields);
-		Button btnok= (Button)findViewById(R.id.btnok);
+		Button btnok = (Button) findViewById(R.id.btnok);
 		btnok.setOnClickListener(this);
-		Button btncancel= (Button)findViewById(R.id.btncancel);
+		Button btncancel = (Button) findViewById(R.id.btncancel);
 		btncancel.setOnClickListener(this);
-		
 
 		initData();
 
 		DragListView dragListView = (DragListView) findViewById(R.id.drag_list);
 		adapter = new DragListAdapter(this, list);
 		dragListView.setAdapter(adapter);
+		
+		SharedPreferences RunOnce = getSharedPreferences("Apex", 0);
+		
+		String vername;
+		try
+		{
+			vername = getPackageManager().getPackageInfo(
+					"com.usai.apex", 0).versionName;
+			boolean bFirstRun = RunOnce.getBoolean(
+					"FirstRun"+vername+"_fields", true);
+			if(bFirstRun)
+			{
+				SharedPreferences.Editor editor = RunOnce.edit();
+				editor.putBoolean("FirstRun"+vername+"_fields", false);
+				// Don't forget to commit your edits!!!
+				editor.commit();
+				Intent intent = new Intent();
+				intent.setClass(this, HelpActivity.class);
+				intent.putExtra("caller", "fields");
+				startActivity(intent);
+				
+			}		
+		}
+		catch (NameNotFoundException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 	}
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item)
+	{
+		switch (item.getItemId())
+		{
+		case R.id.action_help:
+			Intent intent = new Intent();
+			intent.setClass(this, HelpActivity.class);
+			intent.putExtra("caller", "fields");
+//			// intent.putExtra("password", password);
+//			intent.putExtra("function_name", function_name);
+//			intent.putExtra("behavior", Network.BEHAVIOR_SEARCH);
+			startActivity(intent);
+			break;
 
+		default:
+			break;
+		}
+		return super.onOptionsItemSelected(item);
+	}
 	public void initData()
 	{
 		SQLiteDatabase db = dbUtil.OpenDB(this, null, false);
@@ -149,7 +199,7 @@ public class CustomizeFieldsActivity extends Activity implements OnClickListener
 		@Override
 		public boolean isEnabled(int position)
 		{
-			if (getItem(position)._id < 0) //_id<0 means a group key
+			if (getItem(position)._id < 0) // _id<0 means a group key
 				return false;
 			// if (groupKey.contains(getItem(position).name))
 			// {
@@ -159,22 +209,33 @@ public class CustomizeFieldsActivity extends Activity implements OnClickListener
 			return super.isEnabled(position);
 		}
 
+		public int switchpos()
+		{
+
+			for (int i = 1; i < getCount(); i++)
+			{
+				if (getItem(i)._id < 0)
+					return i;
+			}
+			return -1;
+		}
+
 		@Override
 		public View getView(int position, View convertView, ViewGroup parent)
 		{
 
 			View view = convertView;
-			if(getItem(position)._id<0) //_id<0 means a group key
+			if (getItem(position)._id < 0) // _id<0 means a group key
 			{
 				view = LayoutInflater.from(getContext()).inflate(
-				R.layout.drag_list_item_tag, null);
+						R.layout.drag_list_item_tag, null);
 			}
-//			if (groupKey.contains(getItem(position).name))
-//			{
-//				// 如果是分组标签,就加载分组标签的布局文件,两个布局文件显示效果不同
-//				view = LayoutInflater.from(getContext()).inflate(
-//						R.layout.drag_list_item_tag, null);
-//			}
+			// if (groupKey.contains(getItem(position).name))
+			// {
+			// // 如果是分组标签,就加载分组标签的布局文件,两个布局文件显示效果不同
+			// view = LayoutInflater.from(getContext()).inflate(
+			// R.layout.drag_list_item_tag, null);
+			// }
 			else
 			{
 				// 如果是正常数据项标签,就加在正常数据项的布局文件
@@ -197,60 +258,62 @@ public class CustomizeFieldsActivity extends Activity implements OnClickListener
 		{
 		case R.id.btnok:
 		{
-//			DragListView dragListView = (DragListView) findViewById(R.id.drag_list);
-			int count=0;
-			for(int i=0;i<adapter.getCount();i++)
+			// DragListView dragListView = (DragListView)
+			// findViewById(R.id.drag_list);
+			int count = 0;
+			for (int i = 0; i < adapter.getCount(); i++)
 			{
-				fieldedit fe=adapter.getItem(i);
-				if(fe._id==-2||count>0)
+				fieldedit fe = adapter.getItem(i);
+				if (fe._id == -2 || count > 0)
 					break;
-				if(fe._id>=0)
+				if (fe._id >= 0)
 					count++;
-				
+
 			}
-			if(count==0)
+			if (count == 0)
 			{
 				new AlertDialog.Builder(CustomizeFieldsActivity.this)
-				.setIcon(android.R.drawable.ic_dialog_info)
-				.setTitle("Error!")
-				.setMessage("You must set at least 1 field visiable!")
-				.setPositiveButton("OK",
-						new DialogInterface.OnClickListener()
-						{
-							public void onClick(
-									DialogInterface dialog,
-									int whichButton)
-							{
-
-//								finish();
-								/* User clicked OK so do some stuff */
-							}
-						}).show();
+						.setIcon(android.R.drawable.ic_dialog_info)
+						.setTitle("Error!")
+						.setMessage("You must set at least 1 field visiable!")
+						.setPositiveButton("OK",
+								new DialogInterface.OnClickListener()
+								{
+									public void onClick(DialogInterface dialog,
+											int whichButton)
+									{
+
+										// finish();
+										/* User clicked OK so do some stuff */
+									}
+								}).show();
 				break;
-				
+
 			}
-			
+
 			int show = 1;
-			SQLiteDatabase db= dbUtil.OpenDB(this, null, true);
+			SQLiteDatabase db = dbUtil.OpenDB(this, null, true);
 			db.beginTransaction();
-			for(int i=0;i<adapter.getCount();i++)
+			for (int i = 0; i < adapter.getCount(); i++)
 			{
-				fieldedit fe=adapter.getItem(i);
-				if(fe._id==-2)//hide group begin
+				fieldedit fe = adapter.getItem(i);
+				if (fe._id == -2)// hide group begin
 				{
 					show = 0;
 				}
-				if(show==1)
-					db.execSQL("update fields_info set show="+show+" ,priority="+i+" where _id="+fe._id);
+				if (show == 1)
+					db.execSQL("update fields_info set show=" + show
+							+ " ,priority=" + i + " where _id=" + fe._id);
 				else
-					db.execSQL("update fields_info set show="+show+" where _id="+fe._id);
-					
+					db.execSQL("update fields_info set show=" + show
+							+ " where _id=" + fe._id);
+
 			}
 			db.setTransactionSuccessful();
 			db.endTransaction();
 			dbUtil.CloseDB(db);
 			finish();
-//			Log.d("fields",);
+			// Log.d("fields",);
 			break;
 		}
 		case R.id.btncancel:
@@ -260,7 +323,7 @@ public class CustomizeFieldsActivity extends Activity implements OnClickListener
 			break;
 		}
 		// TODO Auto-generated method stub
-		
+
 	}
 
 }

+ 261 - 176
Apex/src/com/usai/apex/DragListView.java

@@ -4,6 +4,7 @@ import com.usai.apex.CustomizeFieldsActivity.DragListAdapter;
 import com.usai.apex.CustomizeFieldsActivity.fieldedit;
 
 import android.content.Context;
+import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.PixelFormat;
 import android.util.AttributeSet;
@@ -20,180 +21,264 @@ import android.widget.Toast;
 
 public class DragListView extends ListView
 {
-    
-  private ImageView dragImageView;//被拖拽的项,其实就是一个ImageView  
-  private int dragSrcPosition;//手指拖动项原始在列表中的位置  
-  private int dragPosition;//手指拖动的时候,当前拖动项在列表中的位置  
-    
-  private int dragPoint;//在当前数据项中的位置  
-  private int dragOffset;//当前视图和屏幕的距离(这里只使用了y方向上)  
-    
-  private WindowManager windowManager;//windows窗口控制类  
-  private WindowManager.LayoutParams windowParams;//用于控制拖拽项的显示的参数  
-    
-  private int scaledTouchSlop;//判断滑动的一个距离  
-  private int upScrollBounce;//拖动的时候,开始向上滚动的边界  
-  private int downScrollBounce;//拖动的时候,开始向下滚动的边界  
-    
-  public DragListView(Context context, AttributeSet attrs) {  
-      super(context, attrs);  
-      scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();  
-  }  
-    
-  //拦截touch事件,其实就是加一层控制  
-  @Override  
-  public boolean onInterceptTouchEvent(MotionEvent ev) {  
-      if(ev.getAction()==MotionEvent.ACTION_DOWN){  
-          int x = (int)ev.getX();  
-          int y = (int)ev.getY();  
-            
-          dragSrcPosition = dragPosition = pointToPosition(x, y);  
-          if(dragPosition==AdapterView.INVALID_POSITION){  
-              return super.onInterceptTouchEvent(ev);  
-          }  
-
-          ViewGroup itemView = (ViewGroup) getChildAt(dragPosition-getFirstVisiblePosition());  
-          dragPoint = y - itemView.getTop();  
-          dragOffset = (int) (ev.getRawY() - y);  
-            
-          View dragger = itemView.findViewById(R.id.drag_list_item_image);  
-          if(dragger!=null&&x>dragger.getLeft()-20){  
-              //  
-              upScrollBounce = Math.min(y-scaledTouchSlop, getHeight()/3);  
-              downScrollBounce = Math.max(y+scaledTouchSlop, getHeight()*2/3);  
-                
-              itemView.setDrawingCacheEnabled(true);  
-              Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());  
-              startDrag(bm, y);  
-          }  
-          return false;  
-       }  
-       return super.onInterceptTouchEvent(ev);  
-  }  
-
-  /** 
-   * 触摸事件 
-   */  
-  @Override  
-  public boolean onTouchEvent(MotionEvent ev) {  
-      if(dragImageView!=null&&dragPosition!=INVALID_POSITION){  
-          int action = ev.getAction();  
-          switch(action){  
-              case MotionEvent.ACTION_UP:  
-                  int upY = (int)ev.getY();  
-                  stopDrag();  
-                  onDrop(upY);  
-                  break;  
-              case MotionEvent.ACTION_MOVE:  
-                  int moveY = (int)ev.getY();  
-                  onDrag(moveY);  
-                  break;  
-              default:break;  
-          }  
-          return true;  
-      }  
-      //也决定了选中的效果  
-      return super.onTouchEvent(ev);  
-  }  
-    
-  /** 
-   * 准备拖动,初始化拖动项的图像 
-   * @param bm 
-   * @param y 
-   */  
-  public void startDrag(Bitmap bm ,int y){  
-      stopDrag();  
-        
-      windowParams = new WindowManager.LayoutParams();  
-      windowParams.gravity = Gravity.TOP;  
-      windowParams.x = 0;  
-      windowParams.y = y - dragPoint + dragOffset;  
-      windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
-      windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
-      windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  
-                          | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE  
-                          | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
-                          | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;  
-      windowParams.format = PixelFormat.TRANSLUCENT;  
-      windowParams.windowAnimations = 0;  
-
-      ImageView imageView = new ImageView(getContext());  
-      imageView.setImageBitmap(bm);  
-      windowManager = (WindowManager)getContext().getSystemService("window");  
-      windowManager.addView(imageView, windowParams);  
-      dragImageView = imageView;  
-  }  
-    
-  /** 
-   * 停止拖动,去除拖动项的头像 
-   */  
-  public void stopDrag(){  
-      if(dragImageView!=null){  
-          windowManager.removeView(dragImageView);  
-          dragImageView = null;  
-      }  
-  }  
-    
-  /** 
-   * 拖动执行,在Move方法中执行 
-   * @param y 
-   */  
-  public void onDrag(int y){  
-      if(dragImageView!=null){  
-          windowParams.alpha = 0.8f;  
-          windowParams.y = y - dragPoint + dragOffset;  
-          windowManager.updateViewLayout(dragImageView, windowParams);  
-      }  
-      //为了避免滑动到分割线的时候,返回-1的问题  
-      int tempPosition = pointToPosition(0, y);  
-      if(tempPosition!=INVALID_POSITION){  
-          dragPosition = tempPosition;  
-      }  
-        
-      //滚动  
-      int scrollHeight = 0;  
-      if(y<upScrollBounce){  
-          scrollHeight = 8;//定义向上滚动8个像素,如果可以向上滚动的话  
-      }else if(y>downScrollBounce){  
-          scrollHeight = -8;//定义向下滚动8个像素,,如果可以向上滚动的话  
-      }  
-        
-      if(scrollHeight!=0){  
-          //真正滚动的方法setSelectionFromTop()  
-          setSelectionFromTop(dragPosition, getChildAt(dragPosition-getFirstVisiblePosition()).getTop()+scrollHeight);  
-      }  
-  }  
-    
-  /** 
-   * 拖动放下的时候 
-   * @param y 
-   */  
-  public void onDrop(int y){  
-        
-      //为了避免滑动到分割线的时候,返回-1的问题  
-      int tempPosition = pointToPosition(0, y);  
-      if(tempPosition!=INVALID_POSITION){  
-          dragPosition = tempPosition;  
-      }  
-        
-      //超出边界处理  
-      if(y<getChildAt(1).getTop()){  
-          //超出上边界  
-          dragPosition = 1;  
-      }else if(y>getChildAt(getChildCount()-1).getBottom()){  
-          //超出下边界  
-          dragPosition = getAdapter().getCount()-1;  
-      }  
-        
-      //数据交换  
-      if(dragPosition>0&&dragPosition<getAdapter().getCount()){  
-         /* @SuppressWarnings("unchecked")  */
-          DragListAdapter adapter = (DragListAdapter)getAdapter();  
-          fieldedit dragItem = adapter.getItem(dragSrcPosition);  
-          adapter.remove(dragItem);  
-          adapter.insert(dragItem, dragPosition);  
-//          Toast.makeText(getContext(), adapter.getList().toString(), Toast.LENGTH_SHORT).show();  
-      }  
-        
-  }  
+
+	private ImageView dragImageView;// 被拖拽的项,其实就是一个ImageView
+	private int dragSrcPosition;// 手指拖动项原始在列表中的位置
+	private int dragPosition;// 手指拖动的时候,当前拖动项在列表中的位置
+
+	private int dragPoint;// 在当前数据项中的位置
+	private int dragOffset;// 当前视图和屏幕的距离(这里只使用了y方向上)
+
+	private WindowManager windowManager;// windows窗口控制类
+	private WindowManager.LayoutParams windowParams;// 用于控制拖拽项的显示的参数
+
+	private int scaledTouchSlop;// 判断滑动的一个距离
+	private int upScrollBounce;// 拖动的时候,开始向上滚动的边界
+	private int downScrollBounce;// 拖动的时候,开始向下滚动的边界
+
+	public DragListView(Context context, AttributeSet attrs)
+	{
+		super(context, attrs);
+		scaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+
+		this.setOnItemClickListener(mItemClickListenter);
+	}
+
+	private int lastClickId = -1;
+	private long lastClickTime;
+	private OnItemClickListener mItemClickListenter = new OnItemClickListener()
+	{
+		public void onItemClick(AdapterView<?> parent, View v, int pos, long id)
+		{
+			DragListAdapter adapter = (DragListAdapter) ((ListView) parent)
+					.getAdapter();
+
+			if (adapter.isEnabled(pos) == false)// return if item is a group key
+				return;
+			fieldedit dclickitem = (fieldedit) ((ListView) parent).getAdapter()
+					.getItem(pos);
+
+			// 如果是双击,1秒内连续点击判断为双击
+			if (dclickitem._id == lastClickId
+					&& (Math.abs(lastClickTime - System.currentTimeMillis()) < 1000))
+			{
+				lastClickId = -1;
+				lastClickTime = 0;
+				if (pos < adapter.switchpos())
+				{
+					adapter.remove(dclickitem);
+					adapter.insert(dclickitem, adapter.getCount());
+				}
+				else
+				{
+					adapter.remove(dclickitem);
+					adapter.insert(dclickitem, 1);
+
+				}
+				// Intent intent = new Intent();
+				// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+				// intent.putExtra("matchId", mv.getId());
+				// intent.putExtra("matchKey", mv.getMatchKey());
+				// intent.setClass(SenseSoccerScoreActivity.this,
+				// MatchEventActivity.class);
+				// startActivity(intent);
+			}
+			else
+			{
+				lastClickId = dclickitem._id;
+				lastClickTime = System.currentTimeMillis();
+			}
+		}
+	};
+
+	// 拦截touch事件,其实就是加一层控制
+	@Override
+	public boolean onInterceptTouchEvent(MotionEvent ev)
+	{
+		if (ev.getAction() == MotionEvent.ACTION_DOWN)
+		{
+			int x = (int) ev.getX();
+			int y = (int) ev.getY();
+
+			dragSrcPosition = dragPosition = pointToPosition(x, y);
+			if (dragPosition == AdapterView.INVALID_POSITION)
+			{
+				return super.onInterceptTouchEvent(ev);
+			}
+
+			ViewGroup itemView = (ViewGroup) getChildAt(dragPosition
+					- getFirstVisiblePosition());
+			dragPoint = y - itemView.getTop();
+			dragOffset = (int) (ev.getRawY() - y);
+
+			View dragger = itemView.findViewById(R.id.drag_list_item_image);
+			if (dragger != null && x > dragger.getLeft() - 20)
+			{
+				//
+				upScrollBounce = Math.min(y - scaledTouchSlop, getHeight() / 3);
+				downScrollBounce = Math.max(y + scaledTouchSlop,
+						getHeight() * 2 / 3);
+
+				itemView.setDrawingCacheEnabled(true);
+				Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
+				startDrag(bm, y);
+			}
+			return false;
+		}
+		return super.onInterceptTouchEvent(ev);
+	}
+
+	/**
+	 * 触摸事件
+	 */
+	@Override
+	public boolean onTouchEvent(MotionEvent ev)
+	{
+		if (dragImageView != null && dragPosition != INVALID_POSITION)
+		{
+			int action = ev.getAction();
+			switch (action)
+			{
+			case MotionEvent.ACTION_UP:
+				int upY = (int) ev.getY();
+				stopDrag();
+				onDrop(upY);
+				break;
+			case MotionEvent.ACTION_MOVE:
+				int moveY = (int) ev.getY();
+				onDrag(moveY);
+				break;
+			default:
+				break;
+			}
+			return true;
+		}
+		// 也决定了选中的效果
+		return super.onTouchEvent(ev);
+	}
+
+	/**
+	 * 准备拖动,初始化拖动项的图像
+	 * 
+	 * @param bm
+	 * @param y
+	 */
+	public void startDrag(Bitmap bm, int y)
+	{
+		stopDrag();
+
+		windowParams = new WindowManager.LayoutParams();
+		windowParams.gravity = Gravity.TOP;
+		windowParams.x = 0;
+		windowParams.y = y - dragPoint + dragOffset;
+		windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
+		windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
+		windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+				| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
+				| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+				| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+		windowParams.format = PixelFormat.TRANSLUCENT;
+		windowParams.windowAnimations = 0;
+
+		ImageView imageView = new ImageView(getContext());
+		imageView.setImageBitmap(bm);
+		windowManager = (WindowManager) getContext().getSystemService("window");
+		windowManager.addView(imageView, windowParams);
+		dragImageView = imageView;
+	}
+
+	/**
+	 * 停止拖动,去除拖动项的头像
+	 */
+	public void stopDrag()
+	{
+		if (dragImageView != null)
+		{
+			windowManager.removeView(dragImageView);
+			dragImageView = null;
+		}
+	}
+
+	/**
+	 * 拖动执行,在Move方法中执行
+	 * 
+	 * @param y
+	 */
+	public void onDrag(int y)
+	{
+		if (dragImageView != null)
+		{
+			windowParams.alpha = 0.8f;
+			windowParams.y = y - dragPoint + dragOffset;
+			windowManager.updateViewLayout(dragImageView, windowParams);
+		}
+		// 为了避免滑动到分割线的时候,返回-1的问题
+		int tempPosition = pointToPosition(0, y);
+		if (tempPosition != INVALID_POSITION)
+		{
+			dragPosition = tempPosition;
+		}
+
+		// 滚动
+		int scrollHeight = 0;
+		if (y < upScrollBounce)
+		{
+			scrollHeight = 8;// 定义向上滚动8个像素,如果可以向上滚动的话
+		}
+		else
+			if (y > downScrollBounce)
+			{
+				scrollHeight = -8;// 定义向下滚动8个像素,,如果可以向上滚动的话
+			}
+
+		if (scrollHeight != 0)
+		{
+			// 真正滚动的方法setSelectionFromTop()
+			setSelectionFromTop(dragPosition,
+					getChildAt(dragPosition - getFirstVisiblePosition())
+							.getTop() + scrollHeight);
+		}
+	}
+
+	/**
+	 * 拖动放下的时候
+	 * 
+	 * @param y
+	 */
+	public void onDrop(int y)
+	{
+
+		// 为了避免滑动到分割线的时候,返回-1的问题
+		int tempPosition = pointToPosition(0, y);
+		if (tempPosition != INVALID_POSITION)
+		{
+			dragPosition = tempPosition;
+		}
+
+		// 超出边界处理
+		if (y < getChildAt(1).getTop())
+		{
+			// 超出上边界
+			dragPosition = 1;
+		}
+		else
+			if (y > getChildAt(getChildCount() - 1).getBottom())
+			{
+				// 超出下边界
+				dragPosition = getAdapter().getCount() - 1;
+			}
+
+		// 数据交换
+		if (dragPosition > 0 && dragPosition < getAdapter().getCount())
+		{
+			/* @SuppressWarnings("unchecked") */
+			DragListAdapter adapter = (DragListAdapter) getAdapter();
+			fieldedit dragItem = adapter.getItem(dragSrcPosition);
+			adapter.remove(dragItem);
+			adapter.insert(dragItem, dragPosition);
+			// Toast.makeText(getContext(), adapter.getList().toString(),
+			// Toast.LENGTH_SHORT).show();
+		}
+
+	}
 }

+ 46 - 0
Apex/src/com/usai/apex/HelpActivity.java

@@ -0,0 +1,46 @@
+package com.usai.apex;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.view.Menu;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageView;
+
+public class HelpActivity extends Activity implements OnClickListener
+{
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState)
+	{
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.activity_help);
+		String caller=getIntent().getStringExtra("caller");
+		ImageView iv= (ImageView) findViewById(R.id.iv_help);
+		iv.setOnClickListener(this);
+		if(caller.equals("fields"))
+			iv.setImageResource(R.drawable.help_fields);
+		else if(caller.equals("search"))
+			iv.setImageResource(R.drawable.help_search);
+	}
+	
+	
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu)
+	{
+		// Inflate the menu; this adds items to the action bar if it is present.
+		getMenuInflater().inflate(R.menu.help, menu);
+		return true;
+	}
+
+
+
+	@Override
+	public void onClick(View v)
+	{
+		finish();
+		
+	}
+
+}

+ 14 - 1
Apex/src/com/usai/apex/InnerMapActivity.java

@@ -4,10 +4,23 @@ import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentTransaction;
+import android.view.KeyEvent;
 
 public class InnerMapActivity extends FragmentActivity
 {
-
+	@Override
+	public boolean onKeyDown(int keyCode, KeyEvent event)
+	{
+		if (keyCode == KeyEvent.KEYCODE_BACK)
+		{
+			// Intent myIntent = new Intent();
+			// myIntent = new Intent(EditActivity.this, tabActivity.class);
+			// startActivity(myIntent);
+			finish();
+			return true;
+		}
+		return super.onKeyDown(keyCode, event);
+	}
 	@Override
 	protected void onCreate(Bundle savedInstanceState)
 	{

+ 59 - 4
Apex/src/com/usai/apex/SearchActivity.java

@@ -7,10 +7,14 @@ import java.util.Map;
 import com.usai.util.Network;
 import com.usai.util.dbUtil;
 
+import android.R.string;
+import android.nfc.Tag;
 import android.os.Bundle;
 import android.app.ListActivity;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.text.Editable;
@@ -111,9 +115,12 @@ public class SearchActivity extends ListActivity implements OnClickListener
 		@Override
 		public void bindView(View view, Context context, Cursor cursor)
 		{
-			String field_type = cursor.getString(1);
+			final String f0 = cursor.getString(0);
+			final String field_type = cursor.getString(1);
 			final String name = cursor.getString(2);
-			EditText edit = (EditText) view.findViewById(R.id.edit_val);
+			
+			Log.e("cursor val", "name="+f0+" , type="+field_type);
+			final EditText edit = (EditText) view.findViewById(R.id.edit_val);
 			edit.addTextChangedListener(new TextWatcher()
 			{
 				@Override
@@ -138,6 +145,8 @@ public class SearchActivity extends ListActivity implements OnClickListener
 					val.trim();
 					if (val.length() > 0)
 						hashMap.put(name, val);
+					
+//					Log.d("ime debug", "name="+f0+" , type="+field_type+", ime="+edit.getInputType());
 				}
 			});
 			Switch switch_bool = (Switch) view.findViewById(R.id.switch_bool);
@@ -154,7 +163,16 @@ public class SearchActivity extends ListActivity implements OnClickListener
 				{
 					edit.setInputType(InputType.TYPE_DATETIME_VARIATION_DATE
 							| InputType.TYPE_CLASS_DATETIME);
+					
 				}
+				else if (field_type.equals("int")) {
+					
+					edit.setInputType(InputType.TYPE_CLASS_NUMBER);
+				}
+				else {
+					edit.setInputType(InputType.TYPE_CLASS_TEXT);
+				}
+				Log.d("ime debug", "name="+f0+" , type="+field_type+", ime="+edit.getInputType());
 			}
 			super.bindView(view, context, cursor);
 
@@ -223,6 +241,35 @@ public class SearchActivity extends ListActivity implements OnClickListener
 		btnok.setOnClickListener(this);
 		Button btncancel = (Button) findViewById(R.id.btncancel);
 		btncancel.setOnClickListener(this);
+		
+		
+		SharedPreferences RunOnce = getSharedPreferences("Apex", 0);
+		
+		String vername;
+		try
+		{
+			vername = getPackageManager().getPackageInfo(
+					"com.usai.apex", 0).versionName;
+			boolean bFirstRun = RunOnce.getBoolean(
+					"FirstRun"+vername+"_search", true);
+			if(bFirstRun)
+			{
+				SharedPreferences.Editor editor = RunOnce.edit();
+				editor.putBoolean("FirstRun"+vername+"_search", false);
+				// Don't forget to commit your edits!!!
+				editor.commit();
+				Intent intent = new Intent();
+				intent.setClass(this, HelpActivity.class);
+				intent.putExtra("caller", "search");
+				startActivity(intent);
+				
+			}		
+		}
+		catch (NameNotFoundException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 		// initlist();
 
 		// m_ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
@@ -286,10 +333,10 @@ public class SearchActivity extends ListActivity implements OnClickListener
 	@Override
 	public boolean onOptionsItemSelected(MenuItem item)
 	{
+		Intent intent = new Intent();
 		switch (item.getItemId())
 		{
 		case R.id.action_custom_fields:
-			Intent intent = new Intent();
 			intent.setClass(this, CustomizeFieldsActivity.class);
 			intent.putExtra("user", user);
 			// intent.putExtra("password", password);
@@ -297,7 +344,15 @@ public class SearchActivity extends ListActivity implements OnClickListener
 			intent.putExtra("behavior", Network.BEHAVIOR_SEARCH);
 			startActivity(intent);
 			break;
-
+		case R.id.action_help:
+//			Intent intent = new Intent();
+			intent.setClass(this, HelpActivity.class);
+			intent.putExtra("caller", "search");
+//			// intent.putExtra("password", password);
+//			intent.putExtra("function_name", function_name);
+//			intent.putExtra("behavior", Network.BEHAVIOR_SEARCH);
+			startActivity(intent);
+			break;
 		default:
 			break;
 		}