release V59
authorsnickersun <scy@incartech.cn>
Wed, 23 Dec 2020 09:07:54 +0000 (17:07 +0800)
committersnickersun <scy@incartech.cn>
Wed, 23 Dec 2020 09:07:54 +0000 (17:07 +0800)
适配L05 GPS测试界面。
取消V20,GT09的UI适配(系统已经自动适配)

17 files changed:
app/release/FactoryMode_V58_202012212129_release.apk [deleted file]
app/release/FactoryMode_V59_202012231702_release.apk [new file with mode: 0644]
app/release/output.json
app/src/main/assets/font/NotoSansHans-Medium.otf [new file with mode: 0644]
app/src/main/assets/font/NotoSansHans-Regular.otf [new file with mode: 0644]
app/src/main/java/mobile/miki/BaseActivity.java
app/src/main/java/mobile/miki/GPSActivity.java
app/src/main/java/mobile/miki/LocationSnrAdapter.java
app/src/main/java/mobile/miki/MyApplication.java
app/src/main/java/mobile/miki/SnrHistogramView.java
app/src/main/java/mobile/miki/TouchTest.java
app/src/main/java/mobile/miki/util/FTUtils.java
app/src/main/java/mobile/miki/util/TypeFaceUtil.java [new file with mode: 0644]
app/src/main/res/layout/gps_full_test_activity_96.xml [new file with mode: 0644]
app/src/main/res/layout/item_snr_layout_96.xml [new file with mode: 0644]
app/src/main/res/values/styles.xml
app/version_code.properties

diff --git a/app/release/FactoryMode_V58_202012212129_release.apk b/app/release/FactoryMode_V58_202012212129_release.apk
deleted file mode 100644 (file)
index 5cc79b3..0000000
Binary files a/app/release/FactoryMode_V58_202012212129_release.apk and /dev/null differ
diff --git a/app/release/FactoryMode_V59_202012231702_release.apk b/app/release/FactoryMode_V59_202012231702_release.apk
new file mode 100644 (file)
index 0000000..e2c8143
Binary files /dev/null and b/app/release/FactoryMode_V59_202012231702_release.apk differ
index e8b21a2..bab6098 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":58,"versionName":"202012212129","enabled":true,"outputFile":"FactoryMode_V58_202012212129_release.apk","fullName":"release","baseName":"release"},"path":"FactoryMode_V58_202012212129_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":59,"versionName":"202012231702","enabled":true,"outputFile":"FactoryMode_V59_202012231702_release.apk","fullName":"release","baseName":"release"},"path":"FactoryMode_V59_202012231702_release.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/src/main/assets/font/NotoSansHans-Medium.otf b/app/src/main/assets/font/NotoSansHans-Medium.otf
new file mode 100644 (file)
index 0000000..ad071a4
Binary files /dev/null and b/app/src/main/assets/font/NotoSansHans-Medium.otf differ
diff --git a/app/src/main/assets/font/NotoSansHans-Regular.otf b/app/src/main/assets/font/NotoSansHans-Regular.otf
new file mode 100644 (file)
index 0000000..923f89c
Binary files /dev/null and b/app/src/main/assets/font/NotoSansHans-Regular.otf differ
index 183bdfd..01a0d7f 100644 (file)
@@ -48,13 +48,14 @@ public class BaseActivity extends Activity {
             ViewGroup.LayoutParams windowLayoutParams = window.getAttributes(); // 获取对话框当前的参数值
             windowLayoutParams.width = 170;//(int) (display.getWidth() * 0.7); // 宽度设置为屏幕的0.95
             windowLayoutParams.height = 170;//(int) (display.getHeight() * 0.6); // 高度设置为屏幕的0.6
-        }else if(FTUtils.isV20() || FTUtils.isGT09()){
-            Display display = getWindowManager().getDefaultDisplay(); // 为获取屏幕宽、高
-            Window window = getWindow();
-            ViewGroup.LayoutParams windowLayoutParams = window.getAttributes(); // 获取对话框当前的参数值
-            windowLayoutParams.width = 280;//(int) (display.getWidth() * 0.7); // 宽度设置为屏幕的0.95
-            windowLayoutParams.height = 280;//(int) (display.getHeight() * 0.6); // 高度设置为屏幕的0.6
         }
+//        else if(FTUtils.isV20() || FTUtils.isGT09()){
+//            Display display = getWindowManager().getDefaultDisplay(); // 为获取屏幕宽、高
+//            Window window = getWindow();
+//            ViewGroup.LayoutParams windowLayoutParams = window.getAttributes(); // 获取对话框当前的参数值
+//            windowLayoutParams.width = 280;//(int) (display.getWidth() * 0.7); // 宽度设置为屏幕的0.95
+//            windowLayoutParams.height = 280;//(int) (display.getHeight() * 0.6); // 高度设置为屏幕的0.6
+//        }
     }
     
     @Override
index 20481b2..5a6685f 100644 (file)
@@ -55,11 +55,15 @@ public class GPSActivity extends BaseActivity  {
     private Timer timer;
     final LocationSnrAdapter adapter = new LocationSnrAdapter(testSnrEntriyDate(null));
     private final String ttyDialogPort="/dev/ttyGS3";
+    private ArrayList<String> nmeaBuffer=new ArrayList<>();
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if(FTUtils.isGT09()){
+        if(FTUtils.isGT09()) {
             setContentView(R.layout.gps_full_test_activity_280);
+        }else if (FTUtils.isL05()){
+            setContentView(R.layout.gps_full_test_activity_96);
         }else {
             setContentView(R.layout.gps_full_test_activity);
         }
@@ -70,8 +74,11 @@ public class GPSActivity extends BaseActivity  {
         mHoop =  (TextView)findViewById(R.id.ic_lc_hoop_value);
         mSearchCount= (TextView)findViewById(R.id.ic_lc_searchCount_value);
         mRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
-
-        mRv.addItemDecoration(new SpacesItemDecoration(10));
+        if (FTUtils.isL05()) {
+            mRv.addItemDecoration(new SpacesItemDecoration(5));
+        }else{
+            mRv.addItemDecoration(new SpacesItemDecoration(10));
+        }
         mRv.setAdapter(adapter);
 
         mFix.setText("notFixed");
@@ -85,6 +92,7 @@ public class GPSActivity extends BaseActivity  {
             mHoop.setTextSize(15);
             mSearchCount.setTextSize(15);
         }
+
         startListen();
     }
 
@@ -102,7 +110,7 @@ public class GPSActivity extends BaseActivity  {
             gps_status_show.numSatelliteList.add(i, new GpsSatellitePriv(gps_status.numSatelliteList.get(i).prn,gps_status.numSatelliteList.get(i).snr));
         }
 
-      mHandler.sendEmptyMessage(0);
+        mHandler.sendEmptyMessage(0);
     }
 
     public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
@@ -224,13 +232,22 @@ public class GPSActivity extends BaseActivity  {
 
             List<GpsSatellitePriv> gpslist =gps_status_show.numSatelliteList;
             adapter.updateLocationValue(testSnrEntriyDate(gpslist));
-            String fixed=new StringBuilder().append(gps_status_show.locating_status>0?
-                    "Fixed ":"notFixed ").append(getLocalTime2()).toString();
-            String satlites=new StringBuilder("used ").append(gps_status_show.used_gps_numbs).append(" in ")
-                    .append(gps_status_show.numSatelliteList.size()).append("/ inMap ").append(gps_status_show.satlite_numbss).toString();
+            StringBuilder strfixed=new StringBuilder();
+            StringBuffer satlites=new StringBuffer();
+
+//            if(!FTUtils.isL05()){
+                 strfixed.append(gps_status_show.locating_status>0?
+                        "Fixed ":"notFixed ").append(getLocalTime2()).toString();
+                satlites.append("used ").append(gps_status_show.used_gps_numbs).append(" in ")
+                        .append(gps_status_show.numSatelliteList.size()).append("/ inMap ").append(gps_status_show.satlite_numbss).toString();
+
+//            }else{
+//                strfixed.append(gps_status_show.locating_status>0?
+//                        "Fixed ":"notFixed ");
+//            }
             String locationTime=new StringBuilder().append(gps_status_show.search_time_cost).append(" ").append(getResources().getString(R.string.seconds)).toString();
             String hdop=new StringBuilder().append(String.valueOf(gps_status_show.hdop)).append(" ").append(getResources().getString(R.string.meter)).toString();
-            mFix.setText(fixed);
+            mFix.setText(strfixed.toString());
             if (mFix.getText().toString().contains("notFixed")){
                 mFix.setBackgroundColor(Color.RED);
                 mFix.setTextColor(Color.WHITE);
@@ -238,7 +255,7 @@ public class GPSActivity extends BaseActivity  {
                 mFix.setBackgroundColor(Color.GREEN);
                 mFix.setTextColor(Color.BLACK);
             }
-            mStar.setText(satlites);
+            mStar.setText(satlites.toString());
             mHoop.setText(hdop);
             mSearchCount.setText(locationTime);
 
@@ -248,11 +265,14 @@ public class GPSActivity extends BaseActivity  {
     myGpsListener  gpsListener=new myGpsListener();
     private boolean listening=false;
     public boolean startListen() {
-        if(FTUtils.isGT09())
-        {
+        if(FTUtils.isGT09()) {
             enableAG3335M(true);
             return true;
         }else{
+
+            if(FTUtils.isL05()) {
+                doTranseDataToTTYGS3(true);
+            }
             if (this.listening == false) {
                 Settings.Secure.setLocationProviderEnabled(this.getContentResolver(), GPS_PROVIDER, true);
 
@@ -287,12 +307,33 @@ public class GPSActivity extends BaseActivity  {
     }
 
 
+
     public static ExecutorService executor= Executors.newCachedThreadPool();
     public static Future trans=null;
     static volatile  boolean serial_thread_running=false;
     public final String GPS_SERIAL_DEVICE = "/dev/ttyS2";
     public final String USB_SERIAL_DEVICE = "/dev/ttyGS3";
 
+    public void doTranseDataToTTYGS3(boolean enable){
+
+        
+//        if(enable==true) {
+//
+//            //create thread  reading GPS data and send to USB SerialPort named " SPRD WCN DIAG "
+//            //you can get GPS NMEA data in this thread
+//            if(serial_thread_running==false) {
+//                if (trans==null) {
+//                    trans = executor.submit(thransferGPSdata);
+//                }else if ( trans.isDone() || trans.isCancelled()){
+//                    trans = executor.submit(thransferGPSdata);
+//                }
+//            }
+//
+//        }else {
+//            serial_thread_running = false;
+//            trans.cancel(true);
+//        }
+    }
     public void enableAG3335M(boolean enable){
         if(enable==true) {
 
@@ -304,9 +345,9 @@ public class GPSActivity extends BaseActivity  {
             //you can get GPS NMEA data in this thread
             if(serial_thread_running==false) {
                 if (trans==null) {
-                    trans = executor.submit(thransferGPSdata);
+                    trans = executor.submit(receiveGPSdata);
                 }else if ( trans.isDone() || trans.isCancelled()){
-                    trans = executor.submit(thransferGPSdata);
+                    trans = executor.submit(receiveGPSdata);
                 }
             }
 
@@ -323,6 +364,53 @@ public class GPSActivity extends BaseActivity  {
     }
     public Runnable thransferGPSdata=new Runnable() {
 
+        @Override
+        public void run() {
+            FileOutputStream fo=null;
+            Log.i("trans","ttyGS3  start");
+            serial_thread_running=true;
+            if(fo==null) {
+                try {
+                    fo=new FileOutputStream(new File(USB_SERIAL_DEVICE));
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            while (serial_thread_running){
+                if(fo!=null){
+                    try {
+
+                        if(nmeaBuffer.size()>0 ){
+                            String tmp=nmeaBuffer.get(0);
+                            nmeaBuffer.remove(0);
+                            fo.write(tmp.getBytes(),0,tmp.length());
+
+                        }else{
+                            Thread.sleep(500);
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }else{
+                    break;
+                }
+            }
+            try {
+                fo.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }finally {
+                fo=null;
+            }
+
+
+
+            Log.i("trans","ttyGS3  done");
+        }
+    };
+    public Runnable receiveGPSdata=new Runnable() {
+
         @Override
         public void run() {
             FileInputStream fs=null;
@@ -338,6 +426,7 @@ public class GPSActivity extends BaseActivity  {
 
             byte[] buf=new byte[4096];
             int l=0;
+            StringBuffer sb=new StringBuffer();
             while (serial_thread_running){
                 if(fs!=null){
                     try {
@@ -348,6 +437,16 @@ public class GPSActivity extends BaseActivity  {
                                 int idx=list[i].indexOf("*");
                                 if(idx>0 && list[i].startsWith("$")) {
                                     mOnNmeaReceived(list[i].length(), list[i].substring(0,idx));
+                                }else{
+                                    sb.append(list[i]);
+                                    String tmp=sb.toString();
+                                    int st=tmp.indexOf("$");
+                                    int ed=tmp.indexOf("*");
+                                    if(ed>0&& st>0 && ed>st){
+                                        String nmeastr=tmp.substring(st,ed);
+                                        mOnNmeaReceived(nmeastr.length(), nmeastr);
+                                        sb.replace(0,ed,"");
+                                    }
                                 }
                             }
                         }else{
@@ -377,20 +476,22 @@ public class GPSActivity extends BaseActivity  {
             }
 
 
+
             Log.i("trans","ttyS2  done");
         }
     };
     private static String ACTION_GPSCMD="com.enqualcomm.support.gps";
     public void stopListen() {
-        if(FTUtils.isGT09())
-        {
+        if(FTUtils.isGT09()) {
             enableAG3335M(false);
         }else {
+            if(FTUtils.isL05()) {
+                doTranseDataToTTYGS3(false);
+            }
             this.locationManager.removeNmeaListener(gpsListener);
             this.locationManager.removeUpdates(gpsListener);
             this.listening = false;
             Logger.d("stopListen 定位 ");
-
             Settings.Secure.setLocationProviderEnabled(this.getContentResolver(), GPS_PROVIDER, false);
             sendBroadcast();
         }
@@ -427,6 +528,14 @@ public class GPSActivity extends BaseActivity  {
 //    EqcAlgorithmNative.native_EqcAlgorithmMethod5(paramString);
         Logger.d("Nmea :"+nmeastr+" "+paramLong);
         //write_nmea_to_tty(nmeastr);
+
+        if(FTUtils.isL05())
+        {
+            if(nmeaBuffer.size()>100){
+                nmeaBuffer.remove(0);
+            }
+            nmeaBuffer.add(nmeastr);
+        }
         if(nmeastr.startsWith("$RD_RSSI") ||nmeastr.startsWith("$GNGGA"))  {
 
             searchCout++;
index 1a32224..42b59d5 100644 (file)
@@ -1,58 +1,71 @@
-package mobile.miki;\r
-\r
-import android.support.annotation.NonNull;\r
-import android.support.v7.widget.RecyclerView;\r
-import android.view.LayoutInflater;\r
-import android.view.View;\r
-import android.view.ViewGroup;\r
-\r
-import java.util.ArrayList;\r
-\r
-public class LocationSnrAdapter extends RecyclerView.Adapter<LocationSnrAdapter.SnrHolder> {\r
-\r
-\r
-    private ArrayList<SnrEntriy> mSnrList = new ArrayList<>();\r
-\r
-    public LocationSnrAdapter(ArrayList<SnrEntriy> mSnrList) {\r
-        this.mSnrList = mSnrList;\r
-    }\r
-\r
-    public void updateLocationValue(ArrayList<SnrEntriy> snrEntriys){\r
-        mSnrList.clear();\r
-        mSnrList.addAll(snrEntriys);\r
-        notifyDataSetChanged();\r
-    }\r
-\r
-    @NonNull\r
-    @Override\r
-    public SnrHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\r
-        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_snr_layout, parent, false);\r
-        return new SnrHolder(view);\r
-    }\r
-\r
-    @Override\r
-    public void onBindViewHolder(@NonNull SnrHolder holder, int position) {\r
-        holder.updateSnrValue(mSnrList.get(position));\r
-    }\r
-\r
-    @Override\r
-    public int getItemCount() {\r
-        return mSnrList.size();\r
-    }\r
-\r
-    static class SnrHolder extends RecyclerView.ViewHolder {\r
-\r
-        private SnrHistogramView snrView;\r
-\r
-        public SnrHolder(@NonNull View itemView) {\r
-            super(itemView);\r
-            snrView = (SnrHistogramView)itemView.findViewById(R.id.item_snr_view);\r
-        }\r
-\r
-\r
-        public void updateSnrValue(SnrEntriy entriy){\r
-            snrView.updateValue(entriy.getSnrValue(),entriy.getSnrNumber(),entriy.getSnrBg());\r
-        }\r
-\r
-    }\r
-}\r
+package mobile.miki;
+
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+
+import mobile.miki.util.FTUtils;
+
+public class LocationSnrAdapter extends RecyclerView.Adapter<LocationSnrAdapter.SnrHolder> {
+
+
+    private ArrayList<SnrEntriy> mSnrList = new ArrayList<>();
+
+    public LocationSnrAdapter(ArrayList<SnrEntriy> mSnrList) {
+        this.mSnrList = mSnrList;
+    }
+
+    public void updateLocationValue(ArrayList<SnrEntriy> snrEntriys){
+        mSnrList.clear();
+        mSnrList.addAll(snrEntriys);
+        notifyDataSetChanged();
+    }
+
+    @NonNull
+    @Override
+    public SnrHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view;
+        if(FTUtils.isL05()){
+            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_snr_layout_96, parent, false);
+        }else{
+            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_snr_layout, parent, false);
+        }
+        return new SnrHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull SnrHolder holder, int position) {
+        holder.updateSnrValue(mSnrList.get(position));
+    }
+
+    @Override
+    public int getItemCount() {
+        return mSnrList.size();
+    }
+
+    static class SnrHolder extends RecyclerView.ViewHolder {
+
+        private SnrHistogramView snrView;
+
+        public SnrHolder(@NonNull View itemView) {
+            super(itemView);
+
+            if(FTUtils.isL05()){
+                snrView = (SnrHistogramView)itemView.findViewById(R.id.item_snr_view_96);
+            }else{
+                snrView = (SnrHistogramView)itemView.findViewById(R.id.item_snr_view);
+            }
+
+        }
+
+
+        public void updateSnrValue(SnrEntriy entriy){
+            snrView.updateValue(entriy.getSnrValue(),entriy.getSnrNumber(),entriy.getSnrBg());
+        }
+
+    }
+}
index cc67f8c..f132edd 100644 (file)
@@ -11,6 +11,8 @@ import java.util.LinkedList;
 import java.util.List;
 
 import mobile.miki.util.CrashHandler;
+import mobile.miki.util.FTUtils;
+import mobile.miki.util.TypeFaceUtil;
 
 public class MyApplication extends Application {
     public List<Activity> activitys = null;
@@ -21,13 +23,16 @@ public class MyApplication extends Application {
         // TODO Auto-generated method stub
         super.onCreate();
 //        initFileDownLoad();
+
+        if(FTUtils.isL05()) {
+            TypeFaceUtil.replaceSystemDefaultFont(this, "font/NotoSansHans-Medium.otf");
+       }
         CrashHandler crashHandler = CrashHandler.getInstance();
         crashHandler.init(getApplicationContext());
     }
 
     public MyApplication() {
         activitys = new LinkedList<Activity>();
-
     }
 
     private void initFileDownLoad() {
index dfcb8fb..036e63e 100644 (file)
@@ -49,8 +49,10 @@ public class SnrHistogramView extends View {
         mTextPaint.setDither(true);
         mTextPaint.setColor(Color.WHITE);
         mTextPaint.setStyle(Paint.Style.FILL);
-        if(FTUtils.isGT09()){
+        if(FTUtils.isGT09()) {
             mTextPaint.setTextSize(spToPx(12));
+        }else if(FTUtils.isL05()){
+            mTextPaint.setTextSize(spToPx(10));
         }else {
             mTextPaint.setTextSize(spToPx(24));
         }
index 2cabb9e..5af4fbc 100644 (file)
@@ -77,9 +77,9 @@ public class TouchTest extends BaseActivity {
                if (FTUtils.isA9()){
                        mDisplayHeight = 170;
                        mDisplayWidth = 170;
-               }else if(FTUtils.isV20()|| FTUtils.isGT09()) {
-                       mDisplayHeight = 280;
-                       mDisplayWidth = 280;
+//             }else if(FTUtils.isV20()|| FTUtils.isGT09()) {
+//                     mDisplayHeight = 280;
+//                     mDisplayWidth = 280;
                }else {
                        mDisplayHeight = myDisplay.getHeight();
                        mDisplayWidth = myDisplay.getWidth();
index 052fa2a..61e60a2 100644 (file)
@@ -191,7 +191,13 @@ public class FTUtils {
     public static String getBtAddressViaReflection() {
         return BluetoothAdapter.getDefaultAdapter().getAddress();
     }
-
+    public static boolean isL05() {
+        if(SystemProperties.get("persist.sys.id_num","").equalsIgnoreCase("l05"))
+        {
+            return true;
+        }
+        return false;
+    }
     public static boolean isS06() {
 //        if (SystemProperties.get("ro.product.brand", "").equalsIgnoreCase("SPRD") && SystemProperties.get("ro.build.version.release", "").equalsIgnoreCase("8.1.0")) {
 //            return true;
diff --git a/app/src/main/java/mobile/miki/util/TypeFaceUtil.java b/app/src/main/java/mobile/miki/util/TypeFaceUtil.java
new file mode 100644 (file)
index 0000000..e0efb7d
--- /dev/null
@@ -0,0 +1,134 @@
+package mobile.miki.util;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Typeface;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+
+import java.lang.reflect.Field;
+
+/**
+ * @author liyanmei
+ * @date 2019/6/25
+ * @describe
+ */
+public class TypeFaceUtil {
+    /**
+     * 为给定的字符串添加HTML红色标记,当使用Html.fromHtml()方式显示到TextView 的时候其将是红色的
+     *
+     * @param string 给定的字符串
+     * @return
+     */
+    public static String addHtmlRedFlag(String string) {
+        return "<font color=\"red\">" + string + "</font>";
+    }
+
+    /**
+     * 将给定的字符串中所有给定的关键字标红
+     *
+     * @param sourceString 给定的字符串
+     * @param keyword      给定的关键字
+     * @return 返回的是带Html标签的字符串,在使用时要通过Html.fromHtml()转换为Spanned对象再传递给TextView对象
+     */
+    public static String keywordMadeRed(String sourceString, String keyword) {
+        String result = "";
+        if (sourceString != null && !"".equals(sourceString.trim())) {
+            if (keyword != null && !"".equals(keyword.trim())) {
+                result = sourceString.replaceAll(keyword, "<font color=\"red\">" + keyword + "</font>");
+            } else {
+                result = sourceString;
+            }
+        }
+        return result;
+    }
+
+    /**
+     * <p>Replace the font of specified view and it's children</p>
+     *
+     * @param root     The root view.
+     * @param fontPath font file path relative to 'assets' directory.
+     */
+    public static void replaceFont( View root, String fontPath) {
+        if (root == null || TextUtils.isEmpty(fontPath)) {
+            return;
+        }
+
+
+        if (root instanceof TextView) { // If view is TextView or it's subclass, replace it's font
+            TextView textView = (TextView) root;
+            int style = Typeface.NORMAL;
+            if (textView.getTypeface() != null) {
+                style = textView.getTypeface().getStyle();
+            }
+            textView.setTypeface(createTypeface(root.getContext(), fontPath), style);
+        } else if (root instanceof ViewGroup) { // If view is ViewGroup, apply this method on it's child views
+            ViewGroup viewGroup = (ViewGroup) root;
+            for (int i = 0; i < viewGroup.getChildCount(); ++i) {
+                replaceFont(viewGroup.getChildAt(i), fontPath);
+            }
+        }
+    }
+
+    /**
+     * <p>Replace the font of specified view and it's children</p>
+     * 通过递归批量替换某个View及其子View的字体改变Activity内部控件的字体(TextView,Button,EditText,CheckBox,RadioButton等)
+     *
+     * @param context  The view corresponding to the activity.
+     * @param fontPath font file path relative to 'assets' directory.
+     */
+    public static void replaceFont( Activity context, String fontPath) {
+        replaceFont(getRootView(context), fontPath);
+    }
+
+
+    /*
+     * Create a Typeface instance with your font file
+     */
+    public static Typeface createTypeface(Context context, String fontPath) {
+        return Typeface.createFromAsset(context.getAssets(), fontPath);
+    }
+
+    /**
+     * 从Activity 获取 rootView 根节点
+     *
+     * @param context
+     * @return 当前activity布局的根节点
+     */
+    public static View getRootView(Activity context) {
+        return ((ViewGroup) context.findViewById(android.R.id.content)).getChildAt(0);
+    }
+
+    /**
+     * 通过改变App的系统字体替换App内部所有控件的字体(TextView,Button,EditText,CheckBox,RadioButton等)
+     *
+     * @param context
+     * @param fontPath 需要修改style样式为monospace:
+     */
+//    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+//    <!-- Customize your theme here. -->
+//    <!-- Set system default typeface -->
+//    <item name="android:typeface">monospace</item>
+//    </style>
+    public static void replaceSystemDefaultFont( Context context,  String fontPath) {
+        replaceTypefaceField("MONOSPACE", createTypeface(context, fontPath));
+    }
+
+    /**
+     * <p>Replace field in class Typeface with reflection.</p>
+     */
+    private static void replaceTypefaceField(String fieldName, Object value) {
+        try {
+            Field defaultField = Typeface.class.getDeclaredField(fieldName);
+            defaultField.setAccessible(true);
+            defaultField.set(null, value);
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/gps_full_test_activity_96.xml b/app/src/main/res/layout/gps_full_test_activity_96.xml
new file mode 100644 (file)
index 0000000..4239c84
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".GPSActivity"
+    android:background="@color/colorIcBg">
+
+    <TextView
+        android:id="@+id/ic_lc_fix_name"
+        style="@style/IcTextStyle96"
+        android:text="@string/gps_full_title"
+        android:textSize="10sp" />
+
+    <TextView
+        android:id="@+id/ic_lc_fix_value"
+        style="@style/IcTextStyle96"
+        android:layout_marginStart="5dp"
+        android:layout_toEndOf="@id/ic_lc_fix_name"
+        android:textSize="10sp" />
+
+    <TextView
+        android:id="@+id/ic_lc_star_name"
+        style="@style/IcTextStyle96"
+        android:layout_below="@id/ic_lc_fix_name"
+        android:text="@string/gps_star_count"
+        android:textSize="10sp" />
+
+    <TextView
+        android:id="@+id/ic_lc_star_value"
+        style="@style/IcTextStyle96"
+        android:layout_below="@id/ic_lc_fix_name"
+        android:layout_marginStart="5dp"
+        android:layout_toEndOf="@id/ic_lc_star_name"
+        android:textSize="10sp" />
+
+    <TextView
+        android:id="@+id/ic_lc_hoop_name"
+        style="@style/IcTextStyle96"
+        android:layout_below="@id/ic_lc_star_name"
+        android:text="@string/gps_dop"
+        android:textSize="10sp" />
+
+    <TextView
+        android:id="@+id/ic_lc_hoop_value"
+        style="@style/IcTextStyle96"
+        android:layout_below="@id/ic_lc_star_name"
+        android:layout_marginStart="5dp"
+        android:layout_toEndOf="@id/ic_lc_hoop_name"
+        android:textSize="10sp" />
+
+
+
+    <TextView
+        android:id="@+id/ic_lc_searchCount"
+        style="@style/IcTextStyle96"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/ic_lc_hoop_name"
+        android:text="@string/gps_scan_time"
+        android:textSize="10sp" />
+
+    <TextView
+        android:id="@+id/ic_lc_searchCount_value"
+        style="@style/IcTextStyle96"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/ic_lc_hoop_name"
+        android:layout_marginStart="5dp"
+        android:layout_toEndOf="@id/ic_lc_searchCount"
+        android:textSize="10sp" />
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/app_list"
+        android:layout_below="@id/ic_lc_searchCount"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_snr_layout_96.xml b/app/src/main/res/layout/item_snr_layout_96.xml
new file mode 100644 (file)
index 0000000..6a0ce11
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mobile.miki.SnrHistogramView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/item_snr_view_96"
+    android:layout_width="15sp"
+    android:layout_height="match_parent"/>
\ No newline at end of file
index b2052f6..a1e3356 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>\r
-<resources xmlns:android="http://schemas.android.com/apk/res/android">\r
-    <style name="detail_title">\r
-        <item name="android:textAppearance">?android:textAppearanceMedium</item>\r
-        <item name="android:textColor">@drawable/black</item>\r
-        <item name="android:gravity">center</item>\r
-        <item name="android:layout_width">fill_parent</item>\r
-        <item name="android:layout_height">wrap_content</item>\r
-    </style>\r
-    <style name="detail_tab">\r
-        <item name="android:orientation">vertical</item>\r
-        <item name="android:background">@drawable/half_corner_bg</item>\r
-        <item name="android:layout_width">fill_parent</item>\r
-        <item name="android:layout_height">wrap_content</item>\r
-        <item name="android:layout_margin">2.0dip</item>\r
-    </style>\r
-    <style name="detail_line">\r
-        <item name="android:background">@color/gray</item>\r
-        <item name="android:layout_width">fill_parent</item>\r
-        <item name="android:layout_height">1.0dip</item>\r
-        <item name="android:layout_marginLeft">5.0dip</item>\r
-        <item name="android:layout_marginRight">5.0dip</item>\r
-    </style>\r
-    <style name="detail_tip">\r
-        <item name="android:textColor">@color/black</item>\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:layout_height">wrap_content</item>\r
-        <item name="android:layout_margin">5.0dip</item>\r
-    </style>\r
-    <style name="colon">\r
-        <item name="android:textColor">@color/black</item>\r
-        <item name="android:gravity">center</item>\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:layout_height">fill_parent</item>\r
-        <item name="android:text">@string/colon</item>\r
-    </style>\r
-    <style name="value">\r
-        <item name="android:textColor">@color/black</item>\r
-        <item name="android:gravity">center</item>\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:layout_height">fill_parent</item>\r
-    </style>\r
-    \r
-    <style name="table_item_style">\r
-        <item name="android:layout_width">match_parent</item>\r
-        <item name="android:layout_height">70dp</item>\r
-        <item name="android:layout_weight">1.0</item>\r
-        <item name="android:background">@drawable/button_common_white_bg</item>\r
-        <item name="android:clickable">true</item>\r
-        <item name="android:gravity">center</item>\r
-    </style>\r
-\r
-    <style name="table_item_small_style">\r
-        <item name="android:layout_width">match_parent</item>\r
-        <item name="android:layout_height">80dp</item>\r
-        <item name="android:layout_weight">1.0</item>\r
-        <item name="android:background">@drawable/button_common_white_bg</item>\r
-        <item name="android:clickable">true</item>\r
-        <item name="android:gravity">center</item>\r
-    </style>\r
-\r
-    <style name="layout_default_style">\r
-        <item name="android:layout_marginLeft">10dp</item>\r
-        <item name="android:layout_marginRight">10dp</item>\r
-        <item name="android:layout_marginTop">10dp</item>\r
-        <item name="android:layout_marginBottom">10dp</item>\r
-    </style>\r
-\r
-    <style name="layout_crowd_style">\r
-        <item name="android:layout_marginLeft">10dp</item>\r
-        <item name="android:layout_marginRight">10dp</item>\r
-        <item name="android:layout_marginTop">5dp</item>\r
-        <item name="android:layout_marginBottom">5dp</item>\r
-    </style>\r
-\r
-    <style name="layout_button_style">\r
-        <item name="android:layout_marginLeft">0dp</item>\r
-        <item name="android:layout_marginRight">0dp</item>\r
-        <item name="android:layout_marginTop">5dp</item>\r
-        <item name="android:layout_marginBottom">5dp</item>\r
-    </style>\r
-\r
-    <style name="category_title_style">\r
-        <item name="android:layout_height">wrap_content</item>\r
-        <item name="android:layout_width">match_parent</item>\r
-        <item name="android:background">@drawable/setting_title_bg</item>\r
-        <item name="android:gravity">center_vertical</item>\r
-        <item name="android:textStyle">bold</item>\r
-        <item name="android:paddingLeft">00dip</item>\r
-    </style>\r
-\r
-    <style name="title_text_style">\r
-        <item name="android:textSize">14sp</item>\r
-        <item name="android:textColor">@color/color_title</item>\r
-    </style>\r
-\r
-    <style name="title_text_medium_style">\r
-        <item name="android:textSize">16sp</item>\r
-        <item name="android:textColor">@color/color_title</item>\r
-    </style>\r
-    \r
-     <style name="title_text_large_style">\r
-        <item name="android:textSize">18sp</item>\r
-        <item name="android:textColor">@color/color_title</item>\r
-    </style>\r
-\r
-    <style name="content_text_style">\r
-        <item name="android:textSize">12.0sp</item>\r
-        <item name="android:textColor">@color/color_summery</item>\r
-    </style>\r
-\r
-    <style name="content_text_medium_style">\r
-        <item name="android:textSize">14.0sp</item>\r
-        <item name="android:textColor">@color/color_summery</item>\r
-    </style>\r
-\r
-    <style name="TextAppearance" parent="android:TextAppearance"></style>\r
-\r
-    <style name="info_label">\r
-        <item name="android:layout_height">wrap_content</item>\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>\r
-        <item name="android:textStyle">bold</item>\r
-        <item name="android:paddingRight">5dip</item>\r
-    </style>\r
-\r
-    <style name="info_value">\r
-        <item name="android:layout_height">wrap_content</item>\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>\r
-        <item name="android:textStyle">normal</item>\r
-    </style>\r
-\r
-    <style name="test_item_style">\r
-        <item name="android:layout_height">match_parent</item>\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:gravity">center</item>\r
-        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>\r
-        <item name="android:textSize">18sp</item>\r
-        <item name="android:textStyle">normal</item>\r
-    </style>\r
-\r
-    <style name="help_info_text_style">\r
-        <item name="android:textSize">16sp</item>\r
-        <item name="android:textColor">@color/color_summery</item>\r
-    </style>\r
-\r
-    <style name="button_white_text">\r
-        <item name="android:textSize">17.0sp</item>\r
-        <item name="android:textColor">@color/button_common_white_text</item>\r
-    </style>\r
-    \r
-    <style name="button_green_text">\r
-        <item name="android:textSize">17.0sp</item>\r
-        <item name="android:textColor">@color/button_common_green_text</item>\r
-    </style>\r
-    \r
-      <style name="DialogStyle" parent="android:Theme.Dialog">\r
-        <item name="android:windowBackground">@android:color/transparent</item>\r
-        <item name="android:windowFrame">@null</item>\r
-        <item name="android:windowNoTitle">true</item>\r
-        <item name="android:windowIsFloating">true</item>\r
-        <item name="android:windowIsTranslucent">true</item>\r
-        <item name="android:windowContentOverlay">@null</item>\r
-        <!-- 对话框是否有遮盖 -->\r
-        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>\r
-        <item name="android:backgroundDimEnabled">true</item>\r
-    </style>\r
-    \r
-      <style name="AppTheme" parent="AppBaseTheme">\r
-        <!-- All customizations that are NOT specific to a particular API-level can go here. -->\r
-        <item name="android:windowNoTitle">true</item>\r
-        <item name="android:windowTitleSize">0.0dip</item>\r
-        <item name="android:windowFullscreen">true</item>\r
-    </style>\r
-    \r
-       <style name="AppBaseTheme" parent="android:Theme.Light">\r
-        <!--\r
-            Theme customizations available in newer API levels can go in\r
-            res/values-vXX/styles.xml, while customizations related to\r
-            backward-compatibility can go here.\r
-        -->\r
-    </style>\r
-\r
-\r
-    <style name="IcTextStyle">\r
-        <item name="android:layout_width">wrap_content</item>\r
-        <item name="android:layout_height">wrap_content</item>\r
-        <item name="android:textColor">@color/colorIcTextView</item>\r
-        <item name="android:textSize">32sp</item>\r
-    </style>\r
-</resources>\r
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="detail_title">
+        <item name="android:textAppearance">?android:textAppearanceMedium</item>
+        <item name="android:textColor">@drawable/black</item>
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+    </style>
+    <style name="detail_tab">
+        <item name="android:orientation">vertical</item>
+        <item name="android:background">@drawable/half_corner_bg</item>
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_margin">2.0dip</item>
+    </style>
+    <style name="detail_line">
+        <item name="android:background">@color/gray</item>
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">1.0dip</item>
+        <item name="android:layout_marginLeft">5.0dip</item>
+        <item name="android:layout_marginRight">5.0dip</item>
+    </style>
+    <style name="detail_tip">
+        <item name="android:textColor">@color/black</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_margin">5.0dip</item>
+    </style>
+    <style name="colon">
+        <item name="android:textColor">@color/black</item>
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">fill_parent</item>
+        <item name="android:text">@string/colon</item>
+    </style>
+    <style name="value">
+        <item name="android:textColor">@color/black</item>
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">fill_parent</item>
+    </style>
+    
+    <style name="table_item_style">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">70dp</item>
+        <item name="android:layout_weight">1.0</item>
+        <item name="android:background">@drawable/button_common_white_bg</item>
+        <item name="android:clickable">true</item>
+        <item name="android:gravity">center</item>
+    </style>
+
+    <style name="table_item_small_style">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">80dp</item>
+        <item name="android:layout_weight">1.0</item>
+        <item name="android:background">@drawable/button_common_white_bg</item>
+        <item name="android:clickable">true</item>
+        <item name="android:gravity">center</item>
+    </style>
+
+    <style name="layout_default_style">
+        <item name="android:layout_marginLeft">10dp</item>
+        <item name="android:layout_marginRight">10dp</item>
+        <item name="android:layout_marginTop">10dp</item>
+        <item name="android:layout_marginBottom">10dp</item>
+    </style>
+
+    <style name="layout_crowd_style">
+        <item name="android:layout_marginLeft">10dp</item>
+        <item name="android:layout_marginRight">10dp</item>
+        <item name="android:layout_marginTop">5dp</item>
+        <item name="android:layout_marginBottom">5dp</item>
+    </style>
+
+    <style name="layout_button_style">
+        <item name="android:layout_marginLeft">0dp</item>
+        <item name="android:layout_marginRight">0dp</item>
+        <item name="android:layout_marginTop">5dp</item>
+        <item name="android:layout_marginBottom">5dp</item>
+    </style>
+
+    <style name="category_title_style">
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:background">@drawable/setting_title_bg</item>
+        <item name="android:gravity">center_vertical</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:paddingLeft">00dip</item>
+    </style>
+
+    <style name="title_text_style">
+        <item name="android:textSize">14sp</item>
+        <item name="android:textColor">@color/color_title</item>
+    </style>
+
+    <style name="title_text_medium_style">
+        <item name="android:textSize">16sp</item>
+        <item name="android:textColor">@color/color_title</item>
+    </style>
+    
+     <style name="title_text_large_style">
+        <item name="android:textSize">18sp</item>
+        <item name="android:textColor">@color/color_title</item>
+    </style>
+
+    <style name="content_text_style">
+        <item name="android:textSize">12.0sp</item>
+        <item name="android:textColor">@color/color_summery</item>
+    </style>
+
+    <style name="content_text_medium_style">
+        <item name="android:textSize">14.0sp</item>
+        <item name="android:textColor">@color/color_summery</item>
+    </style>
+
+    <style name="TextAppearance" parent="android:TextAppearance"></style>
+
+    <style name="info_label">
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+        <item name="android:textStyle">bold</item>
+        <item name="android:paddingRight">5dip</item>
+    </style>
+
+    <style name="info_value">
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="test_item_style">
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:gravity">center</item>
+        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+        <item name="android:textSize">18sp</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="help_info_text_style">
+        <item name="android:textSize">16sp</item>
+        <item name="android:textColor">@color/color_summery</item>
+    </style>
+
+    <style name="button_white_text">
+        <item name="android:textSize">17.0sp</item>
+        <item name="android:textColor">@color/button_common_white_text</item>
+    </style>
+    
+    <style name="button_green_text">
+        <item name="android:textSize">17.0sp</item>
+        <item name="android:textColor">@color/button_common_green_text</item>
+    </style>
+    
+      <style name="DialogStyle" parent="android:Theme.Dialog">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <!-- 对话框是否有遮盖 -->
+        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
+        <item name="android:backgroundDimEnabled">true</item>
+    </style>
+    
+      <style name="AppTheme" parent="AppBaseTheme">
+        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowTitleSize">0.0dip</item>
+        <item name="android:windowFullscreen">true</item>
+    </style>
+    
+       <style name="AppBaseTheme" parent="android:Theme.Light">
+        <!--
+            Theme customizations available in newer API levels can go in
+            res/values-vXX/styles.xml, while customizations related to
+            backward-compatibility can go here.
+        -->
+    </style>
+
+    <style name="IcTextStyle96">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textColor">@color/colorIcTextView</item>
+        <item name="android:textSize">20sp</item>
+    </style>
+    <style name="IcTextStyle">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textColor">@color/colorIcTextView</item>
+        <item name="android:textSize">32sp</item>
+    </style>
+</resources>
index 6bf5f99..722b533 100644 (file)
@@ -1,2 +1,2 @@
-#Mon Dec 21 21:29:58 CST 2020
-VERSION_CODE=58
+#Wed Dec 23 17:02:46 CST 2020
+VERSION_CODE=59