Browse Source

1.修改Android Apex Mobile导入OpenStreetMap。
2.修改Android Apex Mobile Result区分不同查询的显示列表。

Pen Li 7 years ago
parent
commit
d6329765ba
23 changed files with 1357 additions and 307 deletions
  1. 3 3
      ApexDrivers/apexmap/build.gradle
  2. 27 21
      ApexDrivers/apexmap/src/main/java/redant/usai/com/apexmap/mapkit/ApexMapView.java
  3. 34 13
      ApexDrivers/apexmap/src/main/java/redant/usai/com/apexmap/mapkit/ApexMarkerInfoWindow.java
  4. 1 0
      ApexDrivers/apexmobile/build.gradle
  5. 35 116
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/InnerMapActivity.java
  6. 1 1
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/LocationDetail.java
  7. 76 12
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/ApexResultAdapter.java
  8. 28 10
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/ApexResultPresenter.java
  9. 165 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultBLInfoCell.java
  10. 146 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultBookingCell.java
  11. 12 12
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultContainerCell.java
  12. 9 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultAddition.java
  13. 62 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultBLInfoModel.java
  14. 50 1
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultBaseModel.java
  15. 67 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultBookingModel.java
  16. 62 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultContainerModel.java
  17. 0 113
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultShipModel.java
  18. 198 0
      ApexDrivers/apexmobile/src/main/java/com/usai/apex/servicelocationmap/ApexServiceLocationMapFragment.java
  19. 5 5
      ApexDrivers/apexmobile/src/main/res/layout/apex_result_blinfo_cell.xml
  20. 190 0
      ApexDrivers/apexmobile/src/main/res/layout/apex_result_booking_cell.xml
  21. 157 0
      ApexDrivers/apexmobile/src/main/res/layout/apex_result_container_cell.xml
  22. 14 0
      ApexDrivers/apexmobile/src/main/res/layout/service_location_map_activity.xml
  23. 15 0
      ApexDrivers/apexmobile/src/main/res/layout/service_location_map_fragment.xml

+ 3 - 3
ApexDrivers/apexmap/build.gradle

@@ -1,13 +1,13 @@
 apply plugin: 'com.android.library'
 
 android {
-    compileSdkVersion 27
+    compileSdkVersion 26
 
 
 
     defaultConfig {
         minSdkVersion 15
-        targetSdkVersion 27
+        targetSdkVersion 26
         versionCode 1
         versionName "1.0"
 
@@ -27,7 +27,7 @@ android {
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
 
-    implementation 'com.android.support:appcompat-v7:27.1.1'
+    implementation 'com.android.support:appcompat-v7:26.1.0'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.2'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

+ 27 - 21
ApexDrivers/apexmap/src/main/java/redant/usai/com/apexmap/mapkit/ApexMapView.java

@@ -2,6 +2,7 @@ package redant.usai.com.apexmap.mapkit;
 
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Canvas;
 import android.net.Uri;
 import android.os.Handler;
 import android.util.AttributeSet;
@@ -91,7 +92,7 @@ public class ApexMapView extends MapView implements ApexMapLegalOverlay.LegalCli
 
 
         // 设置指南针
-        showCompass(getContext());
+//        showCompass(getContext());
 
         // 添加比例尺
         ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(self);
@@ -126,6 +127,16 @@ public class ApexMapView extends MapView implements ApexMapLegalOverlay.LegalCli
         getOverlays().add(overlay);
     }
 
+    // endregion
+
+    // region Override
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+    }
+
+
     // endregion
 
     // region Setter
@@ -158,13 +169,21 @@ public class ApexMapView extends MapView implements ApexMapLegalOverlay.LegalCli
             marker.setTitle(title);//设置标题
             marker.setSubDescription(description);//设置说明
 
-            getOverlays().add(marker);//添加marker到MapView
+            addMarker(marker);
 
             return marker;
         }
         return null;
     }
 
+    public void addMarker(Marker marker) {
+        if (marker != null) {
+            getOverlays().add(marker);//添加marker到MapView
+            // 强制重绘,否则可能不显示,除非滑动地图
+            postInvalidate();
+        }
+    }
+
     public ApexMarkerInfoWindow addWindowInfoForMarker(Marker marker, Object attachment, ApexMarkerInfoWindow.ApexMarkerInfoWindowClickListener listener) {
         if (marker != null) {
             ApexMarkerInfoWindow infoWindow = new ApexMarkerInfoWindow(self, attachment);
@@ -218,6 +237,12 @@ public class ApexMapView extends MapView implements ApexMapLegalOverlay.LegalCli
         if (opened != null && opened.size() > 0) {
             for (InfoWindow infoWindow : opened) {
                 infoWindow.close();
+                if (infoWindow instanceof ApexMarkerInfoWindow) {
+                    ApexMarkerInfoWindow markerInfoWindow = (ApexMarkerInfoWindow)infoWindow;
+                    if (markerInfoWindow.hitTest(event)) {
+                        markerInfoWindow.onTouchEvent(event);
+                    }
+                }
             }
             return false;
         }
@@ -234,24 +259,5 @@ public class ApexMapView extends MapView implements ApexMapLegalOverlay.LegalCli
     }
 
 
-    // endregion
-
-    // region Mask
-
-    private class ApexMapMaskView extends RelativeLayout {
-
-        public ApexMapMaskView(Context context) {
-            super(context);
-        }
-
-        public ApexMapMaskView(Context context, AttributeSet attrs) {
-            super(context, attrs);
-        }
-
-        public ApexMapMaskView(Context context, AttributeSet attrs, int defStyleAttr) {
-            super(context, attrs, defStyleAttr);
-        }
-    }
-
     // endregion
 }

+ 34 - 13
ApexDrivers/apexmap/src/main/java/redant/usai/com/apexmap/mapkit/ApexMarkerInfoWindow.java

@@ -36,19 +36,6 @@ public class ApexMarkerInfoWindow extends MarkerInfoWindow {
 
         mTitleTv = getView().findViewById(R.id.tv_title);
         mInfoTv = getView().findViewById(R.id.tv_info);
-
-        mView.setOnTouchListener(new View.OnTouchListener() {
-            @Override public boolean onTouch(View v, MotionEvent e) {
-                if (e.getAction() == MotionEvent.ACTION_UP) {
-                    close();
-                    if (mClickListener != null) {
-                        mClickListener.onMarkerInfoWindowDidClick(self, mAttachment);
-                    }
-                }
-                return true;
-            }
-        });
-
     }
 
     // endregion
@@ -108,6 +95,16 @@ public class ApexMarkerInfoWindow extends MarkerInfoWindow {
     public void onClose() {
         super.onClose();
     }
+
+    private void click(MotionEvent event) {
+        if (event != null) {
+            close();
+            if (mClickListener != null) {
+                mClickListener.onMarkerInfoWindowDidClick(self, mAttachment);
+            }
+        }
+    }
+
     // endregion
 
     // region Info Window Click Delegate
@@ -118,4 +115,28 @@ public class ApexMarkerInfoWindow extends MarkerInfoWindow {
     }
 
     // endregion
+
+    // region Event
+
+    public boolean hitTest(MotionEvent event) {
+        int left = mView.getLeft();
+        int top = mView.getTop();
+        int right = mView.getRight();
+        int bottom = mView.getBottom();
+
+        float x = event.getX();
+        float y = event.getY();
+
+        if (x >= left && x <= right && y >= top && y <= bottom) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public void onTouchEvent(MotionEvent event) {
+        click(event);
+    }
+
+    // endregion
 }

+ 1 - 0
ApexDrivers/apexmobile/build.gradle

@@ -57,6 +57,7 @@ dependencies {
     //    api 'com.github.barteksc:android-pdf-viewer:3.0.0-beta.5'
     implementation files('libs/BaiduLBS_Android.jar')
     implementation project(path: ':RAUtilsLibrary')
+    implementation project(':apexmap')
 }
 android {
     useLibrary 'org.apache.http.legacy'

+ 35 - 116
ApexDrivers/apexmobile/src/main/java/com/usai/apex/InnerMapActivity.java

@@ -3,7 +3,7 @@ package com.usai.apex;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.Intent;
+
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.graphics.Bitmap;
@@ -23,6 +23,7 @@ import android.view.View;
 import android.widget.TextView;
 
 import com.baidu.mapapi.map.SupportMapFragment;
+import com.usai.apex.servicelocationmap.ApexServiceLocationMapFragment;
 import com.usai.redant.rautils.contactkit.Contact;
 import com.usai.redant.rautils.contactkit.ContactHelper;
 import com.usai.redant.rautils.contactkit.ContactUIHelper;
@@ -34,82 +35,24 @@ import com.usai.redant.rautils.contactkit.element.Photo;
 import com.usai.redant.rautils.contactkit.element.PostalAddress;
 import com.usai.redant.rautils.contactkit.element.WebSite;
 
-import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
 
 
-//import com.baidu.mapapi.MKGeneralListener;
-//import com.baidu.mapapi.map.MKEvent;
-
-public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragment.BaiduMarkerClickListener,ServiceLocationFragment.MarkerClickListener
+public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragment.BaiduMarkerClickListener,ServiceLocationFragment.MarkerClickListener, ApexServiceLocationMapFragment.ApexServiceLocationMapInfoWindowClickListener
 {
-//	public static boolean		m_bKeyRight				= true;
-//	BMapManager					mBMapManager			= null;
 
-//    public String strKey = getString(R.string.baidu_key);//"nqBQoSDbxrslhuzW91uViQX7";//release
-	private static final String	LTAG					= "test";
 	SupportMapFragment			map;
-
 	boolean						m_bhasgoogleframework	= true;
 	private InnerMapActivity self = this;
+	private final static boolean USE_APEX_MAP = false;
 
-//	static class MyGeneralListener implements MKGeneralListener
-//	{
-//
-//		@Override
-//		public void onGetNetworkState(int iError)
-//		{
-//			if (iError == MKEvent.ERROR_NETWORK_CONNECT)
-//			{
-//				Toast.makeText(
-//						ApexTrackingApplication.get_instance()
-//								.getApplicationContext(),
-//						"????????????????????????", Toast.LENGTH_LONG).show();
-//			}
-//			else if (iError == MKEvent.ERROR_NETWORK_DATA)
-//			{
-//				Toast.makeText(
-//						ApexTrackingApplication.get_instance()
-//								.getApplicationContext(),
-//						"??????????????????????????????", Toast.LENGTH_LONG)
-//						.show();
-//			}
-//			// ...
-//		}
-//
-//		@Override
-//		public void onGetPermissionState(int iError)
-//		{
-//			// ???????????????key???????????????
-//			if (iError != 0)
-//			{
-//				// ??????Key?????????
-//				Toast.makeText(
-//						ApexTrackingApplication.get_instance()
-//								.getApplicationContext(),
-//						"?????? MyApplication.java???????????????????????????Key,??????????????????????????????????????????error: "
-//								+ iError, Toast.LENGTH_LONG).show();
-//				m_bKeyRight = false;
-//			}
-//			else
-//			{
-//				m_bKeyRight = true;
-//				Toast.makeText(
-//						ApexTrackingApplication.get_instance()
-//								.getApplicationContext(), "key????????????",
-//						Toast.LENGTH_LONG).show();
-//			}
-//		}
-//	}
 
 	@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;
 		}
@@ -118,7 +61,6 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 	@Override
 	public boolean onOptionsItemSelected(MenuItem item)
 	{
-		Intent intent = new Intent();
 		switch (item.getItemId())
 		{
 			case android.R.id.home:
@@ -140,8 +82,6 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 		setTitle("Service Location");
 		ActionBar actionBar = getSupportActionBar();
 		actionBar.setCustomView(mActionBarView, lp);
-//		actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
-//		actionBar.setDisplayShowCustomEnabled(true);
 		actionBar.setDisplayHomeAsUpEnabled(true);
 
 
@@ -155,11 +95,33 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 	{
 		super.onCreate(savedInstanceState);
 		mContext = this;
+		setCustomActionBar();
+
+		if (USE_APEX_MAP) {
+			setupApexMap();
+		} else {
+			setupMap();
+		}
+	}
+
+	private void setupApexMap() {
+
+		setContentView(R.layout.service_location_map_activity);
+
+		ApexServiceLocationMapFragment fragment = new ApexServiceLocationMapFragment();
+		fragment.setInfoWindowClickListener(this);
+
+		FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+		transaction.replace(R.id.service_location_map_fragment,fragment);
+		transaction.commit();
+	}
+
+	private void setupMap() {
+
 		PackageInfo packageInfo;
 		try
 		{
-			packageInfo = this.getPackageManager().getPackageInfo(
-					"com.google.android.gms", 0);
+			packageInfo = this.getPackageManager().getPackageInfo("com.google.android.gms", 0);
 
 		}
 		catch (NameNotFoundException e)
@@ -177,13 +139,8 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 			m_bhasgoogleframework = true;
 			System.out.println("已经安装");
 		}
-		// setUpMapIfNeeded();
 
 //		m_bhasgoogleframework = false;
-
-
-
-
 //		m_bhasgoogleframework= true;
 
 		Fragment slFragment = null;
@@ -192,8 +149,7 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 			setContentView(R.layout.activity_inner_map);
 			slFragment = new ServiceLocationFragment();
 			((ServiceLocationFragment)slFragment).markerClickListener = this;
-			FragmentTransaction ft = getSupportFragmentManager()
-					.beginTransaction();
+			FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
 			ft.replace(R.id.inner_map, slFragment);
 			ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
 			ft.addToBackStack("Location");
@@ -202,56 +158,15 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 		}
 		else
 		{
-//			if (mBMapManager == null)
-//			{
-//				mBMapManager = new BMapManager(getApplicationContext());
-//				/**
-//				 * ??????BMapManager???????????????????????????BMapManager
-//				 */
-//				mBMapManager.init(strKey, new MyGeneralListener());
-//			}
-			
-//			f.initEngineManager(this);
 			setContentView(R.layout.activity_inner_map);
-//			Log.d(LTAG, "onCreate");
-//			// setContentView(R.layout.activity_main);
-//			map = SupportMapFragment.newInstance();
 			BaiduMapFragment f  = new BaiduMapFragment();
 			FragmentManager manager = getSupportFragmentManager();
-			manager.beginTransaction().add(R.id.inner_map, f, "map_fragment")
-					.commit();
+			manager.beginTransaction().add(R.id.inner_map, f, "map_fragment").commit();
 			f.markerClickListener = this;
 		}
 
-		setCustomActionBar();
-
-//		LocationDetail detail = new LocationDetail("Kerry Freight (USA), Inc","3200 NW 67th Ave. Bldg. 3 Suite 390 Miami, FL 33122 Miami","+(305)12345678","+(305)4567890",null,"mario.alfonso@kerrylogistics.com");
-//		markerClicked(detail);
 	}
 
-	// @Override
-	// public boolean onCreateOptionsMenu(Menu menu)
-	// {
-	// // Inflate the menu; this adds items to the action bar if it is present.
-	// getMenuInflater().inflate(R.menu.inner_map, menu);
-	// return true;
-	// }
-	// private void setUpMapIfNeeded() {
-	// // Do a null check to confirm that we have not already instantiated the
-	// map.
-	// if (mMap == null) {
-	// // Try to obtain the map from the SupportMapFragment.
-	// mMap = ((SupportMapFragment)
-	// getSupportFragmentManager().findFragmentById(R.id.map))
-	// .getMap();
-	// // Check if we were successful in obtaining the map.
-	// if (mMap != null) {
-	// setUpMap();
-	// }
-	// }
-	// }
-
-
 	@Override
 	public void markerClicked(LocationDetail detail) {
 
@@ -396,4 +311,8 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 	}
 
 
+	@Override
+	public void onInfoWindowClick(LocationDetail detail) {
+		markerClicked(detail);
+	}
 }

+ 1 - 1
ApexDrivers/apexmobile/src/main/java/com/usai/apex/LocationDetail.java

@@ -9,7 +9,7 @@ public class LocationDetail implements Serializable
 	 */
 	private static final long serialVersionUID = -8043239175565480418L;
 	public String Name,Addr,Tel,Fax,Contact,Email;
-	LocationDetail(String name,String addr,String tel,String fax,String contact,String email)
+	public LocationDetail(String name, String addr, String tel, String fax, String contact, String email)
 	{
 //		Name="aa";
 //		Addr="aa";

+ 76 - 12
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/ApexResultAdapter.java

@@ -5,11 +5,16 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 
+import com.usai.apex.apexresult.cell.ApexResultBLInfoCell;
+import com.usai.apex.apexresult.cell.ApexResultBookingCell;
 import com.usai.apex.apexresult.cell.ApexResultDocumentCell;
-import com.usai.apex.apexresult.cell.ApexResultShipCell;
+import com.usai.apex.apexresult.cell.ApexResultContainerCell;
+import com.usai.apex.apexresult.model.ApexResultAddition;
+import com.usai.apex.apexresult.model.ApexResultBLInfoModel;
 import com.usai.apex.apexresult.model.ApexResultBaseModel;
+import com.usai.apex.apexresult.model.ApexResultBookingModel;
 import com.usai.apex.apexresult.model.ApexResultDocumentModel;
-import com.usai.apex.apexresult.model.ApexResultShipModel;
+import com.usai.apex.apexresult.model.ApexResultContainerModel;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -93,7 +98,7 @@ public class ApexResultAdapter extends BaseAdapter {
 
     @Override
     public int getViewTypeCount() {
-        return 2;
+        return ApexResultBaseModel.ApexResultType.values().length;
     }
 
     @Override
@@ -109,17 +114,50 @@ public class ApexResultAdapter extends BaseAdapter {
         if (context != null) {
 
             ApexResultBaseModel model = (ApexResultBaseModel)getItem(position);
-            if (model.type == ApexResultBaseModel.ApexResultType.APEX_RESULT_TYPE_SHIP.ordinal()) {
+            if (model.type == ApexResultBaseModel.ApexResultType.APEX_RESULT_TYPE_BOOKING.ordinal()) {
 
-                ApexResultShipModel shipModel = (ApexResultShipModel)model;
-                ApexResultShipCell cell = dequeueShipCell(context, convertView);
+                ApexResultBookingModel shipModel = (ApexResultBookingModel)model;
+                ApexResultBookingCell cell = dequeueBookingCell(context, convertView);
+                cell.prepareReuse();
+                cell.setTitle(shipModel.title).setDetail(shipModel.detail).setIcon(shipModel.getIcon()).setPort(shipModel.port).setTime(shipModel.date).setDescription(shipModel.desc).setConsignee(shipModel.consignee);
+
+                ArrayList<ApexResultAddition> additions = shipModel.getAddition();
+                if (additions != null && additions.size() > 0) {
+                    for (ApexResultAddition addition : additions) {
+                        cell.addAddition(addition.name, addition.value);
+                    }
+                }
+
+                return cell;
+
+            } else if (model.type == ApexResultBaseModel.ApexResultType.APEX_RESULT_TYPE_BLINFO.ordinal()) {
+
+                ApexResultBLInfoModel shipModel = (ApexResultBLInfoModel)model;
+                ApexResultBLInfoCell cell = dequeueBLInfoCell(context, convertView);
+                cell.prepareReuse();
+                cell.setTitle(shipModel.title).setDetail(shipModel.detail).setIcon(shipModel.icon).setPort(shipModel.port).setTime(shipModel.date).setDescription(shipModel.desc);
+                cell.setTransportStage(shipModel.transport_stage);
+
+                ArrayList<ApexResultAddition> additions = shipModel.getAddition();
+                if (additions != null && additions.size() > 0) {
+                    for (ApexResultAddition addition : additions) {
+                        cell.addAddition(addition.name, addition.value);
+                    }
+                }
+
+                return cell;
+
+            } else if (model.type == ApexResultBaseModel.ApexResultType.APEX_RESULT_TYPE_CONTAINER.ordinal()) {
+
+                ApexResultContainerModel shipModel = (ApexResultContainerModel)model;
+                ApexResultContainerCell cell = dequeueContainerCell(context, convertView);
                 cell.prepareReuse();
                 cell.setTitle(shipModel.title).setDetail(shipModel.detail).setIcon(shipModel.icon).setPort(shipModel.port).setTime(shipModel.date).setDescription(shipModel.desc);
                 cell.setTransportStage(shipModel.transport_stage);
 
-                ArrayList<ApexResultShipModel.ApexResultAddition> additions = shipModel.getAddition();
+                ArrayList<ApexResultAddition> additions = shipModel.getAddition();
                 if (additions != null && additions.size() > 0) {
-                    for (ApexResultShipModel.ApexResultAddition addition : additions) {
+                    for (ApexResultAddition addition : additions) {
                         cell.addAddition(addition.name, addition.value);
                     }
                 }
@@ -145,14 +183,40 @@ public class ApexResultAdapter extends BaseAdapter {
 
     // region Configure Cell
 
-    private ApexResultShipCell dequeueShipCell(Context context, View convertView) {
+    private ApexResultBookingCell dequeueBookingCell(Context context, View convertView) {
+
+        ApexResultBookingCell cell = null;
+
+        if (convertView == null) {
+            cell = ApexResultBookingCell.makeBookingCell(context);
+        } else {
+            cell = (ApexResultBookingCell)convertView;
+        }
+
+        return cell;
+    }
+
+    private ApexResultBLInfoCell dequeueBLInfoCell(Context context, View convertView) {
+
+        ApexResultBLInfoCell cell = null;
+
+        if (convertView == null) {
+            cell = ApexResultBLInfoCell.makeBLInfoCell(context);
+        } else {
+            cell = (ApexResultBLInfoCell)convertView;
+        }
+
+        return cell;
+    }
+
+    private ApexResultContainerCell dequeueContainerCell(Context context, View convertView) {
 
-        ApexResultShipCell cell = null;
+        ApexResultContainerCell cell = null;
 
         if (convertView == null) {
-            cell = ApexResultShipCell.makeShipCell(context);
+            cell = ApexResultContainerCell.makeContainerCell(context);
         } else {
-            cell = (ApexResultShipCell)convertView;
+            cell = (ApexResultContainerCell)convertView;
         }
 
         return cell;

+ 28 - 10
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/ApexResultPresenter.java

@@ -4,9 +4,11 @@ import android.os.Bundle;
 import android.text.TextUtils;
 
 import com.usai.apex.ApexTrackingApplication;
+import com.usai.apex.apexresult.model.ApexResultBLInfoModel;
 import com.usai.apex.apexresult.model.ApexResultBaseModel;
+import com.usai.apex.apexresult.model.ApexResultBookingModel;
 import com.usai.apex.apexresult.model.ApexResultDocumentModel;
-import com.usai.apex.apexresult.model.ApexResultShipModel;
+import com.usai.apex.apexresult.model.ApexResultContainerModel;
 import com.usai.redant.rautils.operationqueue.OperationQueue;
 import com.usai.util.Network;
 import com.usai.util.RAUtil;
@@ -253,17 +255,33 @@ public class ApexResultPresenter implements ApexResultAdapter.ApexResultAdapterD
     private ApexResultBaseModel makeModel(JSONObject item) {
         if (item != null) {
             int type = item.optInt("type", -1);
-            if (type == ApexResultBaseModel.ApexResultType.APEX_RESULT_TYPE_SHIP.ordinal()) {
 
-                ApexResultShipModel model = new ApexResultShipModel();
-                model.setValuesForKeysWithJSON(item);
-                return model;
-            } else if (type == ApexResultBaseModel.ApexResultType.APEX_RESULT_TYPE_DOCUMENT.ordinal()) {
-
-                ApexResultDocumentModel model = new ApexResultDocumentModel();
-                model.setValuesForKeysWithJSON(item);
-                return model;
+            if (type < ApexResultBaseModel.ApexResultType.values().length) {
+                ApexResultBaseModel.ApexResultType resultType = ApexResultBaseModel.ApexResultType.values()[type];
+                switch (resultType) {
+                    case APEX_RESULT_TYPE_BOOKING: {
+                        ApexResultBookingModel model = new ApexResultBookingModel();
+                        model.setValuesForKeysWithJSON(item);
+                        return model;
+                    }
+                    case APEX_RESULT_TYPE_BLINFO: {
+                        ApexResultBLInfoModel model = new ApexResultBLInfoModel();
+                        model.setValuesForKeysWithJSON(item);
+                        return model;
+                    }
+                    case APEX_RESULT_TYPE_CONTAINER: {
+                        ApexResultContainerModel model = new ApexResultContainerModel();
+                        model.setValuesForKeysWithJSON(item);
+                        return model;
+                    }
+                    case APEX_RESULT_TYPE_DOCUMENT: {
+                        ApexResultDocumentModel model = new ApexResultDocumentModel();
+                        model.setValuesForKeysWithJSON(item);
+                        return model;
+                    }
+                }
             }
+
         }
         return null;
     }

+ 165 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultBLInfoCell.java

@@ -0,0 +1,165 @@
+package com.usai.apex.apexresult.cell;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.usai.apex.ApexTrackingApplication;
+import com.usai.apex.R;
+import com.usai.apex.mainframe.TrackingImageView;
+
+import java.util.ArrayList;
+
+public class ApexResultBLInfoCell extends LinearLayout {
+
+    // region initial
+    public static ApexResultBLInfoCell makeBLInfoCell(Context context) {
+        ApexResultBLInfoCell cell = (ApexResultBLInfoCell) LayoutInflater.from(context).inflate(R.layout.apex_result_blinfo_cell, null);
+        cell.init();
+
+        return cell;
+    }
+
+    private TextView titleTv, dateTv, descTv, detailTv, portTv;
+    private TrackingImageView statusIv;
+    private View stageView;
+    private LinearLayout additionLayout;
+
+    private ArrayList<ApexResultAdditionView> additionArray = new ArrayList<>();
+    private int additionCount = 0;
+
+    public ApexResultBLInfoCell(Context context) {
+        super(context);
+    }
+
+    public ApexResultBLInfoCell(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ApexResultBLInfoCell(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    private void init() {
+
+        titleTv = findViewById(R.id.tv_title);
+        dateTv = findViewById(R.id.tv_time);
+        descTv = findViewById(R.id.tv_description);
+        detailTv = findViewById(R.id.tv_detail);
+        portTv = findViewById(R.id.tv_port);
+        statusIv = findViewById(R.id.iv_status);
+        stageView = findViewById(R.id.v_transport_stage);
+        additionLayout = findViewById(R.id.apex_result_ship_addition_view);
+
+        prepareReuse();
+    }
+
+    public void prepareReuse() {
+
+        titleTv.setText("");
+        dateTv.setText("");
+        descTv.setText("");
+        detailTv.setText("");
+        portTv.setText("");
+        statusIv.setImageDrawable(null);
+        setTransportStage(0);
+        clearAdditionView();
+    }
+
+    public void setTransportStage(int stage) {
+        switch(stage)
+        {
+            case 0:
+                stageView.setBackground(ApexTrackingApplication.getInstance().getResources().getDrawable(R.drawable.list_corner_transport_stage_bg_0));
+                break;
+            case 1:
+                stageView.setBackground(ApexTrackingApplication.getInstance().getResources().getDrawable(R.drawable.list_corner_transport_stage_bg_1));
+                break;
+            case 2:
+                stageView.setBackground(ApexTrackingApplication.getInstance().getResources().getDrawable(R.drawable.list_corner_transport_stage_bg_2));
+                break;
+            case 3:
+                stageView.setBackground(ApexTrackingApplication.getInstance().getResources().getDrawable(R.drawable.list_corner_transport_stage_bg_3));
+                break;
+            default:
+                stageView.setBackground(ApexTrackingApplication.getInstance().getResources().getDrawable(R.drawable.list_corner_transport_stage_bg_0));
+                break;
+
+        }
+    }
+
+    // endregion
+
+    // region set
+
+    public ApexResultBLInfoCell setTitle(String title) {
+        titleTv.setText(title);
+        return this;
+    }
+
+    public ApexResultBLInfoCell setDetail(String detail) {
+        detailTv.setText(detail);
+        return this;
+    }
+
+    public ApexResultBLInfoCell setIcon(String icon) {
+        if (icon != null) {
+            int resourceId = getContext().getResources().getIdentifier(icon, "drawable", getContext().getPackageName());
+            statusIv.setImageResource(resourceId);
+        } else {
+            statusIv.setImageDrawable(null);
+        }
+        return this;
+    }
+
+    public ApexResultBLInfoCell setPort(String port) {
+        portTv.setText(port);
+        return this;
+    }
+
+    public ApexResultBLInfoCell setTime(String time) {
+        dateTv.setText(time);
+        return this;
+    }
+
+    public ApexResultBLInfoCell setDescription(String description) {
+        descTv.setText(description);
+        return this;
+    }
+
+    public void addAddition(String name, String value) {
+
+        ApexResultAdditionView additionView;
+        if (additionCount >= additionArray.size()) {
+
+            additionView = ApexResultAdditionView.makeAdditionView(getContext());
+            additionArray.add(additionView);
+
+        } else {
+            additionView = additionArray.get(additionCount);
+        }
+        additionCount++;
+
+        additionView.setTitle(name);
+        additionView.setValue(value);
+
+        LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
+        additionLayout.addView(additionView, layoutParams);
+    }
+
+    // endregion
+
+    // region Private
+
+    private void clearAdditionView() {
+        additionLayout.removeAllViews();
+        additionCount = 0;
+    }
+
+    // endregion
+}

+ 146 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultBookingCell.java

@@ -0,0 +1,146 @@
+package com.usai.apex.apexresult.cell;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.usai.apex.R;
+import com.usai.apex.mainframe.TrackingImageView;
+
+import java.util.ArrayList;
+
+public class ApexResultBookingCell extends LinearLayout {
+
+    // region initial
+    public static ApexResultBookingCell makeBookingCell(Context context) {
+        ApexResultBookingCell cell = (ApexResultBookingCell) LayoutInflater.from(context).inflate(R.layout.apex_result_booking_cell, null);
+        cell.init();
+
+        return cell;
+    }
+
+    private TextView titleTv, dateTv, descTv, detailTv, portTv, consigneeTv;
+    private TrackingImageView statusIv;
+    private LinearLayout additionLayout;
+
+    private ArrayList<ApexResultAdditionView> additionArray = new ArrayList<>();
+    private int additionCount = 0;
+
+    public ApexResultBookingCell(Context context) {
+        super(context);
+    }
+
+    public ApexResultBookingCell(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ApexResultBookingCell(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    private void init() {
+
+        titleTv = findViewById(R.id.tv_title);
+        dateTv = findViewById(R.id.tv_time);
+        descTv = findViewById(R.id.tv_description);
+        detailTv = findViewById(R.id.tv_detail);
+        portTv = findViewById(R.id.tv_port);
+        statusIv = findViewById(R.id.iv_status);
+        additionLayout = findViewById(R.id.apex_result_ship_addition_view);
+        consigneeTv = findViewById(R.id.tv_consignee);
+
+        prepareReuse();
+    }
+
+    public void prepareReuse() {
+
+        titleTv.setText("");
+        dateTv.setText("");
+        descTv.setText("");
+        detailTv.setText("");
+        portTv.setText("");
+        statusIv.setImageDrawable(null);
+        consigneeTv.setText("");
+        clearAdditionView();
+    }
+
+
+    // endregion
+
+    // region set
+
+    public ApexResultBookingCell setTitle(String title) {
+        titleTv.setText(title);
+        return this;
+    }
+
+    public ApexResultBookingCell setDetail(String detail) {
+        detailTv.setText(detail);
+        return this;
+    }
+
+    public ApexResultBookingCell setIcon(String icon) {
+        if (icon != null) {
+            int resourceId = getContext().getResources().getIdentifier(icon, "drawable", getContext().getPackageName());
+            statusIv.setImageResource(resourceId);
+        } else {
+            statusIv.setImageDrawable(null);
+        }
+        return this;
+    }
+
+    public ApexResultBookingCell setPort(String port) {
+        portTv.setText(port);
+        return this;
+    }
+
+    public ApexResultBookingCell setTime(String time) {
+        dateTv.setText(time);
+        return this;
+    }
+
+    public ApexResultBookingCell setDescription(String description) {
+        descTv.setText(description);
+        return this;
+    }
+
+    public ApexResultBookingCell setConsignee(String consignee) {
+        consigneeTv.setText(consignee);
+        return this;
+    }
+
+    public void addAddition(String name, String value) {
+
+        ApexResultAdditionView additionView;
+        if (additionCount >= additionArray.size()) {
+
+            additionView = ApexResultAdditionView.makeAdditionView(getContext());
+            additionArray.add(additionView);
+
+        } else {
+            additionView = additionArray.get(additionCount);
+        }
+        additionCount++;
+
+        additionView.setTitle(name);
+        additionView.setValue(value);
+
+        LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
+        additionLayout.addView(additionView, layoutParams);
+    }
+
+    // endregion
+
+    // region Private
+
+    private void clearAdditionView() {
+        additionLayout.removeAllViews();
+        additionCount = 0;
+    }
+
+    // endregion
+}

+ 12 - 12
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultShipCell.java → ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/cell/ApexResultContainerCell.java

@@ -15,11 +15,11 @@ import com.usai.apex.mainframe.TrackingImageView;
 
 import java.util.ArrayList;
 
-public class ApexResultShipCell extends LinearLayout {
+public class ApexResultContainerCell extends LinearLayout {
 
     // region initial
-    public static ApexResultShipCell makeShipCell(Context context) {
-        ApexResultShipCell cell = (ApexResultShipCell) LayoutInflater.from(context).inflate(R.layout.apex_result_ship_cell, null);
+    public static ApexResultContainerCell makeContainerCell(Context context) {
+        ApexResultContainerCell cell = (ApexResultContainerCell) LayoutInflater.from(context).inflate(R.layout.apex_result_container_cell, null);
         cell.init();
 
         return cell;
@@ -33,15 +33,15 @@ public class ApexResultShipCell extends LinearLayout {
     private ArrayList<ApexResultAdditionView> additionArray = new ArrayList<>();
     private int additionCount = 0;
 
-    public ApexResultShipCell(Context context) {
+    public ApexResultContainerCell(Context context) {
         super(context);
     }
 
-    public ApexResultShipCell(Context context, @Nullable AttributeSet attrs) {
+    public ApexResultContainerCell(Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public ApexResultShipCell(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+    public ApexResultContainerCell(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
 
@@ -97,17 +97,17 @@ public class ApexResultShipCell extends LinearLayout {
 
     // region set
 
-    public ApexResultShipCell setTitle(String title) {
+    public ApexResultContainerCell setTitle(String title) {
         titleTv.setText(title);
         return this;
     }
 
-    public ApexResultShipCell setDetail(String detail) {
+    public ApexResultContainerCell setDetail(String detail) {
         detailTv.setText(detail);
         return this;
     }
 
-    public ApexResultShipCell setIcon(String icon) {
+    public ApexResultContainerCell setIcon(String icon) {
         if (icon != null) {
             int resourceId = getContext().getResources().getIdentifier(icon, "drawable", getContext().getPackageName());
             statusIv.setImageResource(resourceId);
@@ -117,17 +117,17 @@ public class ApexResultShipCell extends LinearLayout {
         return this;
     }
 
-    public ApexResultShipCell setPort(String port) {
+    public ApexResultContainerCell setPort(String port) {
         portTv.setText(port);
         return this;
     }
 
-    public ApexResultShipCell setTime(String time) {
+    public ApexResultContainerCell setTime(String time) {
         dateTv.setText(time);
         return this;
     }
 
-    public ApexResultShipCell setDescription(String description) {
+    public ApexResultContainerCell setDescription(String description) {
         descTv.setText(description);
         return this;
     }

+ 9 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultAddition.java

@@ -0,0 +1,9 @@
+package com.usai.apex.apexresult.model;
+
+import com.usai.apex.base.BaseObject;
+
+public class ApexResultAddition extends BaseObject {
+
+    public String name;
+    public String value;
+}

+ 62 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultBLInfoModel.java

@@ -0,0 +1,62 @@
+package com.usai.apex.apexresult.model;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+public class ApexResultBLInfoModel extends ApexResultBaseModel {
+
+
+    // region Model
+    public String title;
+    public String icon;
+    public String desc;
+    public String detail;
+    public String date;
+    public String port;
+    public int transport_stage;
+
+
+
+    public ApexResultBLInfoModel() {
+
+    }
+
+
+    // endregion
+
+
+    @Override
+    public JSONObject toJson() {
+        JSONObject json = super.toJson();
+
+        try {
+
+            if (title != null) {
+                json.put("title", title);
+            }
+            if (icon != null) {
+                json.put("icon", icon);
+            }
+            if (desc != null) {
+                json.put("desc", desc);
+            }
+            if (detail != null) {
+                json.put("detail", detail);
+            }
+            if (date != null) {
+                json.put("date", date);
+            }
+            if (port != null) {
+                json.put("port", port);
+            }
+
+            json.put("transport_stage", transport_stage);
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        return json;
+    }
+}

+ 50 - 1
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultBaseModel.java

@@ -8,6 +8,8 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.ArrayList;
+
 public class ApexResultBaseModel extends BaseObject {
 
     protected ApexResultBaseModel(Parcel in) {
@@ -32,6 +34,10 @@ public class ApexResultBaseModel extends BaseObject {
                 json.put("rowActionParameters", rowActionParameters);
             }
 
+            if (addition != null) {
+                json.put("addition", addition);
+            }
+
         } catch (JSONException e) {
             e.printStackTrace();
         }
@@ -40,10 +46,53 @@ public class ApexResultBaseModel extends BaseObject {
     }
 
     public static enum ApexResultType {
-        APEX_RESULT_TYPE_SHIP,
+        APEX_RESULT_TYPE_BOOKING,
+        APEX_RESULT_TYPE_BLINFO,
+        APEX_RESULT_TYPE_CONTAINER,
         APEX_RESULT_TYPE_DOCUMENT
     }
 
     public int type;
     public JSONArray rowActionParameters;
+
+    // region Addition
+
+    public Object addition; // 使用Object对象,便于baseObject赋值
+    private ArrayList<ApexResultAddition> additions;
+
+    public void setAddition(Object obj) {
+        this.addition = obj;
+        if (obj != null && obj instanceof JSONArray) {
+
+            JSONArray addition = (JSONArray) obj;
+            if (addition != null && addition.length() > 0) {
+
+                this.additions = new ArrayList<>();
+                for (int i = 0; i < addition.length(); i++) {
+                    JSONObject additionItem = addition.optJSONObject(i);
+                    if (additionItem != null) {
+
+                        ApexResultAddition additionModel = new ApexResultAddition();
+                        additionModel.setValuesForKeysWithJSON(additionItem);
+                        this.additions.add(additionModel);
+                    }
+                }
+
+            } else {
+                this.additions = null;
+            }
+
+        } else {
+            this.additions = null;
+        }
+
+
+
+    }
+
+    public ArrayList<ApexResultAddition> getAddition() {
+        return additions;
+    }
+
+    // endregion
 }

+ 67 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultBookingModel.java

@@ -0,0 +1,67 @@
+package com.usai.apex.apexresult.model;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+public class ApexResultBookingModel extends ApexResultBaseModel {
+
+
+    // region Model
+    public String title;
+    public String icon;
+    public String desc;
+    public String detail;
+    public String date;
+    public String port;
+    public String consignee;
+
+
+
+    public ApexResultBookingModel() {
+
+    }
+
+    // endregion
+
+
+    public String getIcon() {
+        return "mode_booking";
+    }
+
+    @Override
+    public JSONObject toJson() {
+        JSONObject json = super.toJson();
+
+        try {
+
+            if (title != null) {
+                json.put("title", title);
+            }
+            if (icon != null) {
+                json.put("icon", icon);
+            }
+            if (desc != null) {
+                json.put("desc", desc);
+            }
+            if (detail != null) {
+                json.put("detail", detail);
+            }
+            if (date != null) {
+                json.put("date", date);
+            }
+            if (port != null) {
+                json.put("port", port);
+            }
+
+            if (consignee != null) {
+                json.put("consignee", consignee);
+            }
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        return json;
+    }
+}

+ 62 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultContainerModel.java

@@ -0,0 +1,62 @@
+package com.usai.apex.apexresult.model;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+public class ApexResultContainerModel extends ApexResultBaseModel {
+
+
+    // region Model
+    public String title;
+    public String icon;
+    public String desc;
+    public String detail;
+    public String date;
+    public String port;
+    public int transport_stage;
+
+
+
+    public ApexResultContainerModel() {
+
+    }
+
+
+    // endregion
+
+
+    @Override
+    public JSONObject toJson() {
+        JSONObject json = super.toJson();
+
+        try {
+
+            if (title != null) {
+                json.put("title", title);
+            }
+            if (icon != null) {
+                json.put("icon", icon);
+            }
+            if (desc != null) {
+                json.put("desc", desc);
+            }
+            if (detail != null) {
+                json.put("detail", detail);
+            }
+            if (date != null) {
+                json.put("date", date);
+            }
+            if (port != null) {
+                json.put("port", port);
+            }
+
+            json.put("transport_stage", transport_stage);
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        return json;
+    }
+}

+ 0 - 113
ApexDrivers/apexmobile/src/main/java/com/usai/apex/apexresult/model/ApexResultShipModel.java

@@ -1,113 +0,0 @@
-package com.usai.apex.apexresult.model;
-
-import com.usai.apex.base.BaseObject;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-
-public class ApexResultShipModel extends ApexResultBaseModel {
-
-    // region Addition
-    public static class ApexResultAddition extends BaseObject{
-        public String name;
-        public String value;
-
-        private ApexResultAddition() {
-
-        }
-    }
-    // endregion
-
-    // region Model
-    public String title;
-    public String icon;
-    public String desc;
-    public String detail;
-    public String date;
-    public String port;
-    public int transport_stage;
-
-    public Object addition; // 使用Object对象,便于baseObject赋值
-    private ArrayList<ApexResultAddition> additions;
-
-    public ApexResultShipModel() {
-
-    }
-
-    public void setAddition(Object obj) {
-        this.addition = obj;
-        if (obj != null && obj instanceof JSONArray) {
-
-            JSONArray addition = (JSONArray) obj;
-            if (addition != null && addition.length() > 0) {
-
-                this.additions = new ArrayList<>();
-                for (int i = 0; i < addition.length(); i++) {
-                    JSONObject additionItem = addition.optJSONObject(i);
-                    if (additionItem != null) {
-
-                        ApexResultAddition additionModel = new ApexResultAddition();
-                        additionModel.setValuesForKeysWithJSON(additionItem);
-                        this.additions.add(additionModel);
-                    }
-                }
-
-            } else {
-                this.additions = null;
-            }
-
-        } else {
-            this.additions = null;
-        }
-
-
-
-    }
-
-    public ArrayList<ApexResultAddition> getAddition() {
-        return additions;
-    }
-    // endregion
-
-
-    @Override
-    public JSONObject toJson() {
-        JSONObject json = super.toJson();
-
-        try {
-
-            if (title != null) {
-                json.put("title", title);
-            }
-            if (icon != null) {
-                json.put("icon", icon);
-            }
-            if (desc != null) {
-                json.put("desc", desc);
-            }
-            if (detail != null) {
-                json.put("detail", detail);
-            }
-            if (date != null) {
-                json.put("date", date);
-            }
-            if (port != null) {
-                json.put("port", port);
-            }
-
-            json.put("transport_stage", transport_stage);
-
-            if (addition != null) {
-                json.put("addition", addition);
-            }
-
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
-
-        return json;
-    }
-}

+ 198 - 0
ApexDrivers/apexmobile/src/main/java/com/usai/apex/servicelocationmap/ApexServiceLocationMapFragment.java

@@ -0,0 +1,198 @@
+package com.usai.apex.servicelocationmap;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RelativeLayout;
+import android.widget.Toast;
+
+import com.usai.apex.ApexTrackingApplication;
+import com.usai.apex.LocationDetail;
+import com.usai.apex.R;
+import com.usai.redant.rautils.operationqueue.OperationQueue;
+import com.usai.util.Network;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.osmdroid.util.GeoPoint;
+import org.osmdroid.views.overlay.Marker;
+
+import redant.usai.com.apexmap.mapkit.ApexMapView;
+import redant.usai.com.apexmap.mapkit.ApexMarkerInfoWindow;
+
+public class ApexServiceLocationMapFragment extends Fragment {
+
+    // region InfoWindow Click Listener
+
+    public interface ApexServiceLocationMapInfoWindowClickListener {
+        void onInfoWindowClick(LocationDetail detail);
+    }
+
+    // endregion
+
+    // region Property
+
+    private ApexMapView mMapView;
+    private ApexServiceLocationMapInfoWindowClickListener mClickListener;
+    private boolean hasServiceLocation;
+
+    // endregion
+
+    // region Setter
+
+    public void setInfoWindowClickListener(ApexServiceLocationMapInfoWindowClickListener mClickListener) {
+        this.mClickListener = mClickListener;
+    }
+
+    public ApexServiceLocationMapInfoWindowClickListener getInfoWindowClickListener() {
+        return mClickListener;
+    }
+
+    // endregion
+
+    // region Override
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        RelativeLayout fragment = (RelativeLayout) inflater.inflate(R.layout.service_location_map_fragment, null);
+        mMapView = fragment.findViewById(R.id.service_location_map_view);
+        return fragment;
+    }
+
+    @Override
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        requestServiceLocations();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        mMapView.setCenter(29.945,104.7);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+    }
+
+    // endregion
+
+    // region Location
+
+    private void requestServiceLocations() {
+
+        if (hasServiceLocation) {
+            return;
+        }
+
+        OperationQueue.sharedQueue().addOperationTask(new OperationQueue.OperationBackgroundCallBack() {
+            @Override
+            public Object operationDoInBackground() {
+
+                String jstr = Network.get_servicelocation();
+
+                if (jstr == null || jstr.length() <= 0)
+                {
+                    return null;
+                }
+
+                JSONObject jsobj = null;
+                try {
+
+                    jsobj = new JSONObject(jstr);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+
+                return jsobj;
+            }
+        }, new OperationQueue.OperationCompletionCallBack() {
+            @Override
+            public void operationCompletion(Object object) {
+
+                if (mMapView == null) {
+                    return;
+                }
+
+                if (object != null) {
+
+                    JSONObject json = (JSONObject) object;
+                    addLocationMarkers(json);
+
+                } else {
+
+                    Toast toast = Toast.makeText(ApexTrackingApplication.get_instance(), getText(R.string.msg_net_error), Toast.LENGTH_LONG);
+                    toast.setGravity(Gravity.CENTER, 0, 0);
+                    toast.show();
+                }
+            }
+        }, null);
+    }
+
+    private void addLocationMarkers(JSONObject json) {
+
+        int count = json.optInt("total");
+
+        if (count > 0) {
+            hasServiceLocation = true;
+        }
+
+        JSONObject objrecords = json.optJSONObject("records");
+        if (objrecords != null) {
+
+            for (int i = 0; i < count; i++)
+            {
+
+                try {
+                    JSONObject objrec = objrecords.getJSONObject("record" + i);
+                    if (objrec != null) {
+
+                        String area = objrec.getString("area");
+                        String company = objrec.getString("company");
+                        String city = objrec.getString("city");
+                        String longitude = objrec.getString("longitude");
+                        String latitude = objrec.getString("latitude");
+                        String address = objrec.getString("address");
+                        String telephone = objrec.getString("telephone");
+                        String fax = objrec.getString("fax");
+                        String contact = objrec.getString("contact");
+                        String email = objrec.getString("email");
+
+                        LocationDetail detail = new LocationDetail(company, address, telephone, fax, contact, email);
+
+                        GeoPoint geopoint = new GeoPoint(Double.valueOf(latitude), Double.valueOf(longitude));
+                        Marker marker = mMapView.addMarker(geopoint, company, city + "\n" + area);
+                        mMapView.addWindowInfoForMarker(marker, detail, new ApexMarkerInfoWindow.ApexMarkerInfoWindowClickListener() {
+                            @Override
+                            public void onMarkerInfoWindowDidClick(ApexMarkerInfoWindow infoWindow, Object attachment) {
+                                if (mClickListener != null) {
+                                    LocationDetail locationDetail = (LocationDetail)attachment;
+                                    mClickListener.onInfoWindowClick(locationDetail);
+                                }
+                            }
+                        });
+
+                    }
+
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    // endregion
+}

+ 5 - 5
ApexDrivers/apexmobile/src/main/res/layout/apex_result_ship_cell.xml → ApexDrivers/apexmobile/src/main/res/layout/apex_result_blinfo_cell.xml

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<com.usai.apex.apexresult.cell.ApexResultShipCell xmlns:android="http://schemas.android.com/apk/res/android"
-                                                  android:layout_width="match_parent"
-                                                  android:layout_height="wrap_content"
-                                                  android:orientation="vertical"
+<com.usai.apex.apexresult.cell.ApexResultBLInfoCell xmlns:android="http://schemas.android.com/apk/res/android"
+                                                       android:layout_width="match_parent"
+                                                       android:layout_height="wrap_content"
+                                                       android:orientation="vertical"
     >
 
     <RelativeLayout
@@ -154,4 +154,4 @@
 
 
 
-</com.usai.apex.apexresult.cell.ApexResultShipCell>
+</com.usai.apex.apexresult.cell.ApexResultBLInfoCell>

+ 190 - 0
ApexDrivers/apexmobile/src/main/res/layout/apex_result_booking_cell.xml

@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.apex.apexresult.cell.ApexResultBookingCell xmlns:android="http://schemas.android.com/apk/res/android"
+                                                       android:layout_width="match_parent"
+                                                       android:layout_height="wrap_content"
+                                                       android:orientation="vertical"
+    >
+
+    <RelativeLayout
+        android:id="@+id/apex_result_ship_top"
+        android:layout_width="match_parent"
+        android:layout_height="15dp"
+        >
+
+    </RelativeLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="5dp"
+        android:layout_marginRight="5dp"
+        android:layout_marginBottom="5dp"
+        android:background="@drawable/apex_result_cell_bg"
+        android:clipChildren="true"
+        android:orientation="horizontal"
+        >
+
+
+        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                      xmlns:app="http://schemas.android.com/apk/res-auto"
+                      android:layout_width="0dp"
+                      android:layout_height="wrap_content"
+                      android:layout_weight="1"
+                      android:orientation="vertical"
+                      android:layout_marginRight="5dp"
+                      android:layout_marginEnd="5dp"
+            >
+
+            <android.support.constraint.ConstraintLayout
+                android:id="@+id/cell_content_view"
+                android:layout_width="match_parent"
+                android:layout_height="96dp"
+                android:clipChildren="true">
+
+                <com.usai.apex.mainframe.TrackingImageView
+                    android:id="@+id/iv_status"
+                    android:layout_width="42dp"
+                    android:layout_height="42dp"
+                    android:layout_marginTop="4dp"
+                    app:layout_constraintStart_toStartOf="@+id/tv_title"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_time"
+                    app:srcCompat="@drawable/ic_launcher" />
+
+
+                <LinearLayout
+                    android:id="@+id/t_header"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal"
+                    android:layout_marginLeft="13dp"
+                    android:layout_marginStart="13dp"
+                    android:layout_marginRight="3dp"
+                    android:layout_marginEnd="3dp"
+                    android:layout_marginTop="8dp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    />
+
+                <TextView
+                    android:id="@+id/tv_consignee"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:ellipsize="end"
+                    android:singleLine="true"
+                    android:text="Consignee"
+                    android:textColor="@color/icon_gray"
+                    android:textSize="12.7sp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    />
+
+                <TextView
+                    android:id="@+id/tv_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="13dp"
+                    android:layout_marginStart="13dp"
+                    android:layout_marginRight="3dp"
+                    android:layout_marginEnd="3dp"
+                    android:layout_marginTop="8dp"
+                    android:ellipsize="end"
+                    android:singleLine="true"
+                    android:text="TextView"
+                    android:textColor="@color/icon_gray"
+                    android:textSize="12.7sp"
+                    app:layout_constraintEnd_toStartOf="@id/tv_consignee"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+
+
+
+                <TextView
+                    android:id="@+id/tv_time"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginRight="8dp"
+                    android:layout_marginEnd="8dp"
+                    android:layout_marginTop="2dp"
+                    android:text="TextView"
+                    android:textColor="@color/icon_red"
+                    android:textSize="9.7sp"
+                    app:layout_constraintEnd_toStartOf="@+id/tv_port"
+                    app:layout_constraintStart_toStartOf="@+id/tv_title"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+                <TextView
+                    android:id="@+id/tv_port"
+                    android:layout_width="94dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="3dp"
+                    android:gravity="right"
+                    android:text="CNTAO - USLAX"
+                    android:textColor="@color/icon_red"
+                    android:textSize="9.7sp"
+                    app:layout_constraintEnd_toEndOf="@+id/t_header"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+                <TextView
+                    android:id="@+id/tv_description"
+                    android:layout_width="0dp"
+                    android:layout_height="16dp"
+                    android:layout_marginLeft="7dp"
+                    android:layout_marginStart="7dp"
+                    android:ellipsize="end"
+                    android:singleLine="true"
+                    android:text="TextView"
+                    android:textColor="@color/icon_gray"
+                    android:textSize="12.7sp"
+                    app:layout_constraintEnd_toEndOf="@+id/t_header"
+                    app:layout_constraintStart_toEndOf="@+id/iv_status"
+                    app:layout_constraintTop_toTopOf="@+id/iv_status" />
+
+                <TextView
+                    android:id="@+id/tv_detail"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginBottom="2dp"
+                    android:layout_marginLeft="7dp"
+                    android:layout_marginStart="7dp"
+                    android:layout_marginTop="2dp"
+                    android:ellipsize="end"
+                    android:lines="2"
+                    android:text="TextView"
+                    android:textColor="@android:color/darker_gray"
+                    android:textSize="9.7sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="@+id/t_header"
+                    app:layout_constraintStart_toEndOf="@+id/iv_status"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_description" />
+
+            </android.support.constraint.ConstraintLayout>
+
+            <LinearLayout
+                android:id="@+id/apex_result_ship_addition_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:layout_marginLeft="13dp"
+                android:layout_marginStart="13dp"
+                >
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:id="@+id/v_transport_stage"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:background="@drawable/list_corner_transport_stage_bg_0"
+            />
+
+    </LinearLayout>
+
+
+
+
+</com.usai.apex.apexresult.cell.ApexResultBookingCell>

+ 157 - 0
ApexDrivers/apexmobile/src/main/res/layout/apex_result_container_cell.xml

@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.apex.apexresult.cell.ApexResultContainerCell xmlns:android="http://schemas.android.com/apk/res/android"
+                                                       android:layout_width="match_parent"
+                                                       android:layout_height="wrap_content"
+                                                       android:orientation="vertical"
+    >
+
+    <RelativeLayout
+        android:id="@+id/apex_result_ship_top"
+        android:layout_width="match_parent"
+        android:layout_height="15dp"
+        >
+
+    </RelativeLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="5dp"
+        android:layout_marginRight="5dp"
+        android:layout_marginBottom="5dp"
+        android:background="@drawable/apex_result_cell_bg"
+        android:clipChildren="true"
+        android:orientation="horizontal"
+        >
+
+
+        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                      xmlns:app="http://schemas.android.com/apk/res-auto"
+                      android:layout_width="0dp"
+                      android:layout_height="wrap_content"
+                      android:layout_weight="1"
+                      android:orientation="vertical"
+                      android:layout_marginRight="5dp"
+                      android:layout_marginEnd="5dp"
+            >
+
+            <android.support.constraint.ConstraintLayout
+                android:id="@+id/cell_content_view"
+                android:layout_width="match_parent"
+                android:layout_height="96dp"
+                android:clipChildren="true">
+
+                <com.usai.apex.mainframe.TrackingImageView
+                    android:id="@+id/iv_status"
+                    android:layout_width="42dp"
+                    android:layout_height="42dp"
+                    android:layout_marginTop="4dp"
+                    app:layout_constraintStart_toStartOf="@+id/tv_title"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_time"
+                    app:srcCompat="@drawable/ic_launcher" />
+
+                <TextView
+                    android:id="@+id/tv_title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="13dp"
+                    android:layout_marginStart="13dp"
+                    android:layout_marginRight="3dp"
+                    android:layout_marginEnd="3dp"
+                    android:layout_marginTop="8dp"
+                    android:ellipsize="end"
+                    android:singleLine="true"
+                    android:text="TextView"
+                    android:textColor="@color/icon_gray"
+                    android:textSize="12.7sp"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_time"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginRight="8dp"
+                    android:layout_marginEnd="8dp"
+                    android:layout_marginTop="2dp"
+                    android:text="TextView"
+                    android:textColor="@color/icon_red"
+                    android:textSize="9.7sp"
+                    app:layout_constraintEnd_toStartOf="@+id/tv_port"
+                    app:layout_constraintStart_toStartOf="@+id/tv_title"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+                <TextView
+                    android:id="@+id/tv_port"
+                    android:layout_width="94dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="3dp"
+                    android:gravity="right"
+                    android:text="CNTAO - USLAX"
+                    android:textColor="@color/icon_red"
+                    android:textSize="9.7sp"
+                    app:layout_constraintEnd_toEndOf="@+id/tv_title"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+                <TextView
+                    android:id="@+id/tv_description"
+                    android:layout_width="0dp"
+                    android:layout_height="16dp"
+                    android:layout_marginLeft="7dp"
+                    android:layout_marginStart="7dp"
+                    android:ellipsize="end"
+                    android:singleLine="true"
+                    android:text="TextView"
+                    android:textColor="@color/icon_gray"
+                    android:textSize="12.7sp"
+                    app:layout_constraintEnd_toEndOf="@+id/tv_title"
+                    app:layout_constraintStart_toEndOf="@+id/iv_status"
+                    app:layout_constraintTop_toTopOf="@+id/iv_status" />
+
+                <TextView
+                    android:id="@+id/tv_detail"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginBottom="2dp"
+                    android:layout_marginLeft="7dp"
+                    android:layout_marginStart="7dp"
+                    android:layout_marginTop="2dp"
+                    android:ellipsize="end"
+                    android:lines="2"
+                    android:text="TextView"
+                    android:textColor="@android:color/darker_gray"
+                    android:textSize="9.7sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="@+id/tv_title"
+                    app:layout_constraintStart_toEndOf="@+id/iv_status"
+                    app:layout_constraintTop_toBottomOf="@+id/tv_description" />
+
+            </android.support.constraint.ConstraintLayout>
+
+            <LinearLayout
+                android:id="@+id/apex_result_ship_addition_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:layout_marginLeft="13dp"
+                android:layout_marginStart="13dp"
+                >
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <View
+            android:id="@+id/v_transport_stage"
+            android:layout_width="5dp"
+            android:layout_height="match_parent"
+            android:background="@drawable/list_corner_transport_stage_bg_0"
+            />
+
+    </LinearLayout>
+
+
+
+
+</com.usai.apex.apexresult.cell.ApexResultContainerCell>

+ 14 - 0
ApexDrivers/apexmobile/src/main/res/layout/service_location_map_activity.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <FrameLayout
+        android:id="@+id/service_location_map_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        >
+
+    </FrameLayout>
+
+</RelativeLayout>

+ 15 - 0
ApexDrivers/apexmobile/src/main/res/layout/service_location_map_fragment.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+
+    <redant.usai.com.apexmap.mapkit.ApexMapView
+        android:id="@+id/service_location_map_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    </redant.usai.com.apexmap.mapkit.ApexMapView>
+
+
+</RelativeLayout>