Parcourir la source

1.修改Android Apex Drivers Order Detail,增加Map、Photo和Signature。

Pen Li il y a 7 ans
Parent
commit
9278a66d78
19 fichiers modifiés avec 750 ajouts et 23 suppressions
  1. 3 0
      ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/Utils/ImageUtil.java
  2. 19 8
      ApexDrivers/app/app.iml
  3. 2 0
      ApexDrivers/app/build.gradle
  4. 53 9
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/DetailActivity.java
  5. 265 1
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/DetailAdapter.java
  6. 42 4
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/DetailSectionModel.java
  7. 6 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailActionModel.java
  8. 2 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailActionSelectionModel.java
  9. 31 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailBaseModel.java
  10. 5 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailLocationModel.java
  11. 10 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailMapModel.java
  12. 6 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailMultipleLineModel.java
  13. 85 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailPhotoModel.java
  14. 84 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailSignatureModel.java
  15. 5 0
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailSingleLineModel.java
  16. 1 1
      ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Update/Model/UpdatePhotoModel.java
  17. 53 0
      ApexDrivers/app/src/main/res/layout/detail_map_cell.xml
  18. 42 0
      ApexDrivers/app/src/main/res/layout/detail_photo_cell.xml
  19. 36 0
      ApexDrivers/app/src/main/res/layout/detail_signature_cell.xml

+ 3 - 0
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/Utils/ImageUtil.java

@@ -206,6 +206,9 @@ public class ImageUtil {
         if (file == null) {
             return null;
         }
+        if (!file.exists() || file.isDirectory()) {
+            return null;
+        }
         final BitmapFactory.Options options = new BitmapFactory.Options();
         options.inJustDecodeBounds = true;
         BitmapFactory.decodeFile(file.getAbsolutePath(), options);

+ 19 - 8
ApexDrivers/app/app.iml

@@ -70,13 +70,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
@@ -84,6 +77,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
@@ -91,6 +91,7 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
@@ -107,11 +108,14 @@
     <orderEntry type="library" name="Gradle: com.android.support:transition-27.1.1" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:support-v4-27.1.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-1.0.2" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-location-license-11.4.2" level="project" />
     <orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.0@jar" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:support-annotations:27.1.1@jar" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-maps-license-11.4.2" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-27.1.1" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:support-compat-27.1.1" level="project" />
     <orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel-1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-tasks-license-11.4.2" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7-27.1.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-27.1.1" level="project" />
@@ -119,6 +123,8 @@
     <orderEntry type="library" name="Gradle: com.android.support:support-core-ui-27.1.1" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-1.1.2" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:support-core-utils-27.1.1" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement-11.4.2" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/macmini1/android project/ApexDrivers/app/libs/core-2.3.0.jar:unspecified@jar" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-3.0.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
@@ -126,17 +132,22 @@
     <orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
     <orderEntry type="library" name="Gradle: android.arch.core:runtime-1.1.0" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base-11.4.2" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement-license-11.4.2" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:design-27.1.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor-1.0.2" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-27.1.1" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-3.0.2" level="project" />
     <orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.2@jar" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base-license-11.4.2" level="project" />
     <orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core-1.1.0" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-location-11.4.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
     <orderEntry type="library" name="Gradle: android.arch.core:common:1.1.0@jar" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-maps-11.4.2" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-tasks-11.4.2" level="project" />
     <orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
-    <orderEntry type="library" name="Gradle: __local_aars__:/Users/ray/Documents/code_ERPSuiteAndroid/ApexDrivers/app/libs/core-2.3.0.jar:unspecified@jar" level="project" />
     <orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime-1.1.0" level="project" />
     <orderEntry type="module" module-name="RAUtilsLibrary" />
   </component>

+ 2 - 0
ApexDrivers/app/build.gradle

@@ -27,4 +27,6 @@ dependencies {
     androidTestImplementation 'com.android.support.test:runner:1.0.2'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
     implementation files('libs/core-2.3.0.jar')
+    api 'com.google.android.gms:play-services-maps:11.4.2'
+    api 'com.google.android.gms:play-services-location:11.4.2'
 }

+ 53 - 9
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/DetailActivity.java

@@ -12,6 +12,7 @@ import android.os.Handler;
 import android.os.Message;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.content.LocalBroadcastManager;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
@@ -52,6 +53,7 @@ import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 
 
+import static com.usai.redant.apexdrivers.Detail.DetailAdapter.MapLifCircleAction;
 import static com.usai.redant.apexdrivers.Detail.Model.DetailSubActionModel.DetailActionSubType.DetailActionSubTypeAccept;
 import static com.usai.redant.apexdrivers.Detail.Model.DetailSubActionModel.DetailActionSubType.DetailActionSubTypeEnum;
 import static com.usai.redant.apexdrivers.Detail.Model.DetailSubActionModel.DetailActionSubType.DetailActionSubTypeUpdate;
@@ -175,6 +177,16 @@ public class DetailActivity extends AppCompatActivity implements DetailAdapter.D
         }
     }
 
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home:
+                this.finish(); // back button
+                return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
@@ -189,23 +201,55 @@ public class DetailActivity extends AppCompatActivity implements DetailAdapter.D
             outState.putString(SaveOrderType2Key,mOrderType2);
         }
         outState.putInt(SaveOrderStatusKey,mOrderStatus);
+
+        sendLifeCircleBroadCast(0);
     }
 
     @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case android.R.id.home:
-                this.finish(); // back button
-                return true;
-        }
-        return super.onOptionsItemSelected(item);
+    protected void onResume() {
+        super.onResume();
+        sendLifeCircleBroadCast(1);
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        sendLifeCircleBroadCast(2);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        sendLifeCircleBroadCast(3);
+    }
+    @Override
+    protected void onPause() {
+        sendLifeCircleBroadCast(4);
+        super.onPause();
+    }
+
+    @Override
+    public void onLowMemory() {
+        super.onLowMemory();
+        sendLifeCircleBroadCast(5);
     }
 
     @Override
     protected void onDestroy() {
-        super.onDestroy();
 
         dismissProgressDialog();
+
+        sendLifeCircleBroadCast(6);
+
+        super.onDestroy();
+    }
+
+    private void sendLifeCircleBroadCast(int life) {
+
+        Intent intent = new Intent(MapLifCircleAction);
+        intent.putExtra("Life",life);
+
+        LocalBroadcastManager.getInstance(mCtx).sendBroadcast(intent);
     }
 
     private void goHome() {
@@ -260,7 +304,7 @@ public class DetailActivity extends AppCompatActivity implements DetailAdapter.D
                 for (int i = 0; i < sectionArr.length(); i++) {
 
                     JSONObject section = sectionArr.getJSONObject(i);
-                    DetailSectionModel model = new DetailSectionModel();
+                    DetailSectionModel model = new DetailSectionModel(mCtx);
 
                     model.title = section.optString("title");
                     model.setValues(section.optJSONArray("values"));

+ 265 - 1
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/DetailAdapter.java

@@ -1,20 +1,31 @@
 package com.usai.redant.apexdrivers.Detail;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.v4.content.LocalBroadcastManager;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseExpandableListAdapter;
 import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import com.google.android.gms.maps.GoogleMap;
+import com.google.android.gms.maps.OnMapReadyCallback;
 import com.usai.redant.apexdrivers.Detail.Model.DetailActionModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailBaseModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailLocationModel;
+import com.usai.redant.apexdrivers.Detail.Model.DetailMapModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailMultipleLineModel;
+import com.usai.redant.apexdrivers.Detail.Model.DetailPhotoModel;
+import com.usai.redant.apexdrivers.Detail.Model.DetailSignatureModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailSingleLineModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailSubActionModel;
 import com.usai.redant.apexdrivers.R;
@@ -75,7 +86,7 @@ public class DetailAdapter extends BaseExpandableListAdapter {
     @Override
     public int getChildTypeCount() {
 
-        return 4;
+        return DetailBaseModel.detailValueTypeCount();
     }
 
     @Override
@@ -198,6 +209,51 @@ public class DetailAdapter extends BaseExpandableListAdapter {
                 holder.bindLocationModel(locationModel);
             }
             break;
+            case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeMap: {
+                MapHolder holder;
+                if (convertView == null) {
+
+                    convertView = LayoutInflater.from(mCtx).inflate(R.layout.detail_map_cell,null);
+                    holder = new MapHolder(convertView);
+
+                } else {
+                    holder = (MapHolder)convertView.getTag();
+                }
+
+                DetailMapModel mapModel = (DetailMapModel)model;
+                holder.bindModel(mapModel);
+            }
+            break;
+            case DetailBaseModel.OrderDetailValueType.OderDetailValueTypePhoto: {
+                PhotoHolder holder;
+                if (convertView == null) {
+
+                    convertView = LayoutInflater.from(mCtx).inflate(R.layout.detail_photo_cell,null);
+                    holder = new PhotoHolder(convertView);
+
+                } else {
+                    holder = (PhotoHolder)convertView.getTag();
+                }
+
+                DetailPhotoModel mapModel = (DetailPhotoModel)model;
+                holder.bindModel(mapModel);
+            }
+            break;
+            case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeSignature: {
+                SignatureHolder holder;
+                if (convertView == null) {
+
+                    convertView = LayoutInflater.from(mCtx).inflate(R.layout.detail_signature_cell,null);
+                    holder = new SignatureHolder(convertView);
+
+                } else {
+                    holder = (SignatureHolder)convertView.getTag();
+                }
+
+                DetailSignatureModel mapModel = (DetailSignatureModel)model;
+                holder.bindModel(mapModel);
+            }
+
             default:
                 break;
         }
@@ -382,6 +438,214 @@ public class DetailAdapter extends BaseExpandableListAdapter {
         }
     }
 
+    public final static String MapLifCircleAction = "com.apex.driver.map_life_circle.action";
+
+    private class MapHolder implements OnMapReadyCallback,DetailBaseModel.OrderDetailModelDelegate {
+        TextView titleTv;
+        TextView valueTv;
+        com.google.android.gms.maps.MapView mapView;
+        GoogleMap googleMap;
+        WeakReference<DetailMapModel> weakMap;
+        MapBroadcastReceiver receiver;
+
+        private class MapBroadcastReceiver extends BroadcastReceiver {
+
+            @Override
+            public void onReceive(Context context, Intent intent) {
+
+                int life = intent.getIntExtra("life",0);
+                switch (life) {
+                    case 0:{
+                        onActivitySaveInstanceState();
+                    }
+                    break;
+                    case 1:{
+                        onActivityResume();
+                    }
+                    break;
+                    case 2:{
+                        onActivityStart();
+                    }
+                    break;
+                    case 3:{
+                        onActivityStop();
+                    }
+                    break;
+                    case 4:{
+                        onActivityPause();
+                    }
+                    break;
+                    case 5:{
+                        onActivityLowMemory();
+                    }
+                    break;
+                    case 6:{
+                        onActivityDestroy();
+                    }
+                    break;
+                }
+            }
+        }
+
+        MapHolder(View view) {
+
+            titleTv = view.findViewById(R.id.detail_map_title_tv);
+            valueTv = view.findViewById(R.id.detail_map_value_tv);
+            mapView = view.findViewById(R.id.detail_map_view);
+            mapView.getMapAsync(this);
+
+            view.setTag(this);
+
+            receiver = new MapBroadcastReceiver();
+
+            IntentFilter  intentFilter = new IntentFilter();
+            intentFilter.addAction(MapLifCircleAction);
+
+            LocalBroadcastManager.getInstance(mCtx).registerReceiver(receiver,intentFilter);
+        }
+
+        private void onActivitySaveInstanceState() {
+
+            onActivityDestroy();
+        }
+
+
+        private void onActivityResume() {
+            mapView.onResume();
+        }
+
+
+        private void onActivityStart() {
+            mapView.onStart();
+        }
+
+
+        private void onActivityStop() {
+            mapView.onStop();
+        }
+
+        private void onActivityPause() {
+            mapView.onPause();
+        }
+
+        private void onActivityDestroy() {
+
+            mapView.onDestroy();
+            LocalBroadcastManager.getInstance(mCtx).unregisterReceiver(receiver);
+        }
+
+        private void onActivityLowMemory() {
+            mapView.onLowMemory();
+        }
+
+        public void bindModel(DetailMapModel model) {
+            if (weakMap != null && weakMap.get() != null) {
+                weakMap.get().setDelegate(null);
+            }
+            if (model != null) {
+                weakMap = new WeakReference<>(model);
+                weakMap.get().setDelegate(this);
+            } else {
+                weakMap = null;
+            }
+
+        }
+
+        @Override
+        public void onMapReady(GoogleMap googleMap) {
+            this.googleMap = googleMap;
+
+            refreshUI();
+        }
+
+        @Override
+        public void refreshUI() {
+            if (weakMap != null) {
+                DetailMapModel model = weakMap.get();
+                if (model != null) {
+
+                }
+            }
+        }
+    }
+
+    private class PhotoHolder implements DetailBaseModel.OrderDetailModelDelegate {
+        TextView titleTv;
+        ImageButton photoBtn;
+        WeakReference<DetailPhotoModel> weakPhoto;
+
+        PhotoHolder(View view) {
+
+            titleTv = view.findViewById(R.id.detail_photo_title_tv);
+            photoBtn = view.findViewById(R.id.detail_photo_btn);
+
+            view.setTag(this);
+        }
+
+        public void bindModel(DetailPhotoModel model) {
+            if (weakPhoto != null && weakPhoto.get() != null) {
+                weakPhoto.get().setDelegate(null);
+            }
+            if (model != null) {
+                weakPhoto = new WeakReference<>(model);
+                weakPhoto.get().setDelegate(this);
+            } else {
+                weakPhoto = null;
+            }
+        }
+
+        @Override
+        public void refreshUI() {
+            if (weakPhoto != null) {
+                DetailPhotoModel model = weakPhoto.get();
+                if (model != null) {
+
+                    titleTv.setText(model.getTitle());
+                    photoBtn.setImageBitmap(model.getPhoto());
+                }
+            }
+        }
+    }
+
+    private class SignatureHolder implements DetailBaseModel.OrderDetailModelDelegate {
+
+        TextView titleTv;
+        ImageView signatureView;
+        WeakReference<DetailSignatureModel> weakSignature;
+
+        SignatureHolder(View view) {
+
+            titleTv = view.findViewById(R.id.detail_signature_title_tv);
+            signatureView = view.findViewById(R.id.detail_signature_image_view);
+
+            view.setTag(this);
+        }
+
+        public void bindModel(DetailSignatureModel model) {
+            if (weakSignature != null && weakSignature.get() != null) {
+                weakSignature.get().setDelegate(null);
+            }
+            if (model != null) {
+                weakSignature = new WeakReference<>(model);
+                weakSignature.get().setDelegate(this);
+            } else {
+                weakSignature = null;
+            }
+        }
+
+        @Override
+        public void refreshUI() {
+            if (weakSignature != null) {
+                DetailSignatureModel model = weakSignature.get();
+                if (model != null) {
+
+                    titleTv.setText(model.getTitle());
+                    signatureView.setImageBitmap(model.getSignature());
+                }
+            }
+        }
+    }
+
     public interface DetailActionDelegate {
 
         void performAction(View view,DetailSubActionModel actionModel);

+ 42 - 4
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/DetailSectionModel.java

@@ -1,9 +1,14 @@
 package com.usai.redant.apexdrivers.Detail;
 
+import android.content.Context;
+
 import com.usai.redant.apexdrivers.Detail.Model.DetailActionModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailBaseModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailLocationModel;
+import com.usai.redant.apexdrivers.Detail.Model.DetailMapModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailMultipleLineModel;
+import com.usai.redant.apexdrivers.Detail.Model.DetailPhotoModel;
+import com.usai.redant.apexdrivers.Detail.Model.DetailSignatureModel;
 import com.usai.redant.apexdrivers.Detail.Model.DetailSingleLineModel;
 
 import org.json.JSONArray;
@@ -16,6 +21,11 @@ public class DetailSectionModel {
     public ArrayList<DetailBaseModel> values = new ArrayList<>();
     public String title;
 
+    private Context mCtx;
+    DetailSectionModel(Context context) {
+        mCtx = context;
+    }
+
     public int itemCount() {
         if (values == null) {
             return 0;
@@ -43,7 +53,7 @@ public class DetailSectionModel {
                     int type = value.optInt("type",-1);
                     switch (type) {
                         case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeSingleLine: {
-                            DetailSingleLineModel model = new DetailSingleLineModel();
+                            DetailSingleLineModel model = new DetailSingleLineModel(mCtx);
 
                             model.title = value.optString("title");
                             model.value = value.optString("value");
@@ -53,7 +63,7 @@ public class DetailSectionModel {
                         }
                         break;
                         case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeMultipleLine: {
-                            DetailMultipleLineModel model = new DetailMultipleLineModel();
+                            DetailMultipleLineModel model = new DetailMultipleLineModel(mCtx);
 
                             model.value = value.optString("value");
                             model.type = type;
@@ -63,7 +73,7 @@ public class DetailSectionModel {
                         break;
                         case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeAction: {
 
-                            DetailActionModel model = new DetailActionModel();
+                            DetailActionModel model = new DetailActionModel(mCtx);
 
                             model.setActions(value.optJSONArray("actions"));
                             model.type = type;
@@ -73,7 +83,7 @@ public class DetailSectionModel {
                         break;
                         case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeLocation: {
 
-                            DetailLocationModel model = new DetailLocationModel();
+                            DetailLocationModel model = new DetailLocationModel(mCtx);
 
                             model.title = value.optString("title");
                             model.location = value.optString("location");
@@ -82,6 +92,34 @@ public class DetailSectionModel {
                             this.values.add(model);
                         }
                         break;
+                        case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeMap: {
+
+                            DetailMapModel model = new DetailMapModel(mCtx);
+                            model.type = type;
+
+                            this.values.add(model);
+                        }
+                        break;
+                        case DetailBaseModel.OrderDetailValueType.OderDetailValueTypePhoto: {
+
+                            DetailPhotoModel model = new DetailPhotoModel(mCtx);
+                            model.setTitle(value.optString("title"));
+                            model.setPhotoURL(value.optString("photoURL"));
+                            model.type = type;
+
+                            this.values.add(model);
+                        }
+                        break;
+                        case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeSignature: {
+
+                            DetailSignatureModel model = new DetailSignatureModel(mCtx);
+                            model.setTitle(value.optString("title"));
+                            model.setSignatureURL(value.optString("signatureURL"));
+                            model.type = type;
+
+                            this.values.add(model);
+                        }
+                        break;
                         default:
                             break;
                     }

+ 6 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailActionModel.java

@@ -1,5 +1,7 @@
 package com.usai.redant.apexdrivers.Detail.Model;
 
+import android.content.Context;
+
 import com.usai.redant.rautils.Utils.RAUtil;
 
 import org.json.JSONArray;
@@ -11,6 +13,10 @@ public class DetailActionModel extends DetailBaseModel{
 
     public ArrayList<DetailSubActionModel> actions = new ArrayList<>();
 
+    public DetailActionModel(Context context) {
+        super(context);
+    }
+
     public int actionCount() {
         if (actions == null) {
             return 0;

+ 2 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailActionSelectionModel.java

@@ -1,5 +1,7 @@
 package com.usai.redant.apexdrivers.Detail.Model;
 
+import android.content.Context;
+
 public class DetailActionSelectionModel {
 
     public String actionTitle;

+ 31 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailBaseModel.java

@@ -1,5 +1,7 @@
 package com.usai.redant.apexdrivers.Detail.Model;
 
+import android.content.Context;
+
 public class DetailBaseModel {
 
     public static class OrderDetailValueType {
@@ -7,8 +9,37 @@ public class DetailBaseModel {
         public static final int OderDetailValueTypeMultipleLine = 1;
         public static final int OderDetailValueTypeAction = 2;
         public static final int OderDetailValueTypeLocation = 3;
+        public static final int OderDetailValueTypeMap = 4;
+        public static final int OderDetailValueTypePhoto = 5;
+        public static final int OderDetailValueTypeSignature = 6;
+    }
+
+    public static int detailValueTypeCount() {
+        return 7;
+    }
+
+    public interface OrderDetailModelDelegate {
+        void refreshUI();
     }
 
     public int type;
 
+    private OrderDetailModelDelegate delegate;
+
+    Context mCtx;
+    public DetailBaseModel(Context context) {
+        mCtx = context;
+    }
+
+    public void setDelegate(OrderDetailModelDelegate delegate) {
+        this.delegate = delegate;
+
+        if (delegate != null) {
+            delegate.refreshUI();
+        }
+    }
+
+    public OrderDetailModelDelegate getDelegate() {
+        return delegate;
+    }
 }

+ 5 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailLocationModel.java

@@ -1,8 +1,13 @@
 package com.usai.redant.apexdrivers.Detail.Model;
 
+import android.content.Context;
+
 public class DetailLocationModel extends DetailBaseModel {
 
     public String title;
     public String location;
 
+    public DetailLocationModel(Context context) {
+        super(context);
+    }
 }

+ 10 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailMapModel.java

@@ -0,0 +1,10 @@
+package com.usai.redant.apexdrivers.Detail.Model;
+
+import android.content.Context;
+
+public class DetailMapModel extends DetailBaseModel {
+
+    public DetailMapModel(Context context) {
+        super(context);
+    }
+}

+ 6 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailMultipleLineModel.java

@@ -1,6 +1,12 @@
 package com.usai.redant.apexdrivers.Detail.Model;
 
+import android.content.Context;
+
 public class DetailMultipleLineModel extends DetailBaseModel {
 
     public String value;
+
+    public DetailMultipleLineModel(Context context) {
+        super(context);
+    }
 }

+ 85 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailPhotoModel.java

@@ -0,0 +1,85 @@
+package com.usai.redant.apexdrivers.Detail.Model;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.text.TextUtils;
+
+import com.usai.redant.apexdrivers.ApexDriverApplication;
+import com.usai.redant.apexdrivers.Utils.OperationQueue;
+import com.usai.redant.rautils.Utils.ImageUtil;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class DetailPhotoModel extends DetailBaseModel {
+
+    private String title;
+    private String photoURL;
+    private Bitmap photo;
+
+    public DetailPhotoModel(Context context) {
+        super(context);
+    }
+
+    private void setPhoto(Bitmap photo) {
+        this.photo = photo;
+
+        if (getDelegate() != null) {
+            getDelegate().refreshUI();
+        }
+    }
+
+    public Bitmap getPhoto() {
+        return photo;
+    }
+
+    public String getPhotoURL() {
+        return photoURL;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public void setPhotoURL(final String photoURL) {
+        this.photoURL = photoURL;
+
+        if (TextUtils.isEmpty(photoURL)) {
+            setPhoto(null);
+            return;
+        }
+
+        ApexDriverApplication.sharedApplication().getNetworkQueue().addOperationTask(new OperationQueue.OperationBackgroundCallBack() {
+            @Override
+            public Object operationDoInBackground() {
+
+                try {
+
+                    return ImageUtil.loadImageFromURL(mCtx,new URI(photoURL));
+
+                } catch (URISyntaxException e) {
+                    e.printStackTrace();
+                }
+
+                return null;
+            }
+        }, new OperationQueue.OperationCompletionCallBack() {
+            @Override
+            public void operationCompletion(Object object) {
+
+                Bitmap bitmap = (Bitmap)object;
+                setPhoto(bitmap);
+            }
+        }, new OperationQueue.OperationCancelCallBack() {
+            @Override
+            public void operationCancelled() {
+                setPhoto(null);
+            }
+        });
+    }
+
+}

+ 84 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailSignatureModel.java

@@ -0,0 +1,84 @@
+package com.usai.redant.apexdrivers.Detail.Model;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.text.TextUtils;
+
+import com.usai.redant.apexdrivers.ApexDriverApplication;
+import com.usai.redant.apexdrivers.Utils.OperationQueue;
+import com.usai.redant.rautils.Utils.ImageUtil;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class DetailSignatureModel extends DetailBaseModel {
+
+    private String title;
+    private String signatureURL;
+    private Bitmap signature;
+
+    public DetailSignatureModel(Context context) {
+        super(context);
+    }
+
+    private void setSignature(Bitmap signature) {
+        this.signature = signature;
+
+        if (getDelegate() != null) {
+            getDelegate().refreshUI();
+        }
+    }
+
+    public Bitmap getSignature() {
+        return signature;
+    }
+
+    public String getSignatureURL() {
+        return signatureURL;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public void setSignatureURL(final String signatureURL) {
+        this.signatureURL = signatureURL;
+
+        if (TextUtils.isEmpty(signatureURL)) {
+            setSignature(null);
+            return;
+        }
+
+        ApexDriverApplication.sharedApplication().getNetworkQueue().addOperationTask(new OperationQueue.OperationBackgroundCallBack() {
+            @Override
+            public Object operationDoInBackground() {
+
+                try {
+
+                    return ImageUtil.loadImageFromURL(mCtx,new URI(signatureURL));
+
+                } catch (URISyntaxException e) {
+                    e.printStackTrace();
+                }
+
+                return null;
+            }
+        }, new OperationQueue.OperationCompletionCallBack() {
+            @Override
+            public void operationCompletion(Object object) {
+
+                Bitmap bitmap = (Bitmap)object;
+                setSignature(bitmap);
+            }
+        }, new OperationQueue.OperationCancelCallBack() {
+            @Override
+            public void operationCancelled() {
+                setSignature(null);
+            }
+        });
+    }
+}

+ 5 - 0
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Detail/Model/DetailSingleLineModel.java

@@ -1,8 +1,13 @@
 package com.usai.redant.apexdrivers.Detail.Model;
 
+import android.content.Context;
+
 public class DetailSingleLineModel extends DetailBaseModel {
 
     public String title;
     public String value;
 
+    public DetailSingleLineModel(Context context) {
+        super(context);
+    }
 }

+ 1 - 1
ApexDrivers/app/src/main/java/com/usai/redant/apexdrivers/Update/Model/UpdatePhotoModel.java

@@ -50,7 +50,7 @@ public class UpdatePhotoModel extends UpdateImageBaseModel {
         if (photo != null) {
             return photo;
         }
-        if (photoPath != null) {
+        if (photoPath != null && photoPath.length() > 0) {
             photo = BitmapFactory.decodeFile(photoPath);
             return photo;
         }

+ 53 - 0
ApexDrivers/app/src/main/res/layout/detail_map_cell.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:background="#ffffff"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/detail_map_title_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="5dp"
+        android:textSize="19sp"
+        android:textColor="#000000"
+        android:text="Pick Up"
+        />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/detail_map_title_tv"
+        android:layout_alignLeft="@id/detail_map_title_tv"
+        android:layout_alignRight="@id/detail_map_title_tv"
+        >
+
+        <com.google.android.gms.maps.MapView
+            android:id="@+id/detail_map_view"
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_centerVertical="true"
+            android:layout_alignParentRight="true"
+            android:layout_marginRight="5dp"
+            android:layout_marginLeft="5dp"
+            />
+
+        <TextView
+            android:id="@+id/detail_map_value_tv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_toLeftOf="@id/detail_map_view"
+            android:textSize="17sp"
+            android:textColor="#000000"
+            android:text="PORTS AMERICA - OAKLAND (W297)
+1599 MARITIME STREET
+OAKLAND,CA 94607
+TEL:877-900-7264,FAX:
+ATTN:
+EMAIL:"
+            />
+
+    </RelativeLayout>
+
+
+</RelativeLayout>

+ 42 - 0
ApexDrivers/app/src/main/res/layout/detail_photo_cell.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:background="#ffffff"
+    android:layout_width="match_parent"
+    android:layout_height="130dp">
+
+    <ImageButton
+        android:id="@+id/detail_photo_btn"
+        android:layout_width="120dp"
+        android:layout_height="120dp"
+        android:layout_alignParentRight="true"
+        android:layout_margin="5dp"
+        android:scaleType="fitCenter"
+        android:background="@drawable/gray_border"
+        />
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="130dp"
+        android:layout_alignParentStart="true"
+        android:layout_alignParentTop="true"
+        android:layout_toLeftOf="@id/detail_photo_btn"
+        >
+
+        <TextView
+            android:id="@+id/detail_photo_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="5dp"
+            android:layout_marginRight="5dp"
+            android:layout_centerVertical="true"
+            android:text="Container Photo"
+            android:textColor="#000000"
+            android:textSize="19sp"
+            />
+
+    </RelativeLayout>
+
+
+
+</RelativeLayout>

+ 36 - 0
ApexDrivers/app/src/main/res/layout/detail_signature_cell.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:background="#ffffff"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+    <RelativeLayout
+        android:id="@+id/detail_signature_head"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        >
+
+        <TextView
+            android:id="@+id/detail_signature_title_tv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dp"
+            android:textSize="19sp"
+            android:textColor="#000000"
+            android:text="Signature"
+            />
+
+    </RelativeLayout>
+
+    <ImageView
+        android:id="@+id/detail_signature_image_view"
+        android:layout_width="match_parent"
+        android:layout_height="130dp"
+        android:layout_below="@id/detail_signature_head"
+        android:layout_marginBottom="5dp"
+        android:layout_marginRight="5dp"
+        android:layout_marginLeft="5dp"
+        android:scaleType="centerInside"
+        />
+
+</RelativeLayout>