{\rtf1\ansi\ansicpg1252\cocoartf2761 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fmodern\fcharset0 Courier-Oblique;\f1\fmodern\fcharset0 Courier;} {\colortbl;\red255\green255\blue255;\red121\green121\blue121;\red0\green29\blue164;\red9\green9\blue9; \red140\green119\blue13;\red10\green79\blue103;\red114\green0\blue130;\red18\green51\blue230;\red17\green109\blue18; \red14\green108\blue119;} {\*\expandedcolortbl;;\csgenericrgb\c47451\c47451\c47451;\csgenericrgb\c0\c11373\c64314;\csgenericrgb\c3529\c3529\c3529; \csgenericrgb\c54902\c46667\c5098;\csgenericrgb\c3922\c30980\c40392;\csgenericrgb\c44706\c0\c50980;\csgenericrgb\c7059\c20000\c90196;\csgenericrgb\c6667\c42745\c7059; \csgenericrgb\c5490\c42353\c46667;} \paperw11900\paperh16840\margl1440\margr1440\vieww25920\viewh17380\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 \f0\i\fs26 \cf2 //\ // Source code recreated from a .class file by IntelliJ IDEA\ // (powered by FernFlower decompiler)\ //\ \ \f1\i0 \cf3 package \cf0 com.pax.log\cf4 ;\ \ \cf3 import \cf0 android.support.\cf4 annotation.Keep;\ \cf3 import \cf0 android.support.\cf4 annotation.NonNull;\ \cf3 import \cf0 java.io.PrintWriter\cf4 ;\ \cf3 import \cf0 java.io.StringWriter\cf4 ;\ \cf3 import \cf0 java.util.Iterator\cf4 ;\ \cf3 import \cf0 java.util.Locale\cf4 ;\ \ \cf5 @Keep\ \cf3 public class \cf0 LogUtils \cf4 \{\ \cf3 public \cf6 LogUtils\cf4 () \{\ \}\ \ \cf3 static \cf0 StackTraceElement \cf6 getCallerStackTraceElement\cf4 (\cf3 int \cf0 hierarchyLevel\cf4 ) \{\ \cf0 StackTraceElement\cf4 [] \cf0 callers\cf4 ;\ \cf3 return \cf4 (\cf0 callers \cf4 = (\cf3 new \cf4 Throwable()).getStackTrace())[\cf0 hierarchyLevel \cf4 < \cf0 callers\cf4 .\cf7 length \cf4 ? \cf0 hierarchyLevel \cf4 : \cf0 callers\cf4 .\cf7 length \cf4 - \cf8 1\cf4 ];\ \}\ \ \cf3 static \cf0 StackTraceElement \cf6 getCallerStackTraceElement\cf4 (\cf3 int \cf0 hierarchyLevel\cf4 , \cf0 b pool\cf4 ) \{\ \cf3 if \cf4 (\cf0 pool\cf4 .\cf7 A\cf4 .isEmpty()) \{\ \cf3 return \f0\i \cf4 getCallerStackTraceElement \f1\i0 (\cf0 hierarchyLevel \cf4 + \cf8 1\cf4 );\ \} \cf3 else \cf4 \{\ \cf0 StackTraceElement\cf4 [] \cf0 callers \cf4 = (\cf3 new \cf4 Throwable()).getStackTrace();\ \cf3 int \cf0 start \cf4 = \cf0 hierarchyLevel \cf4 < \cf0 callers\cf4 .\cf7 length \cf4 ? \cf0 hierarchyLevel \cf4 : \cf0 callers\cf4 .\cf7 length \cf4 - \cf8 1\cf4 ;\ \cf3 return \f0\i \cf4 getCaller \f1\i0 (\cf0 pool\cf4 , \cf0 callers\cf4 , \cf0 start\cf4 );\ \}\ \}\ \ \cf3 static \cf0 StackTraceElement \cf6 getCaller\cf4 (\cf0 b pool\cf4 , \cf0 StackTraceElement\cf4 [] \cf0 callers\cf4 , \cf3 int \cf0 start\cf4 ) \{\ \cf0 StackTraceElement targetStackTrace \cf4 = \cf3 null\cf4 ;\ \cf3 boolean \cf0 shouldTrace \cf4 = \cf3 false\cf4 ;\ \ \cf3 for\cf4 (\cf3 int \cf0 i \cf4 = \cf0 start\cf4 ; \cf0 i \cf4 < \cf0 callers\cf4 .\cf7 length\cf4 ; ++\cf0 i\cf4 ) \{\ \cf0 StackTraceElement caller \cf4 = \cf0 callers\cf4 [\cf0 i\cf4 ];\ \cf3 boolean \cf0 isLogMethod \cf4 = \cf3 false\cf4 ;\ \cf0 Iterator var8 \cf4 = \cf0 pool\cf4 .\cf7 A\cf4 .iterator();\ \ \cf3 while\cf4 (\cf0 var8\cf4 .hasNext()) \{\ \cf0 String className \cf4 = (\cf0 String\cf4 )\cf0 var8\cf4 .next();\ \cf3 if \cf4 (\cf0 caller\cf4 .getClassName().equals(\cf0 className\cf4 )) \{\ \cf0 isLogMethod \cf4 = \cf3 true\cf4 ;\ \cf3 break\cf4 ;\ \}\ \}\ \ \cf3 if \cf4 (\cf0 shouldTrace \cf4 && !\cf0 isLogMethod\cf4 ) \{\ \cf0 targetStackTrace \cf4 = \cf0 caller\cf4 ;\ \cf3 break\cf4 ;\ \}\ \ \cf0 shouldTrace \cf4 = \cf0 isLogMethod\cf4 ;\ \}\ \ \cf3 return \cf0 targetStackTrace\cf4 ;\ \}\ \ \cf3 static \cf0 String \cf6 formatCallerStackTrace\cf4 (\cf0 StackTraceElement caller\cf4 ) \{\ \cf0 String tag \cf4 = \cf9 "%s.%s(L:%d)"\cf4 ;\ \cf0 String var10000 \cf4 = \cf0 caller\cf4 .getClassName();\ \cf0 String callerClazzName \cf4 = \cf0 var10000\cf4 .substring(\cf0 var10000\cf4 .lastIndexOf(\cf9 "."\cf4 ) + \cf8 1\cf4 );\ \cf3 return \cf0 String\cf4 . \f0\i format \f1\i0 (\cf0 Locale\cf4 . \f0\i \cf7 ENGLISH \f1\i0 \cf4 , \cf0 tag\cf4 , \cf0 callerClazzName\cf4 , \cf0 caller\cf4 .getMethodName(), \cf0 caller\cf4 .getLineNumber());\ \}\ \ \cf3 static \cf0 String \cf6 generateTag\cf4 (\cf0 String tagPrefix\cf4 , \cf0 String customTag\cf4 , \cf0 StackTraceElement caller\cf4 ) \{\ \cf0 String tag \cf4 = \f0\i formatCallerStackTrace \f1\i0 (\cf0 caller\cf4 );\ \cf0 tag \cf4 = \f0\i isEmpty \f1\i0 (\cf0 customTag\cf4 ) ? \cf0 tag \cf4 : \cf0 customTag \cf4 + \cf9 " " \cf4 + \cf0 tag\cf4 ;\ \cf3 return \f0\i \cf4 isEmpty \f1\i0 (\cf0 tagPrefix\cf4 ) ? \cf0 tag \cf4 : \cf0 tagPrefix \cf4 + \cf9 " " \cf4 + \cf0 tag\cf4 ;\ \}\ \ \cf3 static \cf0 String \cf6 getStackTraceString\cf4 (\cf0 Throwable tr\cf4 ) \{\ \cf3 if \cf4 (\cf0 tr \cf4 == \cf3 null\cf4 ) \{\ \cf3 return \cf9 ""\cf4 ;\ \} \cf3 else \cf4 \{\ \cf0 StringWriter sw \cf4 = \cf3 new \cf4 StringWriter();\ \cf0 PrintWriter pw \cf4 = \cf3 new \cf4 PrintWriter(\cf0 sw\cf4 );\ \cf0 tr\cf4 .printStackTrace(\cf0 pw\cf4 );\ \cf0 pw\cf4 .close();\ \cf3 return \cf0 sw\cf4 .toString();\ \}\ \}\ \ \cf3 private static \cf4 <\cf10 T\cf4 > \cf0 Class\cf4 <\cf10 T\cf4 > \cf6 getClass\cf4 (\cf0 String className\cf4 ) \{\ \cf0 Class\cf4 <\cf10 T\cf4 > \cf0 clazz \cf4 = \cf3 null\cf4 ;\ \ \cf3 try \cf4 \{\ \cf0 clazz \cf4 = \cf0 Class\cf4 . \f0\i forName \f1\i0 (\cf0 className\cf4 );\ \} \cf3 catch \cf4 (\cf0 Exception var2\cf4 ) \{\ \}\ \ \cf3 return \cf0 clazz\cf4 ;\ \}\ \ \cf3 public static boolean \cf6 isEmpty\cf4 (\cf0 CharSequence str\cf4 ) \{\ \cf3 return \cf0 str \cf4 == \cf3 null \cf4 || \cf0 str\cf4 .length() == \cf8 0\cf4 ;\ \}\ \ \cf5 @NonNull\ \cf3 public static \cf0 String \cf6 getNonNullString\cf4 (\cf0 Object value\cf4 ) \{\ \cf3 if \cf4 (\cf0 value \cf3 instanceof \cf0 CharSequence\cf4 ) \{\ \cf0 CharSequence str\cf4 ;\ \cf3 return \f0\i \cf4 isEmpty \f1\i0 (\cf0 str \cf4 = (\cf0 CharSequence\cf4 )\cf0 value\cf4 ) ? \cf9 "" \cf4 : \cf0 str\cf4 .toString();\ \} \cf3 else \cf4 \{\ \cf3 return \cf0 value \cf4 == \cf3 null \cf4 ? \cf9 "" \cf4 : \cf0 String\cf4 . \f0\i valueOf \f1\i0 (\cf0 value\cf4 );\ \}\ \}\ \ \cf3 public static boolean \cf6 isAndroid\cf4 () \{\ \cf0 Class clazz \cf4 = \f0\i getClass \f1\i0 (\cf9 "android.os.Build$VERSION"\cf4 );\ \cf3 boolean \cf0 isAndroid \cf4 = \cf3 false\cf4 ;\ \cf3 if \cf4 (\cf0 clazz \cf4 != \cf3 null\cf4 ) \{\ \cf3 try \cf4 \{\ \cf0 isAndroid \cf4 = \cf0 clazz\cf4 .getDeclaredField(\cf9 "SDK_INT"\cf4 ).getInt((\cf0 Object\cf4 )\cf3 null\cf4 ) != \cf8 0\cf4 ;\ \} \cf3 catch \cf4 (\cf0 NoSuchFieldException \cf4 | \cf0 IllegalAccessException var2\cf4 ) \{\ \cf0 var2\cf4 .printStackTrace();\ \}\ \}\ \ \cf3 return \cf0 isAndroid\cf4 ;\ \}\ \}\ \ }