Sfoglia il codice sorgente

1.修改Android Apex Drivers首页没有数据时显示Header。
2.修改Android Apex Drivers Update Order日期选择。
3.修改Android Apex Drivers 电话可点击在部分机型上不可用。

Pen Li 7 anni fa
parent
commit
beb4b83994

+ 1 - 0
ApexDrivers/apexdriverslib/build.gradle

@@ -56,6 +56,7 @@ dependencies {
     implementation 'com.android.support:appcompat-v7:26.1.0'
     implementation 'com.android.support.constraint:constraint-layout:1.1.2'
     implementation 'com.android.support:design:26.1.0'
+    implementation 'com.googlecode.libphonenumber:libphonenumber:7.0.4'
 //    testImplementation 'junit:junit:4.12'
 //    androidTestImplementation 'com.android.support.test:runner:1.0.2'
 //    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

+ 61 - 19
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/detail/DetailAdapter.java

@@ -2,6 +2,9 @@ package com.usai.redant.apexdrivers.detail;
 
 import android.content.Context;
 import android.content.Intent;
+import android.text.method.LinkMovementMethod;
+import android.text.util.Linkify;
+import android.util.Patterns;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -299,12 +302,18 @@ public class DetailAdapter extends BaseExpandableListAdapter {
 
         public void bindSingleLineModel(DetailSingleLineModel model) {
 
-            if (model != null && model.detectTel) {
-                valueTv.setAutoLinkMask(PHONE_NUMBERS);
-            } else {
-                valueTv.setAutoLinkMask(0);
+            if (model == null) {
+                titleTv.setText(null);
+                valueTv.setText(null);
+                return;
             }
 
+//            if (model != null && model.detectTel) {
+//                valueTv.setAutoLinkMask(PHONE_NUMBERS);
+//            } else {
+//                valueTv.setAutoLinkMask(0);
+//            }
+
             if (model != null) {
                 titleTv.setText(model.title);
                 valueTv.setText(model.value);
@@ -318,6 +327,11 @@ public class DetailAdapter extends BaseExpandableListAdapter {
             } else {
                 valueTv.setTextColor(mCtx.getResources().getColor(R.color.ApexDriverTextBlackColor));
             }
+
+            if (model.detectTel) {
+                Linkify.addLinks(valueTv, Patterns.PHONE,"tel:",Linkify.sPhoneNumberMatchFilter,Linkify.sPhoneNumberTransformFilter);
+                valueTv.setMovementMethod(LinkMovementMethod.getInstance());
+            }
         }
     }
 
@@ -334,12 +348,18 @@ public class DetailAdapter extends BaseExpandableListAdapter {
 
         public void bindMultLineModel(DetailMultipleLineModel model) {
 
-            if (model != null && model.detectTel) {
-                valueTv.setAutoLinkMask(PHONE_NUMBERS);
-            } else {
-                valueTv.setAutoLinkMask(0);
+            if (model == null) {
+                valueTv.setText(null);
+                return;
             }
 
+//            if (model != null && model.detectTel) {
+//                valueTv.setAutoLinkMask(PHONE_NUMBERS);
+//            } else {
+//                valueTv.setAutoLinkMask(0);
+//            }
+
+
             if (model != null) {
                 valueTv.setText(model.value);
             } else {
@@ -351,6 +371,11 @@ public class DetailAdapter extends BaseExpandableListAdapter {
                 valueTv.setTextColor(mCtx.getResources().getColor(R.color.ApexDriverTextBlackColor));
             }
 
+            if (model.detectTel) {
+                Linkify.addLinks(valueTv, Patterns.PHONE,"tel:",Linkify.sPhoneNumberMatchFilter,Linkify.sPhoneNumberTransformFilter);
+                valueTv.setMovementMethod(LinkMovementMethod.getInstance());
+            }
+
         }
     }
 
@@ -465,12 +490,19 @@ public class DetailAdapter extends BaseExpandableListAdapter {
 
         public void bindLocationModel(DetailLocationModel model) {
 
-            if (model != null && model.detectTel) {
-                locationTv.setAutoLinkMask(PHONE_NUMBERS);
-            } else {
-                locationTv.setAutoLinkMask(0);
+            if (model == null) {
+
+                titleTv.setText(null);
+                locationTv.setText(null);
+                return;
             }
 
+//            if (model != null && model.detectTel) {
+//                locationTv.setAutoLinkMask(PHONE_NUMBERS);
+//            } else {
+//                locationTv.setAutoLinkMask(0);
+//            }
+
             titleTv.setText(model.title);
             locationTv.setText(model.location);
 
@@ -482,6 +514,11 @@ public class DetailAdapter extends BaseExpandableListAdapter {
                 locationTv.setTextColor(mCtx.getResources().getColor(R.color.ApexDriverTextBlackColor));
             }
 
+            if (model.detectTel) {
+                Linkify.addLinks(locationTv, Patterns.PHONE,"tel:",Linkify.sPhoneNumberMatchFilter,Linkify.sPhoneNumberTransformFilter);
+                locationTv.setMovementMethod(LinkMovementMethod.getInstance());
+            }
+
         }
     }
 
@@ -628,11 +665,11 @@ public class DetailAdapter extends BaseExpandableListAdapter {
                 DetailMapModel model = weakMap.get();
                 if (model != null) {
 
-                    if (model != null && model.detectTel) {
-                        valueTv.setAutoLinkMask(PHONE_NUMBERS);
-                    } else {
-                        valueTv.setAutoLinkMask(0);
-                    }
+//                    if (model != null && model.detectTel) {
+//                        valueTv.setAutoLinkMask(PHONE_NUMBERS);
+//                    } else {
+//                        valueTv.setAutoLinkMask(0);
+//                    }
 
                     titleTv.setText(model.title);
                     valueTv.setText(model.location);
@@ -665,18 +702,23 @@ public class DetailAdapter extends BaseExpandableListAdapter {
                         mapBtn.setImageResource(R.drawable.btn_map_no);
                     }
 
+                    if (model.detectTel) {
+                        Linkify.addLinks(valueTv, Patterns.PHONE,"tel:",Linkify.sPhoneNumberMatchFilter,Linkify.sPhoneNumberTransformFilter);
+                        valueTv.setMovementMethod(LinkMovementMethod.getInstance());
+                    }
+
                 } else {
 
                     titleTv.setText(null);
                     valueTv.setText(null);
-                    valueTv.setAutoLinkMask(0);
+//                    valueTv.setAutoLinkMask(0);
                     mapBtn.setEnabled(false);
                     mapBtn.setImageResource(R.drawable.btn_map_no);
                 }
             } else {
                 titleTv.setText(null);
                 valueTv.setText(null);
-                valueTv.setAutoLinkMask(0);
+//                valueTv.setAutoLinkMask(0);
                 mapBtn.setEnabled(false);
                 mapBtn.setImageResource(R.drawable.btn_map_no);
             }

+ 54 - 7
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/home/HomeFragment.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.constraint.ConstraintLayout;
 import android.support.v4.app.Fragment;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.app.AlertDialog;
@@ -21,6 +22,7 @@ import android.view.ViewGroup;
 import android.widget.BaseExpandableListAdapter;
 import android.widget.Button;
 import android.widget.ExpandableListView;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import com.usai.redant.apexdrivers.ApexDriverApplication;
@@ -58,7 +60,10 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
     private HomeBroadCastReceiver mReceiver;
     private JSONObject mJson;
     private HomeOrderModel mSelectedModel;
+
     private TextView mEmptyView;
+    private RelativeLayout mEmptyContainer;
+
     private HomeHeaderView mHeaderView;
 
     @Nullable
@@ -129,6 +134,12 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
             }
         });
 
+        // header
+        mHeaderView = HomeHeaderView.headerView(mCtx);
+        mHeaderView.setDelegate(this);
+        mListView.addHeaderView(mHeaderView);
+
+        mEmptyContainer = view.findViewById(R.id.home_empty_view);
         mEmptyView = view.findViewById(R.id.home_empty_btn);
         mEmptyView.setText("There is no data\nPlease click to reload");
         mEmptyView.setOnClickListener(new View.OnClickListener() {
@@ -137,12 +148,8 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
                 loadData();
             }
         });
-        mListView.setEmptyView(view.findViewById(R.id.home_empty_view));
+//        mListView.setEmptyView(view.findViewById(R.id.home_empty_view));
 
-        // header
-        mHeaderView = HomeHeaderView.headerView(mCtx);
-        mHeaderView.setDelegate(this);
-        mListView.addHeaderView(mHeaderView);
     }
 
     @Override
@@ -218,6 +225,33 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
         mCtx.registerReceiver(mReceiver,intentFilter);
     }
 
+    private void updateEmptyViewState(boolean empty) {
+
+        if (empty) {
+
+            int top = 0;
+            if (mHeaderView != null) {
+                ViewGroup.LayoutParams layoutParams =  mHeaderView.getLayoutParams();
+                if (layoutParams != null) {
+                    top = layoutParams.height;
+                }
+            }
+
+            if (mEmptyContainer != null) {
+                mEmptyContainer.setVisibility(View.VISIBLE);
+                ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) mEmptyContainer.getLayoutParams();
+                if (layoutParams != null) {
+                    layoutParams.setMargins(0,top,0,0);
+                }
+            }
+
+        } else {
+            if (mEmptyContainer != null) {
+                mEmptyContainer.setVisibility(View.GONE);
+            }
+        }
+    }
+
     private ProgressDialog mProgressDialog;
     private void showProgressDialog() {
         if (mProgressDialog == null) {
@@ -476,6 +510,8 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
             switch (msg.what) {
                 case HomeActionReloadData: {
 
+//                    fragment.updateEmptyViewState(false);
+
                     /**
                      * 手动调用打开/关闭 Group,否则默认关闭
                      * */
@@ -610,12 +646,23 @@ public class HomeFragment extends Fragment implements HomeHeaderView.HomeHeaderD
 
         }
 
+        @Override
+        public boolean isEmpty() {
+
+            return false;
+        }
+
         @Override
         public int getGroupCount() {
+            int groupCount = 0;
             if (mSectionArray == null) {
-                return 0;
+                groupCount = 0;
             }
-            return mSectionArray.size();
+            groupCount = mSectionArray.size();
+
+            updateEmptyViewState(groupCount == 0);
+
+            return groupCount;
         }
 
         @Override

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

@@ -21,8 +21,8 @@ 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/";

+ 60 - 23
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateActivity.java

@@ -64,6 +64,7 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.lang.ref.WeakReference;
+import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -71,6 +72,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
+import static com.usai.redant.apexdrivers.update.model.UpdateBaseModel.UpdateTypeDate;
+import static com.usai.redant.apexdrivers.update.model.UpdateDateModel.DateModeDate;
+import static com.usai.redant.apexdrivers.update.model.UpdateDateModel.DateModeTime;
 import static com.usai.redant.rautils.utils.Network.RESULT_TRUE;
 
 public class UpdateActivity extends BasicActivity implements UpdateAdapter.UpdateAdapterDelegate {
@@ -886,6 +890,21 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
                         }
                     }
                     break;
+                    case UpdateBaseModel.UpdateTypeDate: {
+
+                        UpdateDateModel dateModel = (UpdateDateModel)baseModel;
+                        String value = dateModel.getValue();
+
+                        if (emptyArr != null && baseModel.required && TextUtils.isEmpty(value)) {
+                            emptyArr.add(emptyArr.size() + 1 + "." + baseModel.title);
+                            continue;
+                        }
+
+                        if (dateModel.key != null && value != null) {
+                            params.putString(dateModel.key,value);
+                        }
+                    }
+                    break;
                 }
             }
         }
@@ -946,31 +965,49 @@ public class UpdateActivity extends BasicActivity implements UpdateAdapter.Updat
     }
 
     @Override
-    public void dateClick(UpdateDateModel model) {
+    public void dateClick(final UpdateDateModel model) {
 
-        new TimePickerDialog(mCtx, new TimePickerDialog.OnTimeSetListener() {
-            @Override
-            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+        final Calendar c = Calendar.getInstance();
 
-            }
-        },0,0,true).show();
-
-//        Calendar c = Calendar.getInstance();
-//        new DatePickerDialog(mCtx,
-//                new DatePickerDialog.OnDateSetListener()
-//                {
-//
-//                    @Override
-//                    public void onDateSet(DatePicker view,
-//                                          int year, int monthOfYear,
-//                                          int dayOfMonth)
-//                    {
-//
-//
-//                    }
-//
-//                }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
-//                c.get(Calendar.DAY_OF_MONTH)).show();
+        if (model.mode == DateModeTime) {
+
+            final boolean is24 = android.text.format.DateFormat.is24HourFormat(mCtx);
+
+            new TimePickerDialog(mCtx, new TimePickerDialog.OnTimeSetListener() {
+                @Override
+                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+
+                   if (is24) {
+                       c.set(Calendar.HOUR_OF_DAY,hourOfDay);
+                   } else {
+                       c.set(Calendar.HOUR,hourOfDay);
+                   }
+                   c.set(Calendar.MINUTE,minute);
+
+                   Date date =c.getTime();
+
+                   model.setDate(date);
+                }
+            },c.get(Calendar.HOUR),c.get(Calendar.MINUTE), is24).show();
+
+        } else if (model.mode == DateModeDate) {
+
+
+            new DatePickerDialog(mCtx, new DatePickerDialog.OnDateSetListener() {
+
+                @Override
+                public void onDateSet(DatePicker view,int year, int monthOfYear,int dayOfMonth) {
+
+                    c.set(Calendar.YEAR,year);
+                    c.set(Calendar.MONTH,monthOfYear);
+                    c.set(Calendar.DATE,dayOfMonth);
+
+                    Date date =c.getTime();
+                    model.setDate(date);
+                }
+
+            }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)).show();
+        }
 
     }
 

+ 134 - 12
ApexDrivers/apexdriverslib/src/main/java/com/usai/redant/apexdrivers/update/UpdateAdapter.java

@@ -2,8 +2,20 @@ package com.usai.redant.apexdrivers.update;
 
 import android.content.Context;
 import android.content.Intent;
+import android.telephony.PhoneNumberUtils;
 import android.text.Editable;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextPaint;
 import android.text.TextWatcher;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.URLSpan;
+import android.text.util.Linkify;
+import android.util.Log;
+import android.util.Patterns;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
@@ -15,6 +27,9 @@ import android.widget.ImageButton;
 import android.widget.ImageView;
 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.signature.SignatureActivity;
 import com.usai.redant.apexdrivers.update.model.UpdateBaseModel;
@@ -27,6 +42,9 @@ import com.usai.redant.apexdrivers.update.model.UpdateSignatureModel;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Locale;
 
 import static android.text.util.Linkify.PHONE_NUMBERS;
 
@@ -272,15 +290,127 @@ public class UpdateAdapter extends BaseExpandableListAdapter {
 
         public void bindModel(UpdateLabelModel model) {
 
-            if (model != null && model.detectTel) {
-                valueTv.setAutoLinkMask(PHONE_NUMBERS);
-            } else {
-                valueTv.setAutoLinkMask(0);
+            if (model == null) {
+                titleTv.setText(null);
+                valueTv.setText(null);
+                return;
             }
 
+//            if (model != null && model.detectTel) {
+//                valueTv.setAutoLinkMask(PHONE_NUMBERS); // 在部分机型不起作用
+//            } else {
+//                valueTv.setAutoLinkMask(0);
+//            }
+
             titleTv.setText(model.title);
             valueTv.setText(model.value);
+            valueTv.setMovementMethod(LinkMovementMethod.getInstance());
+
+            if (model.detectTel) {
+
+                // 部分机型上解析不一样。clickable不一样
+                // implementation 'com.googlecode.libphonenumber:libphonenumber:7.0.4'
+//                Spannable text = new SpannableString(model.value);
+//
+//                ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
+//
+//                gatherTelLinks(links, text);
+//
+//                pruneOverlaps(links);
+//
+//                for (LinkSpec link: links) {
+//                    applyLink(link.url, link.start, link.end, text);
+//                }
+//
+//                valueTv.setText(text);
+
+                // 暂时看起来clickable一致
+                valueTv.setText(model.value);
+                Linkify.addLinks(valueTv, Patterns.PHONE,"tel:",Linkify.sPhoneNumberMatchFilter,Linkify.sPhoneNumberTransformFilter);
+                valueTv.setMovementMethod(LinkMovementMethod.getInstance());
 
+            } else {
+                valueTv.setText(model.value);
+            }
+        }
+
+        class LinkSpec {
+            String url;
+            int start;
+            int end;
+        }
+
+        private final void gatherTelLinks(ArrayList<LinkSpec> links, Spannable s) {
+            PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+            Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(s.toString(),
+                    Locale.getDefault().getCountry(), PhoneNumberUtil.Leniency.POSSIBLE, Long.MAX_VALUE);
+            for (PhoneNumberMatch match : matches) {
+                LinkSpec spec = new LinkSpec();
+                spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());
+                spec.start = match.start();
+                spec.end = match.end();
+                links.add(spec);
+            }
+        }
+
+        private final void applyLink(String url, int start, int end, Spannable text) {
+            URLSpan span = new URLSpan(url);
+
+            text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        }
+
+        private final void pruneOverlaps(ArrayList<LinkSpec> links) {
+            Comparator<LinkSpec> c = new Comparator<LinkSpec>() {
+                public final int compare(LinkSpec a, LinkSpec b) {
+                    if (a.start < b.start) {
+                        return -1;
+                    }
+
+                    if (a.start > b.start) {
+                        return 1;
+                    }
+
+                    if (a.end < b.end) {
+                        return 1;
+                    }
+
+                    if (a.end > b.end) {
+                        return -1;
+                    }
+
+                    return 0;
+                }
+            };
+
+            Collections.sort(links, c);
+
+            int len = links.size();
+            int i = 0;
+
+            while (i < len - 1) {
+                LinkSpec a = links.get(i);
+                LinkSpec b = links.get(i + 1);
+                int remove = -1;
+
+                if ((a.start <= b.start) && (a.end > b.start)) {
+                    if (b.end <= a.end) {
+                        remove = i + 1;
+                    } else if ((a.end - a.start) > (b.end - b.start)) {
+                        remove = i + 1;
+                    } else if ((a.end - a.start) < (b.end - b.start)) {
+                        remove = i;
+                    }
+
+                    if (remove != -1) {
+                        links.remove(remove);
+                        len--;
+                        continue;
+                    }
+
+                }
+
+                i++;
+            }
         }
     }
 
@@ -566,14 +696,6 @@ public class UpdateAdapter extends BaseExpandableListAdapter {
             dateBtn.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
-
-                }
-            });
-
-            view.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-
                     if (weakDate != null && weakDate.get() != null && mDelegate != null) {
                         mDelegate.get().dateClick(weakDate.get());
                     }

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


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


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


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


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


+ 2 - 1
ApexDrivers/apexdriverslib/src/main/res/layout/fragment_home.xml

@@ -28,7 +28,8 @@
     <RelativeLayout
         android:id="@+id/home_empty_view"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        >
 
         <TextView
             android:id="@+id/home_empty_btn"

+ 2 - 2
ApexDrivers/apexdriverslib/src/main/res/layout/update_date_cell.xml

@@ -11,8 +11,8 @@
         android:layout_height="30dp"
         android:layout_centerVertical="true"
         android:layout_alignParentRight="true"
-        android:layout_margin="5dp"
-        android:background="@drawable/barcode_selector"
+        android:layout_margin="10dp"
+        android:background="@drawable/btn_calendar"
         />
 
     <RelativeLayout