Просмотр исходного кода

1.修改Android Apex Drivers Container Photo显示多图。

Pen Li 7 лет назад
Родитель
Сommit
b059844f0e
57 измененных файлов с 1545 добавлено и 63 удалено
  1. 1 1
      ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/ImageUtil.java
  2. 21 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/ApexDriverApplication.java
  3. 15 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailActivity.java
  4. 53 2
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailAdapter.java
  5. 9 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailSectionModel.java
  6. 5 2
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailBaseModel.java
  7. 59 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailMultiplePhotoModel.java
  8. 16 1
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeCellLayout.java
  9. 62 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeFragment.java
  10. 31 4
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeHeaderView.java
  11. 67 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeMoreActivity.java
  12. 2 1
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/login/LoginFragment.java
  13. 11 12
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/message/MessageActivity.java
  14. 9 2
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/network/Network.java
  15. 208 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoCell.java
  16. 6 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoCellDelegate.java
  17. 32 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoHorizontalInterval.java
  18. 118 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoItemCell.java
  19. 106 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoItemModel.java
  20. 68 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoModel.java
  21. 7 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoModelDelegate.java
  22. 229 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoRow.java
  23. 32 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoVerticalInterval.java
  24. 87 7
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateActivity.java
  25. 59 1
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateAdapter.java
  26. 5 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateSectionModel.java
  27. 2 1
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/model/UpdateBaseModel.java
  28. 1 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/model/UpdateDateModel.java
  29. 68 0
      ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/model/UpdateMultPhotoModel.java
  30. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/btn_add_photo.png
  31. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/btn_photo_assign.png
  32. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/btn_photo_retake.png
  33. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/new_flag.png
  34. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/btn_add_photo.png
  35. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/btn_photo_assign.png
  36. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/btn_photo_retake.png
  37. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/new_flag.png
  38. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/btn_add_photo.png
  39. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/btn_photo_assign.png
  40. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/btn_photo_retake.png
  41. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/new_flag.png
  42. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/btn_add_photo.png
  43. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/btn_photo_assign.png
  44. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/btn_photo_retake.png
  45. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/new_flag.png
  46. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/btn_add_photo.png
  47. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/btn_photo_assign.png
  48. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/btn_photo_retake.png
  49. BIN
      ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/new_flag.png
  50. 68 21
      ApexDrivers/apexdriverslib/src/main/res/layout/home_order_cell.xml
  51. 45 0
      ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_cell.xml
  52. 7 0
      ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_horizontal_interval.xml
  53. 16 0
      ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_item_cell.xml
  54. 9 0
      ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_row.xml
  55. 7 0
      ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_vertical_interval.xml
  56. 2 4
      ApexDrivers/apexdriverslib/src/main/res/values-zh/strings.xml
  57. 2 4
      ApexDrivers/apexdriverslib/src/main/res/values/strings.xml

+ 1 - 1
ApexDrivers/RAUtilsLibrary/src/main/java/com/usai/redant/rautils/utils/ImageUtil.java

@@ -179,7 +179,7 @@ public class ImageUtil {
 
         String scheme = uri.getScheme();
         if (scheme == null) {
-            File file = new File(uri);
+            File file = new File(uri.toString());
             return loadImageFromFile(context,file);
         }
 

+ 21 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/ApexDriverApplication.java

@@ -661,6 +661,27 @@ public class ApexDriverApplication extends Application {
 
                 if (report_location != 0) {
 
+                    boolean tracing = aps.optBoolean("tracing");
+                    if (tracing) {
+
+                        if (backgroundReportType == BackgroundReportTypeAllow) {
+
+                            Location location = getCurrentLocation();
+                            String latlon = "-999,-999";
+                            if (location != null) {
+                                latlon = location.getLatitude() + "," + location.getLongitude();
+                            }
+                            reportLocationForOrder(latlon,orderID);
+
+                        } else {
+
+                            String reason = "Driver " + user +" rejected to report location";
+                            rejectReportLocation(reason,orderID);
+                        }
+
+                        return;
+                    }
+
                     reportLocationForOrder(orderID);
 
                 } else {

+ 15 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailActivity.java

@@ -72,6 +72,9 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
     private final static  String SaveOrderStatusKey = "DetailSaveOrderStatus";
     private final static  String SaveOrderType2Key = "DetailSaveOrderType2";
     private final static  String SaveStatusNo2Key = "DetailSaveStatusNo";
+    private final static  String SavedLoadKey = "DetailSaveLoad";
+
+    public final static String CheckDetailNotification = "com.usai.redant.apexdriver.CheckDetailNotification";
 
     public static Intent build(Context context, String orderID,int status,String type2,String statusNo) {
 
@@ -109,6 +112,7 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
 
     private DetailHandler mHandler;
     private TextView mEmptyView;
+    private boolean mLoad = false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -184,6 +188,7 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
             mOrderType2 = savedInstanceState.getString(SaveOrderType2Key);
             mOrderStatus = savedInstanceState.getInt(SaveOrderStatusKey);
             mStatusNo = savedInstanceState.getString(SaveStatusNo2Key);
+            mLoad = savedInstanceState.getBoolean(SavedLoadKey);
 
         } else {
             loadData();
@@ -219,6 +224,8 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
             outState.putString(SaveStatusNo2Key,mStatusNo);
         }
 
+        outState.putBoolean(SavedLoadKey,mLoad);
+
         sendLifeCircleBroadCast(0);
     }
 
@@ -536,6 +543,14 @@ public class DetailActivity extends BasicActivity implements DetailAdapter.Detai
                             int restul = json.getInt("result");
                             if (restul == RESULT_TRUE) {
 
+                                if (!activity.mLoad) {
+                                    activity.mLoad = true;
+
+                                    Intent intent = new Intent(CheckDetailNotification);
+                                    intent.putExtra("order_id",activity.mOrderID);
+                                    activity.sendBroadcast(intent);
+                                }
+
                                 activity.handleJson(json);
 
                             } else {

+ 53 - 2
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailAdapter.java

@@ -23,18 +23,22 @@ 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.DetailMultiplePhotoModel;
 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.photoCell.PhotoCell;
+import com.usai.redant.apexdrivers.photoCell.PhotoCellDelegate;
+import com.usai.redant.apexdrivers.photoCell.PhotoItemModel;
 import com.usai.redant.apexdrivers.update.PhotoPreviewActivity;
+import com.usai.redant.rautils.utils.ImageUtil;
 import com.usai.redant.rautils.utils.RAUtil;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 
-import static android.text.util.Linkify.PHONE_NUMBERS;
-
+//import static android.text.util.Linkify.PHONE_NUMBERS;
 //import com.google.android.gms.maps.GoogleMap;
 //import com.google.android.gms.maps.OnMapReadyCallback;
 
@@ -257,6 +261,24 @@ public class DetailAdapter extends BaseExpandableListAdapter {
                 DetailSignatureModel mapModel = (DetailSignatureModel)model;
                 holder.bindModel(mapModel);
             }
+            break;
+            case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeMultiplePhoto: {
+
+                MultPhotoHolder holder;
+                PhotoCell cell = (PhotoCell)convertView;
+                if (cell == null) {
+                    cell = PhotoCell.photoCell(mCtx);
+                    holder = new MultPhotoHolder(cell);
+                } else {
+                    holder = (MultPhotoHolder)cell.getTag();
+                }
+                convertView = cell;
+
+                DetailMultiplePhotoModel photoModel = (DetailMultiplePhotoModel)model;
+                holder.setModel(photoModel);
+
+            }
+            break;
 
             default:
                 break;
@@ -823,6 +845,35 @@ public class DetailAdapter extends BaseExpandableListAdapter {
         }
     }
 
+    private class MultPhotoHolder implements PhotoCellDelegate {
+
+        WeakReference<PhotoCell>  weakCell;
+        MultPhotoHolder(PhotoCell view) {
+            view.setTag(this);
+            weakCell = new WeakReference<>(view);
+            view.delegate = this;
+        }
+
+        void setModel(DetailMultiplePhotoModel model) {
+            if (weakCell != null) {
+                if (model != null) {
+                    weakCell.get().setModel(model.getMapModel());
+                } else {
+                    weakCell.get().setModel(null);
+                }
+            }
+        }
+
+        @Override
+        public void clickPhotoItem(PhotoItemModel model) {
+            if (model != null) {
+                String url = model.url;
+                String path = ImageUtil.imageCachePathForURl(mCtx,url);
+                clickImage(path);
+            }
+        }
+    }
+
     public interface DetailActionDelegate {
 
         void performAction(View view,DetailSubActionModel actionModel);

+ 9 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailSectionModel.java

@@ -7,6 +7,7 @@ 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.DetailMultiplePhotoModel;
 import com.usai.redant.apexdrivers.detail.model.DetailPhotoModel;
 import com.usai.redant.apexdrivers.detail.model.DetailSignatureModel;
 import com.usai.redant.apexdrivers.detail.model.DetailSingleLineModel;
@@ -140,6 +141,14 @@ public class DetailSectionModel {
                             this.values.add(model);
                         }
                         break;
+                        case DetailBaseModel.OrderDetailValueType.OderDetailValueTypeMultiplePhoto: {
+
+                            DetailMultiplePhotoModel model = new DetailMultiplePhotoModel(mCtx);
+                            model.setValuesForKeysWithJSON(value);
+
+                            this.values.add(model);
+                        }
+                        break;
                         default:
                             break;
                     }

+ 5 - 2
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailBaseModel.java

@@ -2,7 +2,9 @@ package com.usai.redant.apexdrivers.detail.model;
 
 import android.content.Context;
 
-public class DetailBaseModel {
+import com.usai.redant.apexdrivers.base.BasicObject;
+
+public class DetailBaseModel extends BasicObject {
 
     public static class OrderDetailValueType {
         public static final int OderDetailValueTypeSingleLine = 0;
@@ -12,10 +14,11 @@ public class DetailBaseModel {
         public static final int OderDetailValueTypeMap = 4;
         public static final int OderDetailValueTypePhoto = 5;
         public static final int OderDetailValueTypeSignature = 6;
+        public static final int OderDetailValueTypeMultiplePhoto = 7;
     }
 
     public static int detailValueTypeCount() {
-        return 7;
+        return 8;
     }
 
     public interface OrderDetailModelDelegate {

+ 59 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/model/DetailMultiplePhotoModel.java

@@ -0,0 +1,59 @@
+package com.usai.redant.apexdrivers.detail.model;
+
+import android.content.Context;
+
+import com.usai.redant.apexdrivers.photoCell.PhotoItemModel;
+import com.usai.redant.apexdrivers.photoCell.PhotoModel;
+
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+
+public class DetailMultiplePhotoModel extends DetailBaseModel {
+
+    public DetailMultiplePhotoModel(Context context) {
+        super(context);
+    }
+
+    private PhotoModel mapModel = new PhotoModel();
+
+    @Override
+    public void setValuesForKeysWithJSON(JSONObject json) {
+        super.setValuesForKeysWithJSON(json);
+        mapModel.setValuesForKeysWithJSON(json);
+    }
+
+    public String title;
+
+    public void setTitle(String title) {
+        mapModel.title = title;
+    }
+
+    public void setType(int type) {
+        super.type = type;
+        mapModel.type = type;
+    }
+
+
+    public void setPhotos(Object photos) {
+        mapModel.setPhotos(photos);
+    }
+
+
+    public String getTitle() {
+        return mapModel.title;
+    }
+
+    public int getType() {
+        return mapModel.type;
+    }
+
+    public ArrayList<PhotoItemModel> getPhotos() {
+        return mapModel.photoArray;
+    }
+
+    public PhotoModel getMapModel() {
+        return mapModel;
+    }
+
+}

+ 16 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeCellLayout.java

@@ -13,11 +13,13 @@ import com.usai.redant.apexdrivers.R;
 
 import java.lang.ref.WeakReference;
 
+import static com.usai.redant.apexdrivers.home.HomeOrderModel.OrderStatusNew;
+
 public class HomeCellLayout extends RelativeLayout implements HomeOrderModel.OrderModelDelegate {
 
     TextView titleTv, orderNoTv, containerNoTv, dateTv,orderType2Tv, index_tv;
     ImageView statusView, markView;
-    RelativeLayout contentContainer;
+    RelativeLayout contentContainer,newFlagView;
 
     WeakReference<HomeOrderModel> weakModel;
     private boolean initialed = false;
@@ -61,6 +63,8 @@ public class HomeCellLayout extends RelativeLayout implements HomeOrderModel.Ord
         this.isMore = isMore;
         if (isMore) {
             index_tv = findViewById(R.id.index_tv);
+        } else {
+            newFlagView = findViewById(R.id.order_new_flag_view);
         }
     }
 
@@ -128,6 +132,17 @@ public class HomeCellLayout extends RelativeLayout implements HomeOrderModel.Ord
             orderType2Tv.setTextColor(Color.parseColor("#000000"));
         }
 
+        if (!isMore) {
+            if (newFlagView != null && model != null) {
+                if (model.status == OrderStatusNew) {
+                    newFlagView.setVisibility(VISIBLE);
+                } else {
+                    newFlagView.setVisibility(GONE);
+                }
+            }
+
+        }
+
     }
 
     @Override

+ 62 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeFragment.java

@@ -66,6 +66,8 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
 
     private HomeHeaderView mHeaderView;
 
+    private int mMessageCount = 0;
+
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -221,6 +223,8 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
     private void registBroadcastReceiver() {
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(HomeReloadBroadcastAction);
+        intentFilter.addAction(DetailActivity.CheckDetailNotification);
+
         mReceiver = new HomeBroadCastReceiver();
         mCtx.registerReceiver(mReceiver,intentFilter);
     }
@@ -530,6 +534,7 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
                         int processing_count = json.optInt("processing_count");
                         int finish_count = json.optInt("finish_count");
                         int message_count = json.optInt("message_count");
+                        fragment.mMessageCount = message_count;
 
                         if (fragment.mHeaderView != null) {
                             fragment.mHeaderView.setAvailable(driver_available);
@@ -750,6 +755,7 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
                 cell = convertView;
                 holder = (OrderCellHolder)convertView.getTag();
             }
+            ((HomeCellLayout) cell).setIsMore(false);
 
             HomeSectionModel sectionModel = mSectionArray.get(groupPosition);
             HomeOrderModel orderModel = sectionModel.orderModelForIndex(childPosition);
@@ -871,6 +877,57 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
 
     }
 
+    private void checOrder(String orderId) {
+
+        if (mSectionArray == null || mSectionArray.size() == 0) {
+            return;
+        }
+
+        HomeOrderModel model = null;
+        for (HomeSectionModel sectionModel : mSectionArray) {
+            int count = sectionModel.orderCount();
+            if (count > 0) {
+                int index = sectionModel.orderModelIndexForID(orderId);
+                model = sectionModel.orderModelForIndex(index);
+                if (model != null && model.orderID.equals(orderId)) {
+
+                    if (model.backendFlag) {
+
+                        final HomeOrderModel fmodel = model;
+                        final HomeSectionModel fsection = sectionModel;
+
+                        ((Activity)mCtx).runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+
+                                // 刷新Order Cell
+                                fmodel.backendFlag = false;
+
+                                // 刷新Section
+                                int backendCount = fsection.backendFlagCount;
+                                if (backendCount > 0) {
+                                    backendCount--;
+                                }
+                                fsection.setBackendFlagCount(backendCount);
+
+                                // 刷新Message
+                                int message_count = mMessageCount;
+                                if (message_count > 0) {
+                                    message_count--;
+                                    mMessageCount = message_count;
+                                }
+                                mHeaderView.setExistNewMessage(message_count > 0);
+
+                            }
+                        });
+                    }
+
+                } else {
+                    model = null;
+                }
+            }
+        }
+    }
 
     /**
      * Receiver
@@ -883,6 +940,11 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
 
             if (intent.getAction() == HomeReloadBroadcastAction) {
                 loadData();
+            } else if (intent.getAction() == DetailActivity.CheckDetailNotification) {
+                String orderId = intent.getStringExtra("order_id");
+                if (orderId != null) {
+                    checOrder(orderId);
+                }
             }
 
         }

+ 31 - 4
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeHeaderView.java

@@ -162,18 +162,30 @@ public class HomeHeaderView extends RelativeLayout {
     public void setNewCount(int newCount) {
         this.newCount = newCount;
 
+        if (newCountTv == null) {
+            return;
+        }
+
         newCountTv.setText(textFromCount(newCount));
     }
 
     public void setProcessingCount(int processingCount) {
         this.processingCount = processingCount;
 
+        if (processingCountTv == null) {
+            return;
+        }
+
         processingCountTv.setText(textFromCount(processingCount));
     }
 
     public void setFinishCount(int finishCount) {
         this.finishCount = finishCount;
 
+        if (finishCountTv == null) {
+            return;
+        }
+
         finishCountTv.setText(textFromCount(finishCount));
     }
 
@@ -192,15 +204,26 @@ public class HomeHeaderView extends RelativeLayout {
     public void setAvailable(boolean available) {
         this.available = available;
 
+        if (availableBtn == null || availableTv == null) {
+            return;
+        }
         if (available) {
 
-            availableBtn.setImageResource(R.drawable.action_available);
-            availableTv.setText(mCtx.getString(R.string.user_state_available));
+            if (availableBtn != null) {
+                availableBtn.setImageResource(R.drawable.action_available);
+            }
+            if (availableTv != null) {
+                availableTv.setText(mCtx.getString(R.string.user_state_available));
+            }
 
         } else {
 
-            availableBtn.setImageResource(R.drawable.action_unavailable);
-            availableTv.setText(mCtx.getString(R.string.user_state_unavailable));
+            if (availableBtn != null) {
+                availableBtn.setImageResource(R.drawable.action_unavailable);
+            }
+            if (availableTv != null) {
+                availableTv.setText(mCtx.getString(R.string.user_state_unavailable));
+            }
         }
     }
 
@@ -211,6 +234,10 @@ public class HomeHeaderView extends RelativeLayout {
     public void setExistNewMessage(boolean existNewMessage) {
         this.existNewMessage = existNewMessage;
 
+        if (messageFlagView == null || messageBtn == null) {
+            return;
+        }
+
         if (existNewMessage) {
             messageBtn.setImageResource(R.drawable.action_message);
             messageFlagView.setVisibility(VISIBLE);

+ 67 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeMoreActivity.java

@@ -1,8 +1,10 @@
 package com.usai.redant.apexdrivers.home;
 
 import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.database.DataSetObserver;
 import android.graphics.Color;
 import android.os.Bundle;
@@ -85,6 +87,8 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
     private boolean reloadHome = false;
     private TextView mEmptyView;
 
+    private HomeMoreBroadCastReceiver mReceiver;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -139,6 +143,8 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
         if (mOrders.size() == 0) {
             loadData();
         }
+
+        registBroadcastReceiver();
     }
 
     @Override
@@ -202,6 +208,21 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
 
     }
 
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+        unregisterReceiver(mReceiver);
+    }
+
+    private void registBroadcastReceiver() {
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(DetailActivity.CheckDetailNotification);
+
+        mReceiver = new HomeMoreBroadCastReceiver();
+        registerReceiver(mReceiver,intentFilter);
+    }
+
     private void showFilter() {
 
 //        mFilter = com.usai.redant.apexdrivers.Network.Network.loadFakeData(this,R.raw.fake_order_filter);
@@ -667,4 +688,50 @@ public class HomeMoreActivity extends BasicActivity implements AbsListView.OnScr
             return super.isEmpty();
         }
     }
+
+    private void checOrder(String orderId) {
+
+        if (mOrders == null || mOrders.size() == 0) {
+            return;
+        }
+
+        for (HomeOrderModel model : mOrders) {
+
+            if (model != null && model.orderID.equals(orderId)) {
+
+                if (model.backendFlag) {
+
+                    final HomeOrderModel fmodel = model;
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+
+                            // 刷新Order Cell
+                            fmodel.backendFlag = false;
+                        }
+                    });
+                }
+
+            }
+        }
+    }
+
+    /**
+     * Receiver
+     * */
+
+    private class HomeMoreBroadCastReceiver extends BroadcastReceiver {
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+
+           if (intent.getAction() == DetailActivity.CheckDetailNotification) {
+                String orderId = intent.getStringExtra("order_id");
+               if (orderId != null) {
+                   checOrder(orderId);
+               }
+            }
+
+        }
+    }
 }

+ 2 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/login/LoginFragment.java

@@ -342,7 +342,8 @@ public class LoginFragment extends Fragment/* implements OnClickListener */
 				if (result == Network.RESULT_TRUE) {
 
 					String firstName = json.optString("firstName");
-					ApexDriverApplication.sharedApplication().login(m_sUser.toLowerCase(),m_sPassword,firstName);
+					String driver = json.optString("driver");
+					ApexDriverApplication.sharedApplication().login(driver,m_sPassword,firstName);
 
 					if(mCallBack!=null)
 						mCallBack.onLogin();

+ 11 - 12
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/message/MessageActivity.java

@@ -69,7 +69,7 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
     private ArrayList<MessageModel> messages = new ArrayList<>();
     private int offset = 0;
     private static final int limit = 20;
-    private boolean mUnread = false;
+    private boolean mUnread = true;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -102,7 +102,7 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
             if (!TextUtils.isEmpty(messagesStr)) {
                 try {
                     JSONArray array = new JSONArray(messagesStr);
-                    handleJsonArray(array);
+                    handleJsonArray(LoadActionTypeInitial,array);
 
                 } catch (JSONException e) {
                     e.printStackTrace();
@@ -339,16 +339,12 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
                     int result = json.optInt("result");
                     if (result == com.usai.redant.rautils.utils.Network.RESULT_TRUE) {
 
-                        if (type != LoadActionTypeMore) {
-                            self.messages.clear();
-                        }
-
                         JSONArray messages = json.optJSONArray("messages");
 
                         long notificationId = json.optLong("notificationId");
                         ApexDriverApplication.sharedApplication().setNotificationID(notificationId);
 
-                        handleJsonArray(messages);
+                        handleJsonArray(type,messages);
 
                     } else {
 
@@ -396,9 +392,12 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
         return null;
     }
 
-    private void handleJsonArray(JSONArray messages) {
-        if (messages == null) {
-            return;
+    private void handleJsonArray(int type, JSONArray messages) {
+
+        ArrayList arrayList = new ArrayList(self.messages);
+
+        if (type != LoadActionTypeMore) {
+            arrayList.clear();
         }
 
         if (messages != null) {
@@ -410,12 +409,12 @@ public class MessageActivity extends BasicActivity implements AbsListView.OnScro
                     MessageModel model = new MessageModel();
                     model.setValuesForKeysWithJSON(msgItem);
 
-                    self.messages.add(model);
+                    arrayList.add(model);
                 }
             }
-
         }
 
+        self.messages = arrayList;
         mAdapter.notifyDataSetChanged();
     }
 

+ 9 - 2
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/network/Network.java

@@ -16,13 +16,14 @@ import org.json.JSONObject;
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.Locale;
 
 import static java.lang.Thread.sleep;
 
 public class Network extends com.usai.redant.rautils.utils.Network {
 
-//    private static final String URL_HOST = "http://192.168.0.124:8080/t";
-    private static final String URL_HOST = "https://ra.apexshipping.com/t";
+    private static final String URL_HOST = "http://192.168.0.124:8080/t";
+//    private static final String URL_HOST = "https://ra.apexshipping.com/t";
 
 
     public static final String URL_LOGIN = URL_HOST  + "/mobile/login.mo/";
@@ -65,6 +66,12 @@ public class Network extends com.usai.redant.rautils.utils.Network {
             }
         }
 
+        Locale curLocale = ApexDriverApplication.sharedApplication().getResources().getConfiguration().locale;
+        String languageCode = curLocale.getLanguage();
+        if (languageCode != null) {
+            params.putString("language",languageCode);
+        }
+
         params.putString("platform","android");
     }
 

+ 208 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoCell.java

@@ -0,0 +1,208 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.usai.redant.apexdrivers.R;
+import com.usai.redant.rautils.utils.RAUtil;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+
+public class PhotoCell extends RelativeLayout implements PhotoModelDelegate,PhotoCellDelegate {
+
+    public static PhotoCell photoCell(Context context) {
+        if (context == null) {
+            return null;
+        }
+        PhotoCell cell = (PhotoCell) LayoutInflater.from(context).inflate(R.layout.multiple_photo_cell,null);
+        return cell;
+    }
+
+    private Context mCtx;
+    private TextView mTitleTv, mRequiredTv;
+    private LinearLayout mCollectionView;
+
+    public PhotoCell(Context context) {
+        super(context);
+
+        mCtx = context;
+    }
+
+    public PhotoCell(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+
+        mCtx = context;
+    }
+
+    public PhotoCell(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        mCtx = context;
+    }
+
+    private boolean initialized = false;
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        init();
+    }
+
+    private void init() {
+        initialized = true;
+
+        mTitleTv = findViewById(R.id.mutiple_photo_title_tv);
+        mRequiredTv = findViewById(R.id.mutiple_photo_required_tv);
+        mCollectionView = findViewById(R.id.mutiple_photo_collection_view);
+    }
+
+    public void clear() {
+        if (mCollectionView != null) {
+            mCollectionView.removeAllViews();
+        }
+    }
+
+    ArrayList<PhotoRow> mRowArr = new ArrayList<>();
+    private int mColCount = 4;
+    private float mInterval = 5;
+
+    private PhotoRow getRow(int row) {
+
+        PhotoRow cell;
+        if (row >= mRowArr.size()) {
+            cell = PhotoRow.photoRow(mCtx, mInterval, mColCount);
+            cell.delegate = this;
+        } else {
+            cell = mRowArr.get(row);
+        }
+
+        cell.clear();
+        return cell;
+    }
+
+    private void addRow(PhotoRow row) {
+        if (row == null) {
+            return;
+        }
+        if (!mRowArr.contains(row)) {
+            mRowArr.add(row);
+        }
+
+        if (initialized) {
+            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
+            mCollectionView.addView(row,layoutParams);
+
+            addInterval();
+        }
+    }
+
+    private void addInterval() {
+        PhotoVerticalInterval interval = PhotoVerticalInterval.interval(mCtx);
+        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, RAUtil.dp2px(mCtx,mInterval));
+        mCollectionView.addView(interval,layoutParams);
+    }
+
+    private WeakReference<PhotoModel> weakModel;
+    public void setModel(PhotoModel model) {
+        if (weakModel != null) {
+            weakModel.get().setDelegate(null);
+        }
+
+        if (model == null) {
+            weakModel = null;
+        } else {
+            weakModel = new WeakReference<>(model);
+            model.setDelegate(this);
+        }
+
+        refreshUI();
+    }
+
+    @Override
+    public void refreshUI() {
+
+        clear();
+
+        if (weakModel == null) {
+            return;
+        }
+
+        String title = weakModel.get().title;
+        boolean required = weakModel.get().required;
+
+        mTitleTv.setText(title);
+        mRequiredTv.setVisibility(required ? VISIBLE : GONE);
+
+        ArrayList<PhotoItemModel> arrayList = weakModel.get().photoArray;
+        if (arrayList == null) {
+            return;
+        }
+        int count = arrayList.size();
+
+
+        ArrayList<ArrayList<PhotoItemModel>> rows = new ArrayList<>();
+        ArrayList<PhotoItemModel> rowModels = new ArrayList<>();
+        for (int i = 0; i < count; i++) {
+
+            PhotoItemModel model = arrayList.get(i);
+
+            int col = i % mColCount;
+            int row = i / mColCount;
+
+            if (rowModels.size() < mColCount) {
+
+                rowModels.add(model);
+
+                if (i == count - 1) {
+                    rows.add(rowModels);
+                }
+
+            } else if (rowModels.size() == mColCount) {
+
+                rows.add(rowModels);
+
+                rowModels = new ArrayList<>();
+                rowModels.add(model);
+
+                if (i == count - 1) {
+                    rows.add(rowModels);
+                }
+            }
+        }
+
+        for (int i = 0; i < rows.size(); i++) {
+            rowModels = rows.get(i);
+            PhotoRow cell = getRow(i);
+            addRow(cell);
+            cell.setModels(rowModels);
+
+        }
+    }
+
+    @Override
+    public void unbind() {
+        weakModel = null;
+//        refreshUI();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    public PhotoCellDelegate delegate;
+    @Override
+    public void clickPhotoItem(PhotoItemModel model) {
+        if (delegate != null) {
+            delegate.clickPhotoItem(model);
+        }
+    }
+}

+ 6 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoCellDelegate.java

@@ -0,0 +1,6 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+public interface PhotoCellDelegate {
+
+    void clickPhotoItem(PhotoItemModel model);
+}

+ 32 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoHorizontalInterval.java

@@ -0,0 +1,32 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.RelativeLayout;
+
+import com.usai.redant.apexdrivers.R;
+
+public class PhotoHorizontalInterval extends RelativeLayout {
+
+    public static PhotoHorizontalInterval interval(Context context) {
+        if (context == null) {
+            return null;
+        }
+
+        PhotoHorizontalInterval interval = (PhotoHorizontalInterval) LayoutInflater.from(context).inflate(R.layout.multiple_photo_horizontal_interval,null);
+        return interval;
+    }
+
+    public PhotoHorizontalInterval(Context context) {
+        super(context);
+    }
+
+    public PhotoHorizontalInterval(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public PhotoHorizontalInterval(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+}

+ 118 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoItemCell.java

@@ -0,0 +1,118 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+
+import com.usai.redant.apexdrivers.R;
+
+import java.lang.ref.WeakReference;
+
+public class PhotoItemCell extends RelativeLayout implements PhotoModelDelegate {
+
+    public static PhotoItemCell itemCell(Context context) {
+        if (context == null) {
+            return null;
+        }
+
+        PhotoItemCell cell = (PhotoItemCell) LayoutInflater.from(context).inflate(R.layout.multiple_photo_item_cell,null);
+        return cell;
+    }
+
+    public PhotoCellDelegate delegate;
+
+    private Context mCtx;
+    private ImageView mPhotoView;
+
+    public PhotoItemCell(Context context) {
+        super(context);
+
+        mCtx = context;
+    }
+
+    public PhotoItemCell(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        mCtx = context;
+    }
+
+    public PhotoItemCell(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        mCtx = context;
+    }
+
+    private boolean initialized = false;
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        init();
+    }
+
+    private void init() {
+        initialized = true;
+        mPhotoView = findViewById(R.id.photo_view);
+
+        mPhotoView.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+                if (delegate != null && weakModel != null) {
+                    delegate.clickPhotoItem(weakModel.get());
+                }
+            }
+        });
+    }
+
+    private WeakReference<PhotoItemModel> weakModel;
+
+    public void setModel(PhotoItemModel model) {
+        if (weakModel != null) {
+            weakModel.get().setDelegate(null);
+        }
+
+        if (model == null) {
+            weakModel = null;
+        } else {
+            weakModel = new WeakReference<>(model);
+
+            model.setDelegate(this);
+        }
+
+        refreshUI();
+    }
+
+    @Override
+    public void refreshUI() {
+
+        if (initialized) {
+            if (weakModel != null) {
+                mPhotoView.setImageBitmap(weakModel.get().getPhoto());
+            } else {
+                mPhotoView.setImageBitmap(null);
+            }
+        }
+    }
+
+    @Override
+    public void unbind() {
+
+        weakModel = null;
+        refreshUI();
+    }
+
+    public void clear() {
+        unbind();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+}

+ 106 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoItemModel.java

@@ -0,0 +1,106 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import com.usai.redant.apexdrivers.ApexDriverApplication;
+import com.usai.redant.apexdrivers.base.BasicObject;
+import com.usai.redant.apexdrivers.utils.OperationQueue;
+import com.usai.redant.rautils.utils.ImageUtil;
+
+import java.lang.ref.WeakReference;
+import java.net.URI;
+
+public class PhotoItemModel extends BasicObject {
+
+    public String url;
+    public String placeHolder;
+    private Bitmap photo;
+
+    private WeakReference<PhotoModelDelegate> mDelegate;
+
+    public void setUrl(final String url) {
+        this.url = url;
+
+        if (url == null) {
+            setPhoto(null);
+            return;
+        }
+
+        ApexDriverApplication.sharedApplication().getNetworkQueue().addOperationTask(new OperationQueue.OperationBackgroundCallBack() {
+            @Override
+            public Object operationDoInBackground() {
+
+                try {
+
+                    URI uri = new URI(url);
+
+                    Context context = ApexDriverApplication.sharedApplication().getApplicationContext();
+                    ImageUtil.loadImageFromURL(context,uri,0, 0);
+
+                    String filename = ImageUtil.imageCachePath(context,uri);
+                    Bitmap bitmap = ImageUtil.adjustPhotoOrientation(filename);
+
+                    return bitmap;
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+                return null;
+            }
+        }, new OperationQueue.OperationCompletionCallBack() {
+
+            @Override
+            public void operationCompletion(Object object) {
+
+                if (object != null) {
+                    Bitmap bitmap = (Bitmap)object;
+                    setPhoto(bitmap);
+                }
+
+            }
+        },null);
+
+    }
+
+    public void setDelegate(PhotoModelDelegate delegate) {
+        if (mDelegate != null) {
+            mDelegate.get().unbind();
+        }
+        if (delegate != null) {
+            mDelegate = new WeakReference<>(delegate);
+            delegate.refreshUI();
+        } else {
+            mDelegate = null;
+        }
+    }
+
+    public void setPhoto(Bitmap photo) {
+        this.photo = photo;
+
+        if (mDelegate != null) {
+            mDelegate.get().refreshUI();
+        }
+    }
+
+    public Bitmap getPhoto() {
+        if (photo == null) {
+            if (placeHolder != null) {
+
+                int resourceId = ApexDriverApplication.sharedApplication().getResources().getIdentifier(placeHolder, "drawable", ApexDriverApplication.sharedApplication().getPackageName());
+                Bitmap bitmap = BitmapFactory.decodeResource(ApexDriverApplication.sharedApplication().getResources(),resourceId);
+                return bitmap;
+
+            } else {
+                return null;
+            }
+        }
+        return photo;
+    }
+
+    public boolean isEmpty() {
+        return photo == null;
+    }
+}

+ 68 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoModel.java

@@ -0,0 +1,68 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import com.usai.redant.apexdrivers.base.BasicObject;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+
+public class PhotoModel extends BasicObject {
+
+    public int   type;
+    public String key;
+    public String title;
+    public boolean required;
+    public Object photos;
+
+    public ArrayList<PhotoItemModel> photoArray;
+
+    private WeakReference<PhotoModelDelegate> mDelegate;
+
+    public void setPhotos(Object photos) {
+
+        ArrayList<PhotoItemModel> models = new ArrayList<>();
+        if (photos == null) {
+            photoArray = models;
+            return;
+        }
+
+        if (photos instanceof JSONArray) {
+
+            int size = ((JSONArray) photos).length();
+            for (int i = 0; i < size; i++) {
+                JSONObject item = ((JSONArray) photos).optJSONObject(i);
+                if (item != null) {
+                    PhotoItemModel model = new PhotoItemModel();
+                    model.setValuesForKeysWithJSON(item);
+                    models.add(model);
+                }
+            }
+        }
+        photoArray = models;
+    }
+
+    public void setDelegate(PhotoModelDelegate delegate) {
+        if (mDelegate != null) {
+            mDelegate.get().unbind();
+        }
+        if (delegate != null) {
+            mDelegate = new WeakReference<>(delegate);
+            delegate.refreshUI();
+        } else {
+            mDelegate = null;
+        }
+    }
+
+    public ArrayList<PhotoItemModel> getPhotos() {
+
+        ArrayList<PhotoItemModel> models = new ArrayList<>();
+        for (PhotoItemModel model : photoArray) {
+            if (!model.isEmpty()) {
+                models.add(model);
+            }
+        }
+        return models;
+    }
+}

+ 7 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoModelDelegate.java

@@ -0,0 +1,7 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+public interface PhotoModelDelegate {
+
+    void refreshUI();
+    void unbind();
+}

+ 229 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoRow.java

@@ -0,0 +1,229 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+
+import com.usai.redant.apexdrivers.R;
+import com.usai.redant.rautils.utils.RAUtil;
+
+import java.util.ArrayList;
+
+public class PhotoRow extends LinearLayout implements PhotoCellDelegate {
+
+    public static PhotoRow photoRow(Context context,float interval, int maxItem) {
+        if (context == null) {
+            return null;
+        }
+
+        PhotoRow row = (PhotoRow) LayoutInflater.from(context).inflate(R.layout.multiple_photo_row,null);
+        row.setInterval(interval);
+        row.setMaxItem(maxItem);
+
+        return row;
+    }
+
+    public PhotoCellDelegate delegate;
+
+    private static int getScreenWidth(Context context) {
+
+        Resources resources = context.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+//        float density = dm.density;
+        int width = dm.widthPixels;
+//        int height = dm.heightPixels;
+
+        return width;
+    }
+
+    private Context mCtx;
+    private int mMaxItem = 4;
+    private float mItemWidth, mItemHeight, mInterval = 5;
+
+    public PhotoRow(Context context) {
+        super(context);
+
+        mCtx = context;
+        setWidth(getScreenWidth(mCtx));
+    }
+
+    public PhotoRow(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+
+        mCtx = context;
+        setWidth(getScreenWidth(mCtx));
+    }
+
+    public PhotoRow(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        mCtx = context;
+        setWidth(getScreenWidth(mCtx));
+    }
+
+    private boolean initialized = false;
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        init();
+    }
+
+    private void init() {
+        initialized = true;
+    }
+
+    private int mWidth = 0;
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+
+        if (mWidth != w) {
+            setWidth(w);
+        }
+    }
+
+    public void setWidth(int width) {
+        mWidth = width;
+
+        if (mMaxItem > 0) {
+
+            int interval = RAUtil.dp2px(mCtx, getInterval() * (getMaxItem() + 1));
+            int w = RAUtil.px2dp(mCtx,mWidth - interval);
+            int itemSize = w / getMaxItem();
+            setItemWidth(itemSize);
+            setItemHeight(itemSize);
+
+            refreshUI();
+        }
+    }
+
+    public void setItemWidth(float itemWidth) {
+        mItemWidth = itemWidth;
+    }
+
+    public void setItemHeight(float itemHeight) {
+        mItemHeight = itemHeight;
+    }
+
+    public void setInterval(float interval) {
+        mInterval = interval;
+    }
+
+    public float getItemWidth() {
+        return mItemWidth;
+    }
+
+    public float getItemHeight() {
+        return mItemHeight;
+    }
+
+    public float getInterval() {
+        return mInterval;
+    }
+
+    public void setMaxItem(int maxItem) {
+        mMaxItem = maxItem;
+    }
+
+    public int getMaxItem() {
+        return mMaxItem;
+    }
+
+
+    private ArrayList<PhotoItemModel> models = new ArrayList<>();
+    private ArrayList<PhotoItemCell> cellArrayList = new ArrayList<>();
+
+    private PhotoItemCell getCell(int index) {
+
+        PhotoItemCell cell;
+        if (index >= cellArrayList.size()) {
+            cell = PhotoItemCell.itemCell(mCtx);
+            cell.delegate = this;
+        } else {
+            cell = cellArrayList.get(index);
+        }
+
+        cell.clear();
+        return cell;
+    }
+
+    public void setModels(ArrayList<PhotoItemModel> arrayList) {
+        if (arrayList == null || arrayList.size() == 0) {
+            return;
+        }
+        clear();
+        models.addAll(arrayList);
+        for (PhotoItemModel model : models) {
+            model.setDelegate(null);
+        }
+
+        refreshUI();
+    }
+
+    private void addInterval() {
+
+        PhotoHorizontalInterval interval = PhotoHorizontalInterval.interval(mCtx);
+        LinearLayout.LayoutParams layoutParams = new LayoutParams(RAUtil.dp2px(mCtx,getInterval()), LayoutParams.MATCH_PARENT);
+        addView(interval,layoutParams);
+    }
+
+    private void addCell(int index, PhotoItemModel model) {
+
+        addInterval();
+
+        PhotoItemCell cell = getCell(index);
+
+        if (!cellArrayList.contains(cell)) {
+            cellArrayList.add(cell);
+        }
+
+        LinearLayout.LayoutParams layoutParams = new LayoutParams(RAUtil.dp2px(mCtx,getItemWidth()), RAUtil.dp2px(mCtx,getItemHeight()));
+        addView(cell,layoutParams);
+
+        cell.setModel(model);
+    }
+
+
+    public void refreshUI() {
+
+        removeAllViews();
+        if (initialized) {
+            for (int i = 0; i < models.size(); i++) {
+                PhotoItemModel model = models.get(i);
+                addCell(i, model);
+            }
+        }
+    }
+
+    public void clear() {
+
+        for (PhotoItemModel model : models) {
+            model.setDelegate(null);
+        }
+        models.clear();
+
+        for (PhotoItemCell cell : cellArrayList) {
+            cell.clear();
+        }
+
+        refreshUI();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
+    @Override
+    public void clickPhotoItem(PhotoItemModel model) {
+        if (delegate != null) {
+            delegate.clickPhotoItem(model);
+        }
+    }
+}

+ 32 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/photoCell/PhotoVerticalInterval.java

@@ -0,0 +1,32 @@
+package com.usai.redant.apexdrivers.photoCell;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.RelativeLayout;
+
+import com.usai.redant.apexdrivers.R;
+
+public class PhotoVerticalInterval extends RelativeLayout {
+
+    public static PhotoVerticalInterval interval(Context context) {
+        if (context == null) {
+            return null;
+        }
+
+        PhotoVerticalInterval interval = (PhotoVerticalInterval) LayoutInflater.from(context).inflate(R.layout.multiple_photo_vertical_interval,null);
+        return interval;
+    }
+
+    public PhotoVerticalInterval(Context context) {
+        super(context);
+    }
+
+    public PhotoVerticalInterval(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public PhotoVerticalInterval(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+}

+ 87 - 7
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateActivity.java

@@ -41,12 +41,14 @@ import com.usai.redant.apexdrivers.codescanner.CaptureActivity;
 import com.usai.redant.apexdrivers.filter.OrderFilterActivity;
 import com.usai.redant.apexdrivers.home.HomeFragment;
 import com.usai.redant.apexdrivers.network.Network;
+import com.usai.redant.apexdrivers.photoCell.PhotoItemModel;
 import com.usai.redant.apexdrivers.signature.SignatureActivity;
 import com.usai.redant.apexdrivers.update.model.UpdateBaseModel;
 import com.usai.redant.apexdrivers.update.model.UpdateDateModel;
 import com.usai.redant.apexdrivers.update.model.UpdateImageBaseModel;
 import com.usai.redant.apexdrivers.update.model.UpdateInputModel;
 import com.usai.redant.apexdrivers.update.model.UpdateMultInputModel;
+import com.usai.redant.apexdrivers.update.model.UpdateMultPhotoModel;
 import com.usai.redant.apexdrivers.update.model.UpdatePhotoModel;
 import com.usai.redant.apexdrivers.update.model.UpdateSignatureModel;
 import com.usai.redant.rautils.receiver.RABroadcast;
@@ -95,6 +97,10 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
     private final static int REQUEST_PREVIEW_CODE = 2;
     private final static int REQUEST_SIGNATURE_CODE = 3;
 
+    private final static int Photo_Type_None = -1;
+    private final static int Photo_Type_Normal = 0;
+    private final static int Photo_Type_Multiple = 1;
+
 
     public static Intent build(Context ctx, String orderID, int actionID,String actionTitle, String orderType2) {
 
@@ -127,8 +133,10 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
     private ExpandableListView mListView;
     private SwipeRefreshLayout mRefresh;
 
+    private int mPhotoType = Photo_Type_None; // 0: UpdatePhotoModel 1: PhotoItemModel
     private UpdateInputModel mInputModel;
     private UpdatePhotoModel mPhotoModel;
+    private PhotoItemModel mPhotoItemModel;
     private UpdateSignatureModel mSignatueModel;
 
     private File photoFile = null;
@@ -306,8 +314,14 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
 
                         ImageUtil.updateGallery(mCtx,scaleFile.getAbsolutePath());
 
-                        if (mPhotoModel != null) {
-                            mPhotoModel.setPhotoPath(scaleFile.getAbsolutePath());
+                        if (mPhotoType == Photo_Type_Normal) {
+                            if (mPhotoModel != null) {
+                                mPhotoModel.setPhotoPath(scaleFile.getAbsolutePath());
+                            }
+                        } else if (mPhotoType == Photo_Type_Multiple) {
+                            if (mPhotoItemModel != null) {
+                                mPhotoItemModel.setUrl(scaleFile.getAbsolutePath());
+                            }
                         }
 
                         mPhotoArray.add(scaleFile);
@@ -320,6 +334,8 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
                         photoFile.delete(); // 没有拍照直接返回,需要将文件删除
                     }
                 }
+                mPhotoType = Photo_Type_None;
+                mPhotoItemModel = null;
                 mPhotoModel = null;
                 photoFile = null;
             }
@@ -329,10 +345,16 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
 
                     boolean delete = data.getBooleanExtra(PhotoPreviewActivity.PreviewActionDeleteKey,false);
                     if (delete) {
-                        mPhotoModel.setPhotoPath(null);
+                        if (mPhotoType == Photo_Type_Normal) {
+                            mPhotoModel.setPhotoPath(null);
+                        } else if (mPhotoType == Photo_Type_Multiple) {
+                            mPhotoItemModel.setUrl(null);
+                        }
                     }
                 }
+                mPhotoType = Photo_Type_None;
                 mPhotoModel = null;
+                mPhotoItemModel = null;
             }
             break;
             case REQUEST_SIGNATURE_CODE: {
@@ -597,6 +619,8 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
             return;
         }
 
+        params.putInt("photoCount",photoArr.size());
+
         showProgressDialog();
 
         final Bundle finalParams = params;
@@ -617,13 +641,20 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
                                 boolean requiredLocation = json.optBoolean("requiredLocation");
                                 ApexDriverApplication.sharedApplication().setRequiredLocation(requiredLocation);
 
+//                                if (photoArr.size() > 0) {
+//                                    syncUploadPhotos(photoArr,json);
+//                                } else {
+//                                    dismissProgressDialog();
+//                                    goHome();
+//                                }
+
                                 if (photoArr.size() > 0) {
-                                    syncUploadPhotos(photoArr,json);
-                                } else {
-                                    dismissProgressDialog();
-                                    goHome();
+                                    backgroundUpload(photoArr,json);
                                 }
 
+                                dismissProgressDialog();
+                                goHome();
+
                             } else {
                                 dismissProgressDialog();
                                 // error
@@ -905,6 +936,36 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
                         }
                     }
                     break;
+                    case UpdateBaseModel.UpdateTypeMultPhoto: {
+
+                        UpdateMultPhotoModel photoModel = (UpdateMultPhotoModel)baseModel;
+                        ArrayList<PhotoItemModel> models = photoModel.getPhotos();
+                        int count = models.size();
+                        if ((models == null || count == 0) && photoModel.getRequired()) {
+
+                            emptyArr.add(emptyArr.size() + 1 + "." + photoModel.getTitle());
+                            continue;
+                        }
+
+                        for (int k = 0; k < count; k++) {
+
+                            PhotoItemModel photoItemModel = models.get(k);
+                            String path = photoItemModel.url;
+                            if (path != null) {
+
+                                UpdatePhotoModel tmpModel = new UpdatePhotoModel();
+                                tmpModel.type = UpdateBaseModel.UpdateTypePhoto;
+                                tmpModel.title = photoModel.getTitle() + "_" + k;
+                                tmpModel.key = photoModel.getKey() + "_" + k;
+                                tmpModel.setPhotoPath(path);
+
+                                params.putString(tmpModel.key,tmpModel.getImageName());
+                                photoArr.add(tmpModel);
+                            }
+                        }
+
+                    }
+                    break;
                 }
             }
         }
@@ -944,6 +1005,7 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
             return;
         }
 
+        mPhotoType = Photo_Type_Normal;
         mPhotoModel = model;
         if (model.getImagePath() == null || model.getImagePath().length() == 0) {
 
@@ -955,6 +1017,24 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
         }
     }
 
+    @Override
+    public void photoItemClick(PhotoItemModel model) {
+        if (model == null) {
+            return;
+        }
+
+        mPhotoType = Photo_Type_Multiple;
+        mPhotoItemModel = model;
+        if (model.isEmpty()) {
+
+            startCamera();
+        } else {
+
+            Intent intent = PhotoPreviewActivity.build(self,model.url,true);
+            startActivityForResult(intent,REQUEST_PREVIEW_CODE);
+        }
+    }
+
     @Override
     public void signatureClick(UpdateSignatureModel model) {
         if (model == null) {

+ 59 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateAdapter.java

@@ -31,12 +31,16 @@ import android.widget.TextView;
 import com.google.i18n.phonenumbers.PhoneNumberMatch;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.usai.redant.apexdrivers.R;
+import com.usai.redant.apexdrivers.photoCell.PhotoCell;
+import com.usai.redant.apexdrivers.photoCell.PhotoCellDelegate;
+import com.usai.redant.apexdrivers.photoCell.PhotoItemModel;
 import com.usai.redant.apexdrivers.signature.SignatureActivity;
 import com.usai.redant.apexdrivers.update.model.UpdateBaseModel;
 import com.usai.redant.apexdrivers.update.model.UpdateDateModel;
 import com.usai.redant.apexdrivers.update.model.UpdateInputModel;
 import com.usai.redant.apexdrivers.update.model.UpdateLabelModel;
 import com.usai.redant.apexdrivers.update.model.UpdateMultInputModel;
+import com.usai.redant.apexdrivers.update.model.UpdateMultPhotoModel;
 import com.usai.redant.apexdrivers.update.model.UpdatePhotoModel;
 import com.usai.redant.apexdrivers.update.model.UpdateSignatureModel;
 
@@ -249,6 +253,22 @@ public class UpdateAdapter extends BaseExpandableListAdapter {
 
             }
             break;
+            case UpdateBaseModel.UpdateTypeMultPhoto: {
+
+                MultPhotoHolder holder;
+                PhotoCell cell = (PhotoCell)convertView;
+                if (cell == null) {
+                    cell = PhotoCell.photoCell(mCtx);
+                    holder = new MultPhotoHolder(cell);
+                } else {
+                    holder = (MultPhotoHolder)cell.getTag();
+                }
+                convertView = cell;
+
+                UpdateMultPhotoModel photoModel = (UpdateMultPhotoModel)model;
+                holder.setModel(photoModel);
+            }
+            break;
         }
 
         return convertView;
@@ -697,7 +717,9 @@ public class UpdateAdapter extends BaseExpandableListAdapter {
                 @Override
                 public void onClick(View v) {
                     if (weakDate != null && weakDate.get() != null && mDelegate != null) {
-                        mDelegate.get().dateClick(weakDate.get());
+                        if (weakDate.get().editable) {
+                            mDelegate.get().dateClick(weakDate.get());
+                        }
                     }
                 }
             });
@@ -738,6 +760,12 @@ public class UpdateAdapter extends BaseExpandableListAdapter {
                 requiredTv.setVisibility(View.INVISIBLE);
                 valueTv.setText(null);
             }
+
+            if (model.editable) {
+                dateBtn.setVisibility(View.VISIBLE);
+            } else {
+                dateBtn.setVisibility(View.GONE);
+            }
         }
 
         @Override
@@ -746,11 +774,41 @@ public class UpdateAdapter extends BaseExpandableListAdapter {
         }
     }
 
+    private class MultPhotoHolder implements PhotoCellDelegate {
+
+        WeakReference<PhotoCell>  weakCell;
+        MultPhotoHolder(PhotoCell view) {
+            view.setTag(this);
+            weakCell = new WeakReference<>(view);
+            view.delegate = this;
+        }
+
+        void setModel(UpdateMultPhotoModel model) {
+            if (weakCell != null) {
+                if (model != null) {
+                    weakCell.get().setModel(model.getMapModel());
+                } else {
+                    weakCell.get().setModel(null);
+                }
+            }
+        }
+
+        @Override
+        public void clickPhotoItem(PhotoItemModel model) {
+            if (model != null) {
+                if (mDelegate != null) {
+                    mDelegate.get().photoItemClick(model);
+                }
+            }
+        }
+    }
+
     public interface UpdateAdapterDelegate {
         void scannerButtonDidClick(UpdateInputModel model);
         void photoButtonDidClick(UpdatePhotoModel model);
         void signatureClick(UpdateSignatureModel model);
         void dateClick(UpdateDateModel model);
+        void photoItemClick(PhotoItemModel model);
     }
 
     public class UpdateTextWatcher implements TextWatcher {

+ 5 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateSectionModel.java

@@ -5,6 +5,7 @@ import com.usai.redant.apexdrivers.update.model.UpdateDateModel;
 import com.usai.redant.apexdrivers.update.model.UpdateInputModel;
 import com.usai.redant.apexdrivers.update.model.UpdateLabelModel;
 import com.usai.redant.apexdrivers.update.model.UpdateMultInputModel;
+import com.usai.redant.apexdrivers.update.model.UpdateMultPhotoModel;
 import com.usai.redant.apexdrivers.update.model.UpdatePhotoModel;
 import com.usai.redant.apexdrivers.update.model.UpdateSignatureModel;
 
@@ -107,6 +108,10 @@ public class UpdateSectionModel {
 //                model.expand = expand;
             }
             break;
+            case UpdateBaseModel.UpdateTypeMultPhoto: {
+                model = new UpdateMultPhotoModel();
+            }
+            break;
         }
 
         if (model != null) {

+ 2 - 1
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/model/UpdateBaseModel.java

@@ -20,9 +20,10 @@ public class UpdateBaseModel extends BasicObject {
     public final static int UpdateTypePhoto = 3;
     public final static int UpdateTypeSignature = 4;
     public final static int UpdateTypeDate = 5;
+    public final static int UpdateTypeMultPhoto = 6;
 
     public static int getTypeCount() {
-        return 6;
+        return 7;
     }
 
     public int type;

+ 1 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/model/UpdateDateModel.java

@@ -13,6 +13,7 @@ public class UpdateDateModel extends UpdateBaseModel {
     public Date date;
     private String display;
     public int mode;
+    public boolean editable;
 
     @Override
     public void updateDefaultValue() {

+ 68 - 0
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/model/UpdateMultPhotoModel.java

@@ -0,0 +1,68 @@
+package com.usai.redant.apexdrivers.update.model;
+
+import com.usai.redant.apexdrivers.photoCell.PhotoItemModel;
+import com.usai.redant.apexdrivers.photoCell.PhotoModel;
+
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+
+public class UpdateMultPhotoModel extends UpdateBaseModel {
+
+    private PhotoModel mapModel = new PhotoModel();
+
+    @Override
+    public void setValuesForKeysWithJSON(JSONObject json) {
+        super.setValuesForKeysWithJSON(json);
+        mapModel.setValuesForKeysWithJSON(json);
+    }
+
+    public void setTitle(String title) {
+        super.title = title;
+        mapModel.title = title;
+    }
+
+    public void setKey(String key) {
+        super.key = key;
+        mapModel.key = key;
+    }
+
+    public void setType(int type) {
+        super.type = type;
+        mapModel.type = type;
+    }
+
+    public void setRequired(boolean required) {
+        super.required = required;
+        mapModel.required = required;
+    }
+
+    public void setPhotos(Object photos) {
+        mapModel.setPhotos(photos);
+    }
+
+
+    public String getTitle() {
+        return mapModel.title;
+    }
+
+    public int getType() {
+        return mapModel.type;
+    }
+
+    public String getKey() {
+        return mapModel.key;
+    }
+
+    public boolean getRequired() {
+        return mapModel.required;
+    }
+
+    public ArrayList<PhotoItemModel> getPhotos() {
+        return mapModel.getPhotos();
+    }
+
+    public PhotoModel getMapModel() {
+        return mapModel;
+    }
+}

BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/btn_add_photo.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/btn_photo_assign.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/btn_photo_retake.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-hdpi/new_flag.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/btn_add_photo.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/btn_photo_assign.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/btn_photo_retake.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-ldpi/new_flag.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/btn_add_photo.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/btn_photo_assign.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/btn_photo_retake.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-mdpi/new_flag.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/btn_add_photo.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/btn_photo_assign.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/btn_photo_retake.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xhdpi/new_flag.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/btn_add_photo.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/btn_photo_assign.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/btn_photo_retake.png


BIN
ApexDrivers/apexdriverslib/src/main/res/drawable-xxhdpi/new_flag.png


+ 68 - 21
ApexDrivers/apexdriverslib/src/main/res/layout/home_order_cell.xml

@@ -10,33 +10,80 @@
         android:layout_margin="5dp"
         >
 
-        <ImageView
-            android:id="@+id/order_mark_view"
-            android:layout_width="20dp"
-            android:layout_height="20dp"
-            android:layout_alignParentRight="true"
-            android:layout_marginRight="5dp"
-            android:layout_marginTop="5dp"
-            android:scaleType="centerInside"
-            android:src="@drawable/backend_flag"
-            />
-
-        <TextView
-            android:id="@+id/title_tv"
+        <!--<ImageView-->
+            <!--android:id="@+id/order_mark_view"-->
+            <!--android:layout_width="20dp"-->
+            <!--android:layout_height="20dp"-->
+            <!--android:layout_alignParentRight="true"-->
+            <!--android:layout_marginRight="5dp"-->
+            <!--android:layout_marginTop="5dp"-->
+            <!--android:scaleType="centerInside"-->
+            <!--android:src="@drawable/backend_flag"-->
+            <!--/>-->
+
+        <!--<TextView-->
+            <!--android:id="@+id/title_tv"-->
+            <!--android:layout_width="match_parent"-->
+            <!--android:layout_height="25dp"-->
+            <!--android:layout_margin="5dp"-->
+            <!--android:layout_toLeftOf="@id/order_mark_view"-->
+            <!--android:textSize="17sp"-->
+            <!--android:textColor="#000000"-->
+            <!--android:text="Pickup Order New"-->
+            <!--/>-->
+
+        <LinearLayout
+            android:id="@+id/title_container"
             android:layout_width="match_parent"
-            android:layout_height="25dp"
-            android:layout_margin="5dp"
-            android:layout_toLeftOf="@id/order_mark_view"
-            android:textSize="17sp"
-            android:textColor="#000000"
-            android:text="Pickup Order New"
-            />
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            >
+
+            <TextView
+                android:id="@+id/title_tv"
+                android:layout_width="0dp"
+                android:layout_height="25dp"
+                android:layout_weight="1"
+                android:layout_margin="5dp"
+                android:textSize="17sp"
+                android:textColor="#000000"
+                android:text="Pickup Order New"
+                />
+
+            <RelativeLayout
+                android:id="@+id/order_new_flag_view"
+                android:layout_width="60dp"
+                android:layout_height="match_parent"
+                android:layout_marginRight="5dp"
+                >
+
+                <ImageView
+                    android:layout_width="60dp"
+                    android:layout_height="20dp"
+                    android:scaleType="centerInside"
+                    android:layout_centerInParent="true"
+                    android:src="@drawable/new_flag"
+                    />
+
+            </RelativeLayout>
+
+            <ImageView
+                android:id="@+id/order_mark_view"
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:layout_marginRight="5dp"
+                android:layout_marginTop="5dp"
+                android:scaleType="centerInside"
+                android:src="@drawable/backend_flag"
+                />
+
+        </LinearLayout>
 
 
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@id/title_tv"
+            android:layout_below="@id/title_container"
             >
 
             <ImageView

+ 45 - 0
ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_cell.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.redant.apexdrivers.photoCell.PhotoCell xmlns:android="http://schemas.android.com/apk/res/android"
+                                                 android:layout_width="match_parent"
+                                                 android:layout_height="match_parent">
+
+    <RelativeLayout
+        android:id="@+id/mutiple_photo_title_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        >
+
+        <TextView
+            android:id="@+id/mutiple_photo_title_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="5dp"
+            android:textSize="19sp"
+            android:textColor="#000000"
+            android:textStyle="bold"
+            android:text="Photo"
+            />
+        <TextView
+            android:id="@+id/mutiple_photo_required_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="#ff0000"
+            android:text="*"
+            android:textSize="19sp"
+            android:layout_toRightOf="@id/mutiple_photo_title_tv"
+            />
+
+    </RelativeLayout>
+
+    <LinearLayout
+        android:id="@+id/mutiple_photo_collection_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:layout_below="@id/mutiple_photo_title_container"
+        android:layout_marginTop="5dp"
+        >
+
+    </LinearLayout>
+
+</com.usai.redant.apexdrivers.photoCell.PhotoCell>

+ 7 - 0
ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_horizontal_interval.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.redant.apexdrivers.photoCell.PhotoHorizontalInterval
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="5dp"
+    android:layout_height="match_parent">
+
+</com.usai.redant.apexdrivers.photoCell.PhotoHorizontalInterval>

+ 16 - 0
ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_item_cell.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.redant.apexdrivers.photoCell.PhotoItemCell
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/gray_border"
+    >
+
+    <ImageView
+        android:id="@+id/photo_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="1dp"
+        />
+
+</com.usai.redant.apexdrivers.photoCell.PhotoItemCell>

+ 9 - 0
ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_row.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.redant.apexdrivers.photoCell.PhotoRow
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal"
+    >
+
+</com.usai.redant.apexdrivers.photoCell.PhotoRow>

+ 7 - 0
ApexDrivers/apexdriverslib/src/main/res/layout/multiple_photo_vertical_interval.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.usai.redant.apexdrivers.photoCell.PhotoVerticalInterval
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="5dp">
+
+</com.usai.redant.apexdrivers.photoCell.PhotoVerticalInterval>

+ 2 - 4
ApexDrivers/apexdriverslib/src/main/res/values-zh/strings.xml

@@ -71,8 +71,7 @@
     <string name="message">消息</string>
     <string name="btn_cancel">取消</string>
     <string name="sorry">对不起,发生未知错误.</string>
-    <string name="empty_msg">暂时没有数据
-        请点击刷新</string>
+    <string name="empty_msg">暂时没有数据\n请点击刷新</string>
 
     <!--Retrive Password-->
     <string name="btn_close">取消</string>
@@ -83,8 +82,7 @@
     <!--Main-->
     <string name="notification_order_change_msg"> 状态改变了,是否查看详情?</string>
     <string name="permission_request_msg"> 需要一些必要的权限。</string>
-    <string name="permission_deny_msg"> 将退出,因为缺少一些基本权限。
-请检查您的系统设置。</string>
+    <string name="permission_deny_msg"> 将退出,因为缺少一些基本权限。\n请检查您的系统设置。</string>
     <string name="notification_enable_msg">你应该启用通知</string>
     <string name="login_title">登陆</string>
     <string name="main_menu_upload_title">上传列表</string>

+ 2 - 4
ApexDrivers/apexdriverslib/src/main/res/values/strings.xml

@@ -80,16 +80,14 @@
     <!--Main-->
     <string name="notification_order_change_msg"> status changed,view detail?</string>
     <string name="permission_request_msg"> needs some essential permissions.</string>
-    <string name="permission_deny_msg"> will quit because missing some essential permissions.
-Please check your system setting.</string>
+    <string name="permission_deny_msg"> will quit because missing some essential permissions.\nPlease check your system setting.</string>
     <string name="notification_enable_msg">you should enable notification</string>
     <string name="login_title">Login</string>
     <string name="main_menu_upload_title">Upload List</string>
 
     <!--Home-->
     <string name="btn_more">More</string>
-    <string name="empty_msg">There is no data
-Please click to reload</string>
+    <string name="empty_msg">There is no data\nPlease click to reload</string>
     <string name="new_order_title">New Order</string>
     <string name="processing_order_title">Processing Order</string>
     <string name="finished_order_title">Finished Order</string>