From 9304aa8ccbcdaf5999ed3ac81e49adbf1462cae9 Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Mon, 25 Feb 2019 20:58:19 +0800 Subject: [PATCH 001/239] see 02/25 log --- .../com/blankj/utilcode/util/http/Chain.java | 4 + .../utilcode/util/http/ExecutorFactory.java | 47 ++++ .../blankj/utilcode/util/http/HttpUtils.java | 232 ++++++++++++++++++ .../utilcode/util/http/Interceptor.java | 8 + .../blankj/utilcode/util/http/Request.java | 158 ++++++++++++ .../blankj/utilcode/util/http/Response.java | 54 ++++ .../utilcode/util/http/ResponseCallback.java | 14 ++ .../blankj/utilcode/util/http/SSLConfig.java | 188 ++++++++++++++ 8 files changed, 705 insertions(+) create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Chain.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ExecutorFactory.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Interceptor.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Response.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ResponseCallback.java create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/SSLConfig.java diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Chain.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Chain.java new file mode 100644 index 0000000000..86db4f8dbc --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Chain.java @@ -0,0 +1,4 @@ +package com.blankj.utilcode.util.http; + +public interface Chain { +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ExecutorFactory.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ExecutorFactory.java new file mode 100644 index 0000000000..b4ec9e240a --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ExecutorFactory.java @@ -0,0 +1,47 @@ +package com.blankj.utilcode.util.http; + +import android.os.Handler; +import android.os.Looper; +import android.support.annotation.NonNull; + +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +public final class ExecutorFactory { + + private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); + + private static final Executor DEFAULT_WORK_EXECUTOR = new ThreadPoolExecutor(2 * CPU_COUNT + 1, + 2 * CPU_COUNT + 1, + 30, TimeUnit.SECONDS, + new LinkedBlockingQueue(128), + new ThreadFactory() { + private final AtomicInteger mCount = new AtomicInteger(1); + + public Thread newThread(@NonNull Runnable r) { + return new Thread(r, "http-pool-" + mCount.getAndIncrement()); + } + } + ); + + private static final Executor DEFAULT_MAIN_EXECUTOR = new Executor() { + private final Handler mHandler = new Handler(Looper.getMainLooper()); + + @Override + public void execute(@NonNull Runnable command) { + mHandler.post(command); + } + }; + + public static Executor getDefaultWorkExecutor() { + return DEFAULT_WORK_EXECUTOR; + } + + public static Executor getDefaultMainExecutor() { + return DEFAULT_MAIN_EXECUTOR; + } +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java new file mode 100644 index 0000000000..5f07f9f67a --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java @@ -0,0 +1,232 @@ +package com.blankj.utilcode.util.http; + +import android.accounts.NetworkErrorException; +import android.support.annotation.NonNull; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.util.Map; +import java.util.concurrent.Executor; + +import javax.net.ssl.HttpsURLConnection; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/02/08
+ *     desc  : utils about http
+ * 
+ */ +public final class HttpUtils { + + private static final String BOUNDARY = java.util.UUID.randomUUID().toString(); + private static final String TWO_HYPHENS = "--"; + + private static final int CONNECT_TIMEOUT_TIME = 15000; + private static final int READ_TIMEOUT_TIME = 19000; + private static final int BUFFER_SIZE = 8192; + + private static final Config CONFIG = new Config(); + + + private final Config mConfig; + private static HttpUtils sHttpUtils; + + private HttpUtils(@NonNull Config config) { + mConfig = config; + } + + public static HttpUtils getInstance(@NonNull Config config) { + if (sHttpUtils == null) { + synchronized (HttpUtils.class) { + sHttpUtils = new HttpUtils(config); + } + } + return sHttpUtils; + } + + public static void call(@NonNull final Request request, @NonNull final ResponseCallback callback) { + new Call(request, callback).run(); + } + + private static HttpURLConnection getConnection(final Request request) throws IOException { + HttpURLConnection conn = (HttpURLConnection) request.mURL.openConnection(); + if (conn instanceof HttpsURLConnection) { + HttpsURLConnection httpsConn = (HttpsURLConnection) conn; + httpsConn.setSSLSocketFactory(CONFIG.sslConfig.mSSLSocketFactory); + httpsConn.setHostnameVerifier(CONFIG.sslConfig.mHostnameVerifier); + } + addHeader(conn, request.mHeader); + addBody(conn, request.mBody); + conn.setConnectTimeout(CONFIG.connectTimeout); + conn.setReadTimeout(CONFIG.readTimeout); + return conn; + } + + private static void addBody(HttpURLConnection conn, Request.Body body) throws IOException { + if (body == null) { + conn.setRequestMethod("GET"); + } else { + conn.setRequestMethod("POST"); + conn.setUseCaches(false); + conn.setDoOutput(true); + conn.setRequestProperty("content-type", body.mediaType); + if (body.length > 0) { + conn.setRequestProperty("content-length", String.valueOf(body.length)); + } + BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream(), 10240); + if (body.bis != null) { + byte[] buffer = new byte[10240]; + for (int len; (len = body.bis.read(buffer)) != -1; ) { + bos.write(buffer, 0, len); + } + bos.close(); + body.bis.close(); + } + } + } + + private static void addHeader(final HttpURLConnection conn, final Map headerMap) { + if (headerMap != null) { + for (String key : headerMap.keySet()) { + conn.setRequestProperty(key, headerMap.get(key)); + } + } + } + + private static boolean isSpace(final String s) { + if (s == null) return true; + for (int i = 0, len = s.length(); i < len; ++i) { + if (!Character.isWhitespace(s.charAt(i))) { + return false; + } + } + return true; + } + + static String is2String(final InputStream is, final String charset) { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[8192]; + try { + for (int len; (len = is.read(buffer)) != -1; ) { + result.write(buffer, 0, len); + } + return result.toString(charset); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + static boolean writeFileFromIS(final File file, + final InputStream is) { + if (!createOrExistsFile(file) || is == null) return false; + OutputStream os = null; + try { + os = new BufferedOutputStream(new FileOutputStream(file)); + byte data[] = new byte[8192]; + for (int len; (len = is.read(data)) != -1; ) { + os.write(data, 0, len); + } + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (os != null) { + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static boolean createOrExistsFile(final File file) { + if (file == null) return false; + if (file.exists()) return file.isFile(); + if (!createOrExistsDir(file.getParentFile())) return false; + try { + return file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + private static boolean createOrExistsDir(final File file) { + return file != null && (file.exists() ? file.isDirectory() : file.mkdirs()); + } + + public static class Config { + private int connectTimeout = CONNECT_TIMEOUT_TIME; + private int readTimeout = READ_TIMEOUT_TIME; + + private SSLConfig sslConfig = SSLConfig.DEFAULT_SSL_CONFIG; + private Executor workExecutor = ExecutorFactory.getDefaultWorkExecutor(); + private Executor mainExecutor = ExecutorFactory.getDefaultMainExecutor(); + private Proxy proxy = null; + } + + static class Call implements Runnable { + + private Request request; + private ResponseCallback callback; + + public Call(Request request, ResponseCallback callback) { + this.request = request; + this.callback = callback; + } + + @Override + public void run() { + HttpURLConnection conn = null; + try { + conn = getConnection(request); + int responseCode = conn.getResponseCode(); + if (responseCode == 200) { + InputStream is = conn.getInputStream(); + callback.onResponse(new Response(conn.getHeaderFields(), is)); + is.close(); + } else if (responseCode == 301 || responseCode == 302) { + String location = conn.getHeaderField("Location"); + call(request, callback); + } else { + String errorMsg = null; + InputStream es = conn.getErrorStream(); + if (es != null) { + errorMsg = is2String(es, "utf-8"); + } + callback.onFailed(new NetworkErrorException("error code: " + responseCode + + (isSpace(errorMsg) ? "" : ("\n" + "error message: " + errorMsg)))); + } + } catch (IOException e) { + callback.onFailed(e); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + } +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Interceptor.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Interceptor.java new file mode 100644 index 0000000000..1d7953c95f --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Interceptor.java @@ -0,0 +1,8 @@ +package com.blankj.utilcode.util.http; + +import java.io.IOException; + +public interface Interceptor { + + Response intercept(Chain chain) throws IOException; +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java new file mode 100644 index 0000000000..59f27494f6 --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java @@ -0,0 +1,158 @@ +package com.blankj.utilcode.util.http; + +import android.support.annotation.NonNull; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.util.HashMap; +import java.util.Map; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/02/17
+ * 
+ */ +public final class Request { + + String methodName; + URL mURL; + Map mHeader; + Body mBody; + + public static Request withUrl(@NonNull final String url) { + return new Request(url); + } + + private Request(final String url) { + try { + mURL = new URL(url); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + public Request addHeader(@NonNull final String name, @NonNull final String value) { + if (mHeader == null) { + mHeader = new HashMap<>(); + } + mHeader.put(name, value); + return this; + } + + public Request addHeader(@NonNull final Map header) { + if (this.mHeader == null) { + this.mHeader = new HashMap<>(); + } + this.mHeader.putAll(header); + return this; + } + + public Request post(@NonNull final Body body) { + this.mBody = body; + return this; + } + + public static class Body { + String mediaType; + BufferedInputStream bis; + long length; + + private Body(final String mediaType, final byte[] body) { + this.mediaType = mediaType; + bis = new BufferedInputStream(new ByteArrayInputStream(body)); + length = body.length; + } + + private Body(final String mediaType, final InputStream body) { + this.mediaType = mediaType; + if (body instanceof BufferedInputStream) { + bis = (BufferedInputStream) body; + } else { + bis = new BufferedInputStream(body); + } + length = -1; + } + + private static String getCharsetFromMediaType(String mediaType) { + mediaType = mediaType.toLowerCase().replace(" ", ""); + int index = mediaType.indexOf("charset="); + if (index == -1) return "utf-8"; + int st = index + 8; + int end = mediaType.length(); + if (st >= end) { + throw new IllegalArgumentException("MediaType is not correct: \"" + mediaType + "\""); + } + for (int i = st; i < end; i++) { + char c = mediaType.charAt(i); + if (c >= 'A' && c <= 'Z') continue; + if (c >= 'a' && c <= 'z') continue; + if (c >= '0' && c <= '9') continue; + if (c == '-' && i != 0) continue; + if (c == '+' && i != 0) continue; + if (c == ':' && i != 0) continue; + if (c == '_' && i != 0) continue; + if (c == '.' && i != 0) continue; + end = i; + break; + } + String charset = mediaType.substring(st, end); + return checkCharset(charset); + } + + public static Body create(@NonNull String mediaType, @NonNull byte[] content) { + return new Body(mediaType, content); + } + + public static Body form(@NonNull final Map form) { + return form(form, "utf-8"); + } + + public static Body form(@NonNull final Map form, String charset) { + String mediaType = "application/x-www-form-urlencoded;charset=" + checkCharset(charset); + final StringBuilder sb = new StringBuilder(); + for (String key : form.keySet()) { + if (sb.length() > 0) sb.append("&"); + sb.append(key).append("=").append(form.get(key)); + } + try { + return new Body(mediaType, sb.toString().getBytes(charset)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return null; + } + } + + public static Body json(@NonNull final String json) { + return json(json, "utf-8"); + } + + public static Body json(@NonNull final String json, String charset) { + String mediaType = "application/json;charset=" + checkCharset(charset); + try { + return new Body(mediaType, json.getBytes(charset)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return null; + } + } + +// public static RequestBody file(String mediaType, final File file) { +// +// return new RequestBody(mediaType, ); +// } + + } + + private static String checkCharset(final String charset) { + if (Charset.isSupported(charset)) return charset; + throw new IllegalCharsetNameException(charset); + } +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Response.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Response.java new file mode 100644 index 0000000000..8692ccee0a --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Response.java @@ -0,0 +1,54 @@ +package com.blankj.utilcode.util.http; + +import com.google.gson.Gson; + +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/02/17
+ * 
+ */ +public class Response { + private Map> mHeaders; + private InputStream mBody; + + public Response(Map> headers, InputStream body) { + mHeaders = headers; + mBody = body; + } + + public Map> getHeaders() { + return mHeaders; + } + + public InputStream getBody() { + return mBody; + } + + public String getString() { + return getString("utf-8"); + } + + public String getString(final String charset) { + return HttpUtils.is2String(mBody, charset); + } + + public T getJson(final Type type) { + return getJson(type, "utf-8"); + } + + public T getJson(final Type type, final String charset) { + return new Gson().fromJson(getString(charset), type); + } + + public boolean downloadFile(final File file) { + return HttpUtils.writeFileFromIS(file, mBody); + } +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ResponseCallback.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ResponseCallback.java new file mode 100644 index 0000000000..753b85093b --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/ResponseCallback.java @@ -0,0 +1,14 @@ +package com.blankj.utilcode.util.http; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/02/17
+ * 
+ */ +public abstract class ResponseCallback { + public abstract void onResponse(Response response); + + public abstract void onFailed(Exception e); +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/SSLConfig.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/SSLConfig.java new file mode 100644 index 0000000000..3741e9dc4f --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/SSLConfig.java @@ -0,0 +1,188 @@ +package com.blankj.utilcode.util.http; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.support.annotation.NonNull; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.security.GeneralSecurityException; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509ExtendedTrustManager; +import javax.net.ssl.X509TrustManager; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/02/20
+ * 
+ */ +public final class SSLConfig { + + SSLSocketFactory mSSLSocketFactory; + HostnameVerifier mHostnameVerifier; + + public SSLConfig(@NonNull SSLSocketFactory factory, @NonNull HostnameVerifier verifier) { + mSSLSocketFactory = factory; + mHostnameVerifier = verifier; + } + + public static final HostnameVerifier DEFAULT_VERIFIER = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + public static final SSLSocketFactory DEFAULT_SSL_SOCKET_FACTORY = new DefaultSSLSocketFactory(); + + public static final SSLConfig DEFAULT_SSL_CONFIG = new SSLConfig(DEFAULT_SSL_SOCKET_FACTORY, DEFAULT_VERIFIER); + + private static class DefaultSSLSocketFactory extends SSLSocketFactory { + + private static final String[] PROTOCOL_ARRAY; + private static final TrustManager[] DEFAULT_TRUST_MANAGERS; + + static { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + PROTOCOL_ARRAY = new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + PROTOCOL_ARRAY = new String[]{"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"}; + } else { + PROTOCOL_ARRAY = new String[]{"SSLv3", "TLSv1"}; + } + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + DEFAULT_TRUST_MANAGERS = new TrustManager[]{ + new X509ExtendedTrustManager() { + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { /**/ } + + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { /**/ } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType, Socket socket) { /**/ } + + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType, Socket socket) { /**/ } + + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType, SSLEngine engine) { /**/ } + + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType, SSLEngine engine) { /**/ } + } + }; + } else { + DEFAULT_TRUST_MANAGERS = new TrustManager[]{ + new X509TrustManager() { + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { /**/ } + + @SuppressLint("TrustAllX509TrustManager") + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { /**/ } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + } + }; + } + + } + + private SSLSocketFactory mFactory; + + DefaultSSLSocketFactory() { + try { + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, DEFAULT_TRUST_MANAGERS, new SecureRandom()); + mFactory = sslContext.getSocketFactory(); + } catch (GeneralSecurityException e) { + throw new AssertionError(); + } + } + + @Override + public String[] getDefaultCipherSuites() { + return mFactory.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return mFactory.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { + Socket ssl = mFactory.createSocket(s, host, port, autoClose); + setSupportProtocolAndCipherSuites(ssl); + return ssl; + } + + @Override + public Socket createSocket(String host, int port) throws IOException { + Socket ssl = mFactory.createSocket(host, port); + setSupportProtocolAndCipherSuites(ssl); + return ssl; + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { + Socket ssl = mFactory.createSocket(host, port, localHost, localPort); + setSupportProtocolAndCipherSuites(ssl); + return ssl; + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + Socket ssl = mFactory.createSocket(host, port); + setSupportProtocolAndCipherSuites(ssl); + return ssl; + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { + Socket ssl = mFactory.createSocket(address, port, localAddress, localPort); + setSupportProtocolAndCipherSuites(ssl); + return ssl; + } + + @Override + public Socket createSocket() throws IOException { + Socket ssl = mFactory.createSocket(); + setSupportProtocolAndCipherSuites(ssl); + return ssl; + } + + private void setSupportProtocolAndCipherSuites(Socket socket) { + if (socket instanceof SSLSocket) { + ((SSLSocket) socket).setEnabledProtocols(PROTOCOL_ARRAY); + } + } + } +} From 5c12b7379d19e544442841ddd30d86f99a35fcdd Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Tue, 26 Feb 2019 03:13:11 +0800 Subject: [PATCH 002/239] see 02/26 log --- .../blankj/utilcode/util/http/Headers.java | 13 ++ .../blankj/utilcode/util/http/HttpUtils.java | 19 +-- .../blankj/utilcode/util/http/Request.java | 1 - .../utilcode/util/http/HttpUtilsTest.java | 112 ++++++++++-------- 4 files changed, 86 insertions(+), 59 deletions(-) create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Headers.java diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Headers.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Headers.java new file mode 100644 index 0000000000..3e1007439a --- /dev/null +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Headers.java @@ -0,0 +1,13 @@ +package com.blankj.utilcode.util.http; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Headers { + + private Map> header = new HashMap<>(); + + + +} diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java index 5f07f9f67a..66e552f8d5 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/HttpUtils.java @@ -12,6 +12,7 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.Proxy; +import java.nio.charset.Charset; import java.util.Map; import java.util.concurrent.Executor; @@ -31,7 +32,7 @@ public final class HttpUtils { private static final String TWO_HYPHENS = "--"; private static final int CONNECT_TIMEOUT_TIME = 15000; - private static final int READ_TIMEOUT_TIME = 19000; + private static final int READ_TIMEOUT_TIME = 20000; private static final int BUFFER_SIZE = 8192; private static final Config CONFIG = new Config(); @@ -64,6 +65,7 @@ private static HttpURLConnection getConnection(final Request request) throws IOE httpsConn.setSSLSocketFactory(CONFIG.sslConfig.mSSLSocketFactory); httpsConn.setHostnameVerifier(CONFIG.sslConfig.mHostnameVerifier); } + System.out.println(conn.getHeaderField("USE")); addHeader(conn, request.mHeader); addBody(conn, request.mBody); conn.setConnectTimeout(CONFIG.connectTimeout); @@ -179,13 +181,16 @@ private static boolean createOrExistsDir(final File file) { } public static class Config { - private int connectTimeout = CONNECT_TIMEOUT_TIME; - private int readTimeout = READ_TIMEOUT_TIME; - private SSLConfig sslConfig = SSLConfig.DEFAULT_SSL_CONFIG; - private Executor workExecutor = ExecutorFactory.getDefaultWorkExecutor(); - private Executor mainExecutor = ExecutorFactory.getDefaultMainExecutor(); - private Proxy proxy = null; + private Executor workExecutor = ExecutorFactory.getDefaultWorkExecutor(); + private Executor mainExecutor = ExecutorFactory.getDefaultMainExecutor(); + + private SSLConfig sslConfig = SSLConfig.DEFAULT_SSL_CONFIG; + private int connectTimeout = CONNECT_TIMEOUT_TIME; + private int readTimeout = READ_TIMEOUT_TIME; + private Charset charset = Charset.defaultCharset(); + + private Proxy proxy = null; } static class Call implements Runnable { diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java index 59f27494f6..1661399e49 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/http/Request.java @@ -22,7 +22,6 @@ */ public final class Request { - String methodName; URL mURL; Map mHeader; Body mBody; diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/http/HttpUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/http/HttpUtilsTest.java index 46d9e0d203..8e79cfaf2b 100644 --- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/http/HttpUtilsTest.java +++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/http/HttpUtilsTest.java @@ -1,6 +1,16 @@ package com.blankj.utilcode.util.http; import com.blankj.utilcode.util.BaseTest; +import com.blankj.utilcode.util.FileIOUtils; +import com.blankj.utilcode.util.FileUtils; +import com.blankj.utilcode.util.GsonUtils; +import com.blankj.utilcode.util.TestConfig; +import com.blankj.utilcode.util.TimeUtils; + +import org.junit.Test; + +import java.io.File; +import java.util.List; /** *
@@ -14,56 +24,56 @@ public class HttpUtilsTest extends BaseTest {
 
     private static final String BASE_URL = "http://127.0.0.1:8081/";
 
-//    @Test
-//    public void getString() {
-//        HttpUtils.call(Request.withUrl(BASE_URL + "/listUsers"), new ResponseCallback() {
-//            @Override
-//            public void onResponse(Response response) {
-//                System.out.println(response.getHeaders());
-//                System.out.println(response.getString());
-//            }
-//
-//            @Override
-//            public void onFailed(Exception e) {
-//                e.printStackTrace();
-//            }
-//        });
-//    }
-//
-//    @Test
-//    public void getJson() {
-//        HttpUtils.call(Request.withUrl(BASE_URL + "/listUsers"), new ResponseCallback() {
-//            @Override
-//            public void onResponse(Response response) {
-//                System.out.println(response.getHeaders());
-//                List users = response.getJson(GsonUtils.getListType(UserBean.class));
-//                System.out.println(GsonUtils.toJson(users));
-//            }
-//
-//            @Override
-//            public void onFailed(Exception e) {
-//                e.printStackTrace();
-//            }
-//        });
-//    }
-//
-//    @Test
-//    public void downloadFile() {
-//        HttpUtils.call(Request.withUrl(BASE_URL + "/listUsers"), new ResponseCallback() {
-//            @Override
-//            public void onResponse(Response response) {
-//                System.out.println(response.getHeaders());
-//                File file = new File(TestConfig.PATH_HTTP + TimeUtils.getNowMills());
-//                response.downloadFile(file);
-//                System.out.println(FileIOUtils.readFile2String(file));
-//                FileUtils.delete(file);
-//            }
-//
-//            @Override
-//            public void onFailed(Exception e) {
-//                e.printStackTrace();
-//            }
-//        });
-//    }
+    @Test
+    public void getString() {
+        HttpUtils.call(Request.withUrl(BASE_URL + "/listUsers"), new ResponseCallback() {
+            @Override
+            public void onResponse(Response response) {
+                System.out.println(response.getHeaders());
+                System.out.println(response.getString());
+            }
+
+            @Override
+            public void onFailed(Exception e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
+    @Test
+    public void getJson() {
+        HttpUtils.call(Request.withUrl(BASE_URL + "/listUsers"), new ResponseCallback() {
+            @Override
+            public void onResponse(Response response) {
+                System.out.println(response.getHeaders());
+                List users = response.getJson(GsonUtils.getListType(UserBean.class));
+                System.out.println(GsonUtils.toJson(users));
+            }
+
+            @Override
+            public void onFailed(Exception e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
+    @Test
+    public void downloadFile() {
+        HttpUtils.call(Request.withUrl(BASE_URL + "/listUsers"), new ResponseCallback() {
+            @Override
+            public void onResponse(Response response) {
+                System.out.println(response.getHeaders());
+                File file = new File(TestConfig.PATH_HTTP + TimeUtils.getNowMills());
+                response.downloadFile(file);
+                System.out.println(FileIOUtils.readFile2String(file));
+                FileUtils.delete(file);
+            }
+
+            @Override
+            public void onFailed(Exception e) {
+                e.printStackTrace();
+            }
+        });
+    }
 
 }
\ No newline at end of file

From 1944e13b42b989c16a2cb1da760311f976819274 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 8 Mar 2019 10:57:53 +0800
Subject: [PATCH 003/239] see 03/08 log

---
 .../main/java/com/blankj/bus/BusInject.groovy |   2 +-
 .../main/java/com/blankj/bus/BusScan.groovy   |  77 +++--
 .../java/com/blankj/bus/BusTransform.groovy   |   4 +-
 .../com/blankj/util/JavassistUtils.groovy     |   7 +
 .../com/blankj/utilcode/util/BusUtils.java    |   2 +
 .../java/com/blankj/bus/BusScanTest.groovy    |  15 +
 .../src/test/java/com/blankj/bus/BusTest.java |  18 +-
 .../com/blankj/launcher/pkg/MainActivity.kt   |   4 +-
 .../com/blankj/lib/base/BaseApplication.kt    |   4 +-
 utilcode/lib/src/main/AndroidManifest.xml     |   9 +-
 .../com/blankj/utilcode/util/BusUtils.java    | 166 ++++++----
 .../blankj/utilcode/util/MessengerUtils.java  | 289 ++++++++++++++++++
 utilcode/pkg/src/main/AndroidManifest.xml     |   3 +-
 13 files changed, 483 insertions(+), 117 deletions(-)
 create mode 100644 bus-gradle-plugin/src/test/java/com/blankj/bus/BusScanTest.groovy
 create mode 100644 utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java

diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy
index 98316776d5..3d7a3b69fe 100755
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy
+++ b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusInject.groovy
@@ -15,7 +15,7 @@ class BusInject {
         File decompressedJar = new File(decompressedJarPath)
         ZipUtils.unzipFile(busJar, decompressedJar)
 
-        CtClass busUtils = JavassistUtils.getPool().get(Config.BUS_UTILS_CLASS)
+        CtClass busUtils = JavassistUtils.getClass(Config.BUS_UTILS_CLASS)
         CtMethod callMethod;
         try {
             callMethod = busUtils.getDeclaredMethod("injectShell");
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
index 111686cda3..b815f7965f 100755
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
+++ b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
@@ -15,11 +15,13 @@ import java.lang.reflect.Modifier
 
 class BusScan {
 
+    HashMap busStaticMap
     HashMap busMap
     List scans
     File busJar
 
     BusScan() {
+        busStaticMap = [:]
         busMap = [:]
         scans = []
     }
@@ -34,42 +36,44 @@ class BusScan {
     }
 
     void scanDir(File root) {
+        if (!root.isDirectory()) return
         String rootPath = root.getAbsolutePath()
         if (!rootPath.endsWith(Config.FILE_SEP)) {
             rootPath += Config.FILE_SEP
         }
 
-        if (root.isDirectory()) {
-            root.eachFileRecurse(FileType.FILES) { File file ->
-                def fileName = file.name
-                if (!fileName.endsWith('.class')
-                        || fileName.startsWith('R$')
-                        || fileName == 'R.class'
-                        || fileName == 'BuildConfig.class') {
-                    return
-                }
+        root.eachFileRecurse(FileType.FILES) { File file ->
+            def fileName = file.name
+            if (!fileName.endsWith('.class')
+                    || fileName.startsWith('R$')
+                    || fileName == 'R.class'
+                    || fileName == 'BuildConfig.class') {
+                return
+            }
 
-                def filePath = file.absolutePath
-                def packagePath = filePath.replace(rootPath, '')
-                def className = packagePath.replace(Config.FILE_SEP, ".")
-                // delete .class
-                className = className.substring(0, className.length() - 6)
+            def filePath = file.absolutePath
+            def packagePath = filePath.replace(rootPath, '')
+            def className = packagePath.replace(Config.FILE_SEP, ".")
+            // delete .class
+            className = className.substring(0, className.length() - 6)
 
-                CtClass ctClass = JavassistUtils.getPool().get(className)
-                CtMethod[] methods = ctClass.getMethods();
-                for (CtMethod method : methods) {
-                    if (method.hasAnnotation(BusUtils.Subscribe.class)) {
-                        String name = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).name();
-                        if (busMap.containsKey(name)) {
-                            LogUtils.l("bus of " + name + " has registered: " + method.getLongName());
-                            continue;
-                        }
-                        String methodLongName = method.getLongName();
-                        if (Modifier.isStatic(method.getModifiers())) {
-                            String sign = method.getReturnType().getName() + ' ' + methodLongName;
-                            busMap.put(name, sign);
-                        } else {// may be is kotlin
-                            processKt(method, name, methodLongName)
+            CtClass ctClass = JavassistUtils.getClass(className)
+            CtMethod[] methods = ctClass.getMethods();
+            for (CtMethod method : methods) {
+                if (method.hasAnnotation(BusUtils.Subscribe.class)) {
+                    String name = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).name();
+                    if (busStaticMap.containsKey(name)) {
+                        LogUtils.l("bus of " + name + " has registered: " + method.getLongName());
+                        continue;
+                    }
+                    String methodLongName = method.getLongName();
+                    if (Modifier.isStatic(method.getModifiers())) {
+                        String sign = method.getReturnType().getName() + ' ' + methodLongName;
+                        busStaticMap.put(name, sign);
+                    } else {// may be is kotlin
+                        if (!processKt(method, name, methodLongName)) {
+                            int priority = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).priority();
+                            processEventBus(method, name, methodLongName);
                         }
                     }
                 }
@@ -77,7 +81,7 @@ class BusScan {
         }
     }
 
-    private void processKt(CtMethod method, String name, String longMethodName) {
+    private boolean processKt(CtMethod method, String name, String longMethodName) {
         CtClass ktClass = method.getDeclaringClass();
         try {
             CtField instance = ktClass.getField("INSTANCE");
@@ -89,19 +93,21 @@ class BusScan {
                           longMethodName.substring(0, j) +
                           ".INSTANCE" +
                           longMethodName.substring(j);
-            busMap.put(name, sign);
+            busStaticMap.put(name, sign);
+            return true
         } catch (NotFoundException ignore) {
             String innerClassSimpleName = ktClass.getSimpleName();
             if (innerClassSimpleName.contains('$') && !innerClassSimpleName.endsWith('$')) {
                 String innerClassName = ktClass.getName();
                 String outerClassName = innerClassName.substring(0, innerClassName.lastIndexOf('$'));
-                CtClass outerClass = JavassistUtils.getPool().get(outerClassName);
+                CtClass outerClass = JavassistUtils.getClass(outerClassName);
                 try {
                     CtField ctField = outerClass.getField(innerClassSimpleName.substring(innerClassSimpleName.lastIndexOf('$') + 1));
                     String fieldName = ctField.getName();
                     String methodName = longMethodName.replace('$' + fieldName, '.' + fieldName);
                     String sign = method.getReturnType().getName() + ' ' + methodName;
-                    busMap.put(name, sign);
+                    busStaticMap.put(name, sign);
+                    return true
                 } catch (NotFoundException ignored) {
                     LogUtils.l(longMethodName + "is not static");
                 }
@@ -109,5 +115,10 @@ class BusScan {
                 LogUtils.l(longMethodName + "is not static");
             }
         }
+        return false
+    }
+
+    private boolean processEventBus(CtMethod method, String name, String longMethodName) {
+
     }
 }
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
index 25db789307..9dc927468c 100755
--- a/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
+++ b/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
@@ -105,10 +105,10 @@ class BusTransform extends Transform {
 
         if (busScan.busJar != null) {
             File jsonFile = new File(mProject.projectDir.getAbsolutePath(), "__bus__.json")
-            String busJson = JsonUtils.getFormatJson(busScan.busMap)
+            String busJson = JsonUtils.getFormatJson(busScan.busStaticMap)
             LogUtils.l(jsonFile.toString() + ": " + busJson)
             FileUtils.write(jsonFile, busJson)
-            BusInject.start(busScan.busMap, busScan.busJar)
+            BusInject.start(busScan.busStaticMap, busScan.busJar)
         } else {
             LogUtils.l('u should ')
         }
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy b/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy
index 00c8771f70..9bf95e8314 100644
--- a/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy
+++ b/bus-gradle-plugin/src/main/java/com/blankj/util/JavassistUtils.groovy
@@ -1,6 +1,7 @@
 package com.blankj.util
 
 import javassist.ClassPool
+import javassist.CtClass
 import org.gradle.api.Project;
 
 /**
@@ -26,4 +27,10 @@ class JavassistUtils {
     static ClassPool getPool() {
         return sPool
     }
+
+    static CtClass getClass(String classname) {
+        def ctClass = sPool.getCtClass(classname)
+        if (ctClass.isFrozen()) ctClass.defrost()
+        return ctClass
+    }
 }
diff --git a/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java b/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java
index 507919ff49..e907c3f47c 100755
--- a/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ b/bus-gradle-plugin/src/main/java/com/blankj/utilcode/util/BusUtils.java
@@ -11,5 +11,7 @@ public final class BusUtils {
     @Retention(RetentionPolicy.CLASS)
     public @interface Subscribe {
         String name() default "";
+
+        int priority() default 0;
     }
 }
\ No newline at end of file
diff --git a/bus-gradle-plugin/src/test/java/com/blankj/bus/BusScanTest.groovy b/bus-gradle-plugin/src/test/java/com/blankj/bus/BusScanTest.groovy
new file mode 100644
index 0000000000..209bdff3c1
--- /dev/null
+++ b/bus-gradle-plugin/src/test/java/com/blankj/bus/BusScanTest.groovy
@@ -0,0 +1,15 @@
+package com.blankj.bus
+
+/**
+ * 
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/03/02
+ *     desc  : 
+ * 
+ */ +class BusScanTest extends GroovyTestCase { + void testScanDir() { + println "haha" + } +} diff --git a/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java b/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java index 9f7ef5828d..3a259b05f5 100755 --- a/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java +++ b/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java @@ -19,7 +19,7 @@ public class BusTest { // mPool.appendSystemPath(); // mPool.appendClassPath(rootPath); // mPool.appendClassPath("/Users/blankj/Library/Android/sdk/platforms/android-27/android.jar"); -// HashMap busMap = new HashMap<>(); +// HashMap busStaticMap = new HashMap<>(); // if (root.isDirectory()) { // Collection files = FileUtils.listFiles(root, new String[]{"class"}, true); // @@ -38,21 +38,21 @@ public class BusTest { // for (CtMethod method : methods) { // if (method.hasAnnotation(BusUtils.Subscribe.class)) { // String name = ((BusUtils.Subscribe) method.getAnnotation(BusUtils.Subscribe.class)).name(); -// if (busMap.containsKey(name)) { +// if (busStaticMap.containsKey(name)) { // System.out.println("bus of " + name + " has registered." + method.getLongName()); // continue; // } // String longMethodName = method.getLongName(); // if (Modifier.isStatic(method.getModifiers())) { // String sign = method.getReturnType().getName() + ' ' + longMethodName; -// busMap.put(name, sign); +// busStaticMap.put(name, sign); // } else {// may be is kotlin -// processKt(mPool, busMap, method, name, longMethodName); +// processKt(mPool, busStaticMap, method, name, longMethodName); // } // } // } // } -// System.out.println(JsonUtils.getFormatJson(busMap)); +// System.out.println(JsonUtils.getFormatJson(busStaticMap)); // } // CtClass ctClass = mPool.makeClass("com.blankj.bus.BusUtils"); // @@ -64,13 +64,13 @@ public class BusTest { // // CtMethod make = CtNewMethod.make(src, ctClass); // ctClass.addMethod(make); -// make.insertAfter(getInsertContent(busMap)); +// make.insertAfter(getInsertContent(busStaticMap)); // ctClass.debugWriteFile(); // // } // // private void processKt(ClassPool mPool, -// HashMap busMap, +// HashMap busStaticMap, // CtMethod method, String name, // String longMethodName) throws NotFoundException { // CtClass innerClass = method.getDeclaringClass(); @@ -85,7 +85,7 @@ public class BusTest { // + ".INSTANCE" // + longMethodName.substring(j); // System.out.println(sign); -// busMap.put(name, sign); +// busStaticMap.put(name, sign); // } catch (NotFoundException ignore) { // String innerClassSimpleName = innerClass.getSimpleName(); // if (innerClassSimpleName.contains("$") && !innerClassSimpleName.endsWith("$")) { @@ -97,7 +97,7 @@ public class BusTest { // String fieldName = ctField.getName(); // String methodName = longMethodName.replace("$" + fieldName, "." + fieldName); // String sign = method.getReturnType().getName() + ' ' + methodName; -// busMap.put(name, sign); +// busStaticMap.put(name, sign); // } catch (NotFoundException e) { // System.out.println(longMethodName + "is not static"); // } diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt index 27d29a032a..99e114d2ac 100644 --- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt +++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt @@ -45,11 +45,11 @@ class MainActivity : BaseDrawerActivity() { BarUtils.addMarginTopEqualStatusBarHeight(launcherMainToolbar) launcherMainCoreUtilBtn.setOnClickListener { - BusUtils.post("CoreUtilActivity#start", this) + BusUtils.postStatic("CoreUtilActivity#start", this) } launcherMainSubUtilBtn.setOnClickListener { - BusUtils.post("SubUtilActivity#start", this) + BusUtils.postStatic("SubUtilActivity#start", this) } } diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt index f29fddfc59..1d48faed47 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt @@ -6,6 +6,7 @@ import android.support.multidex.MultiDex import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.CrashUtils import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.MessengerUtils import com.squareup.leakcanary.LeakCanary /** @@ -35,6 +36,7 @@ open class BaseApplication : Application() { initLeakCanary() initLog() initCrash() + MessengerUtils.init() } private fun initLeakCanary() {// 内存泄露检查工具 @@ -73,7 +75,7 @@ open class BaseApplication : Application() { return "LogUtils Formatter ArrayList { " + list.toString() + " }" } }) - LogUtils.d(config.toString()) + LogUtils.file(config.toString()) } private fun initCrash() { diff --git a/utilcode/lib/src/main/AndroidManifest.xml b/utilcode/lib/src/main/AndroidManifest.xml index bf147f357b..6d94025eef 100644 --- a/utilcode/lib/src/main/AndroidManifest.xml +++ b/utilcode/lib/src/main/AndroidManifest.xml @@ -12,12 +12,19 @@ + + + + + + \ No newline at end of file diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java index 83beb409c7..8a06cb6615 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java @@ -1,12 +1,18 @@ package com.blankj.utilcode.util; +import android.support.annotation.NonNull; import android.util.Log; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; /** *
@@ -20,13 +26,16 @@
  */
 public final class BusUtils {
 
-    private static final Object NULL = new Object();
+    private static final Object                  NULL            = new Object();
+    private static final Map> SUBSCRIBERS_MAP = new HashMap<>();
+    private static final Map>   BUSES_MAP       = new HashMap<>();
+    private static final Set             STICKIES        = new HashSet<>();
 
-    public static  T post(final String name, final Object... objects) {
+    public static  T postStatic(final String name, final Object... objects) {
         if (name == null || name.length() == 0) return null;
         Object o = injectShell(name, objects);
         if (NULL.equals(o)) {
-            Log.e("BusUtils", "bus of <" + name + "> didn\'t exist.");
+            Log.e("BusUtils", "static bus of <" + name + "> didn\'t exist.");
             return null;
         }
         return (T) o;
@@ -36,6 +45,66 @@ private static Object injectShell(final String name, final Object[] objects) {
         return NULL;
     }
 
+
+    public static void register(final Object subscriber) {
+        if (subscriber == null) return;
+        Class aClass = subscriber.getClass();
+        Set typeSubscribers = SUBSCRIBERS_MAP.get(aClass);
+        if (typeSubscribers == null) {
+            typeSubscribers = new HashSet<>();
+            SUBSCRIBERS_MAP.put(aClass, typeSubscribers);
+        }
+        typeSubscribers.add(subscriber);
+    }
+
+//    public static void postSticky(final String name, final Object... objects) {
+//        STICKIES.add(new Sticky(name, objects));
+//        post(name, objects);
+//    }
+//
+//    public static void removeSticky(final String name) {
+//
+//    }
+
+    public static void post(final String name, final Object... objects) {
+        if (name == null || name.length() == 0) return;
+        final Set buses = BUSES_MAP.get(name);
+        for (Bus bus : buses) {
+            Set subscribers = SUBSCRIBERS_MAP.get(bus.type);
+            if (subscribers == null || subscribers.isEmpty()) {
+                Log.e("BusUtils", "bus of <" + name + "{" + bus + "}> in didn\'t exist.");
+                continue;
+            }
+            for (Object subscriber : subscribers) {
+                injectShell2(subscriber, name, objects);
+            }
+        }
+    }
+
+    private static void injectShell2(final Object subscriber, final String name, final Object[] objects) {
+
+    }
+
+    public static void unregister(final Object subscriber) {
+        if (subscriber == null) return;
+        Class aClass = subscriber.getClass();
+        Set typeSubscribers = SUBSCRIBERS_MAP.get(aClass);
+        if (typeSubscribers == null || typeSubscribers.contains(subscriber)) {
+            Log.i("BusUtils", "Subscriber to unregister was not registered before: " + subscriber);
+            return;
+        }
+        typeSubscribers.remove(subscriber);
+    }
+
+    private static void add(final String name, final Class type, final int priority) {
+        Set buses = BUSES_MAP.get(name);
+        if (buses == null) {
+            buses = new TreeSet<>();
+            BUSES_MAP.put(name, buses);
+        }
+        buses.add(new Bus(type, priority));
+    }
+
     @Target({ElementType.METHOD})
     @Retention(RetentionPolicy.CLASS)
     public @interface Subscribe {
@@ -44,72 +113,35 @@ private static Object injectShell(final String name, final Object[] objects) {
         int priority() default 0;
     }
 
-//    private static final Map> BUSES = new ConcurrentHashMap<>();
+    static class Sticky {
+        String   name;
+        Object[] params;
 
-//    public static void register(final Object bus) {
-//        Class c = null;
-//        if (bus.getClass().equals(c)) {
-//
-//        }
-//    }
+        Sticky(String name, Object[] params) {
+            this.name = name;
+            this.params = params;
+        }
+    }
 
-//    public static void unregister(final Object bus) {
-//        if (bus == null) return;
-//        Class busClass = bus.getClass();
-//        if (BUSES.containsKey(busClass)) {
-//
-//        }
-//    }
+    static class Bus implements Comparable {
 
-//    private static Object inject(final String name, int priority ){
-//        if (!BUSES.containsKey(name)) return NULL;
-//        TreeSet buses = BUSES.get(name);
-//        for (Bus bus : buses) {
-//            bus.
-//        }
-//        return NULL;
-//    }
+        private Class type;
+        private int   priority;
 
-//    static class Bus implements Comparable {
-//
-//        TreeMap mTreeMap;
-//
-//        Bus(Object object) {
-//            this(object, 0);
-//        }
-//
-//        Bus(Object object, int priority) {
-//            mTreeMap = new TreeMap<>();
-//            this.priority = priority;
-//        }
-//
-//        @Override
-//        public int compareTo(@NonNull Bus o) {
-//            return (this.priority < o.priority) ? 1 : ((this.priority == o.priority) ? 0 : -1);
-//        }
-//
-//        @Override
-//        public boolean equals(Object obj) {
-//            return ObjectUtils.equals(this, obj);
-//        }
-//
-//        @Override
-//        public String toString() {
-//            return mObject.toString() + ": " + priority;
-//        }
-//    }
-//
-//    public static void main(String[] args) {
-//        TreeSet queue = new TreeSet<>();
-//        Bus bus0 = new Bus("", 1);
-//        Bus bus1 = new Bus("", 2);
-//        Bus bus2 = new Bus("", 3);
-//        Bus bus3 = new Bus("", 3);
-//        queue.add(bus1);
-//        queue.add(bus2);
-//        queue.add(bus0);
-//
-//        System.out.println(queue);
-//
-//    }
+        Bus(Class type, int priority) {
+            this.type = type;
+            this.priority = priority;
+        }
+
+        @Override
+        public int compareTo(@NonNull Bus o) {
+            if (o.priority != this.priority) return o.priority - this.priority;
+            return o.hashCode() - type.hashCode();
+        }
+
+        @Override
+        public String toString() {
+            return type.getName() + ": " + priority;
+        }
+    }
 }
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
new file mode 100644
index 0000000000..4d6c750d50
--- /dev/null
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
@@ -0,0 +1,289 @@
+package com.blankj.utilcode.util;
+
+import android.annotation.SuppressLint;
+import android.app.ActivityManager;
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/03/04
+ *     desc  :
+ * 
+ */ +public class MessengerUtils { + + private static ConcurrentHashMap subscribers = new ConcurrentHashMap<>(); + + private static List sClients = new ArrayList<>(); + private static Client sLocalClient; + + private static final int SUBSCRIBE = 1; + private static final int UNSUBSCRIBE = -1; + private static final int SEND_MSG_TO_TARGET = 2; + private static final String KEY_STRING = "MESSENGER_UTILS"; + + public static void init() { + if (isMainProcess()) { + LogUtils.e(); + Intent intent = new Intent(Utils.getApp(), ServerService.class); + Utils.getApp().startService(intent); + } else { + LogUtils.e(); + registerClient(); + } + } + + public static void registerClient() { + Client client = new Client(null); + if (client.bind()) { + sLocalClient = client; + } else { + LogUtils.e("bind service failed."); + } + } + + public static void unregisterClient() { + if (sLocalClient != null) { + sLocalClient.unbind(); + } + } + + public static void subscribe(String key, MessageCallback callback) { + subscribers.put(key, callback); + } + + public static void unsubscribe(String key) { + subscribers.remove(key); + } + + public static void post(@NonNull String key, @NonNull Bundle data) { + data.putString(KEY_STRING, key); + if (sLocalClient != null) { + sLocalClient.sendMsg(data); + } else { + Intent intent = new Intent(Utils.getApp(), ServerService.class); + intent.putExtras(data); + Utils.getApp().startService(intent); + } +// if (otherAppClient != null) { +// otherAppClient.sendMsg(data); +// } + } + + + public static void onMsgReceive(Bundle bundle) { + + } + + private static boolean isMainProcess() { + return Utils.getApp().getPackageName().equals(getCurrentProcessName()); + } + + private static String getCurrentProcessName() { + ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE); + //noinspection ConstantConditions + List info = am.getRunningAppProcesses(); + if (info == null || info.size() == 0) return ""; + int pid = android.os.Process.myPid(); + for (ActivityManager.RunningAppProcessInfo aInfo : info) { + if (aInfo.pid == pid) { + if (aInfo.processName != null) { + return aInfo.processName; + } + } + } + return ""; + } + + static class Client { + + String mPkgName; + Messenger mServer; + LinkedList mCached = new LinkedList<>(); + @SuppressLint("HandlerLeak") + Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + Bundle data = msg.getData(); + if (data != null) { + String key = data.getString(KEY_STRING); + if (key != null) { + MessageCallback messageCallback = subscribers.get(key); + if (messageCallback != null) { + messageCallback.onMsgCallBack(data); + } + } + } + } + }; + Messenger mClient = new Messenger(mHandler); + ServiceConnection mConn = new ServiceConnection() { + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + LogUtils.d("client service connected", name); + mServer = new Messenger(service); + int key = getCurrentProcessName().hashCode(); + Message subscribeMsg = Message.obtain(mHandler, SUBSCRIBE, key, 0); + subscribeMsg.replyTo = mClient; + try { + mServer.send(subscribeMsg); + } catch (RemoteException e) { + e.printStackTrace(); + } + sendCachedMsg(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + LogUtils.d("client service disconnected", name); + mServer = null; +// connect(); + } + }; + + Client(String pkgName) { + this.mPkgName = pkgName; + } + + boolean bind() { + Intent intent; + if (TextUtils.isEmpty(mPkgName)) { + intent = new Intent(Utils.getApp(), ServerService.class); + } else { + intent = new Intent(mPkgName + ".messenger"); + intent.setPackage(mPkgName); + } + return Utils.getApp().bindService(intent, mConn, Context.BIND_AUTO_CREATE); + } + + void unbind() { + Utils.getApp().unbindService(mConn); + } + + void sendMsg(Bundle bundle) { + if (mServer != null) { + sendCachedMsg(); + Message msg = Message.obtain(mHandler, SEND_MSG_TO_TARGET); + msg.setData(bundle); + msg.replyTo = mClient; + try { + mServer.send(msg); + } catch (RemoteException e) { + e.printStackTrace(); + } + } else { + mCached.addFirst(bundle); + } + } + + private void sendCachedMsg() { + for (int i = mCached.size() - 1; i >= 0; i--) { + sendMsg(mCached.get(i)); + mCached.remove(i); + } + } + } + + public static class ServerService extends Service { + + private final ConcurrentHashMap messengerMap = new ConcurrentHashMap<>(); + + @SuppressLint("HandlerLeak") + private final Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + LogUtils.e(msg.toString()); + int key = msg.arg1; + switch (msg.what) { + case SUBSCRIBE: + messengerMap.put(key, msg.replyTo); + break; + case SEND_MSG_TO_TARGET: + sendMsg(msg); + break; + case UNSUBSCRIBE: + messengerMap.remove(key); + break; + default: + super.handleMessage(msg); + } + } + }; + + private final Messenger messenger = new Messenger(handler); + + @Nullable + @Override + public IBinder onBind(Intent intent) { + LogUtils.e(); + return messenger.getBinder(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + LogUtils.e(intent); + if (intent != null) { + Bundle extras = intent.getExtras(); + if (extras != null) { + Message message = Message.obtain(handler, SEND_MSG_TO_TARGET); + message.replyTo = messenger; + message.setData(extras); + sendMsg(message); + } + } + return START_NOT_STICKY; + } + + private void sendMsg(Message msg) { + try { + Message msgToClient = Message.obtain(msg); + for (Messenger messenger : messengerMap.values()) { + if (messenger != null) { + Message m = new Message(); + m.copyFrom(msgToClient); + messenger.send(m); + } + } + Message m = new Message(); + m.copyFrom(msgToClient); + Bundle data = msg.getData(); + if (data != null) { + String key = data.getString(KEY_STRING); + if (key != null) { + MessageCallback messageCallback = subscribers.get(key); + if (messageCallback != null) { + messageCallback.onMsgCallBack(data); + } + } + } + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public interface MessageCallback { + void onMsgCallBack(Bundle data); + } +} diff --git a/utilcode/pkg/src/main/AndroidManifest.xml b/utilcode/pkg/src/main/AndroidManifest.xml index 976e3866e7..211f824410 100644 --- a/utilcode/pkg/src/main/AndroidManifest.xml +++ b/utilcode/pkg/src/main/AndroidManifest.xml @@ -38,7 +38,8 @@ + android:launchMode="singleTop" + android:process=":remote" /> Date: Fri, 8 Mar 2019 17:46:44 +0800 Subject: [PATCH 004/239] see 03/08 log --- CHANGELOG.md | 1 + config.gradle | 17 ++++++------- gradle.properties | 4 ++- .../com/blankj/launcher/pkg/MainActivity.kt | 2 +- .../pkg/src/main/res/layout/activity_main.xml | 18 ++++++------- lib/base/build.gradle | 6 ++--- .../java/com/blankj/lib/base/BaseActivity.kt | 2 +- .../com/blankj/lib/base/BaseApplication.kt | 2 +- .../com/blankj/lib/base/BaseDrawerActivity.kt | 6 ++--- .../java/com/blankj/lib/base/BaseFragment.kt | 6 ++--- .../blankj/lib/base/rv/BaseViewHolder.java | 4 +-- .../lib/base/rv/RecycleViewDivider.java | 10 ++++---- .../lib/base/rv/adapter/BaseAdapter.java | 6 ++--- .../lib/base/rv/adapter/SingleAdapter.java | 2 +- .../src/main/res/layout/activity_back.xml | 14 +++++------ .../src/main/res/layout/activity_drawer.xml | 6 ++--- subutil/lib/build.gradle | 6 ++--- .../blankj/subutil/util/LocationUtils.java | 2 +- .../com/blankj/subutil/util/PinyinUtils.java | 2 +- .../java/com/blankj/subutil/util/Utils.java | 4 +-- .../blankj/subutil/pkg/helper/DialogHelper.kt | 2 +- utilcode/lib/build.gradle | 8 +++--- utilcode/lib/project.properties | 2 +- .../utilcode/constant/MemoryConstants.java | 2 +- .../constant/PermissionConstants.java | 2 +- .../utilcode/constant/TimeConstants.java | 2 +- .../blankj/utilcode/util/ActivityUtils.java | 9 ++++--- .../blankj/utilcode/util/AntiShakeUtils.java | 5 ++-- .../com/blankj/utilcode/util/AppUtils.java | 5 ++-- .../com/blankj/utilcode/util/BarUtils.java | 11 ++++---- .../blankj/utilcode/util/BrightnessUtils.java | 5 ++-- .../utilcode/util/CacheDiskStaticUtils.java | 3 ++- .../blankj/utilcode/util/CacheDiskUtils.java | 3 ++- .../utilcode/util/CacheDoubleStaticUtils.java | 3 ++- .../utilcode/util/CacheDoubleUtils.java | 2 +- .../utilcode/util/CacheMemoryStaticUtils.java | 2 +- .../utilcode/util/CacheMemoryUtils.java | 4 +-- .../com/blankj/utilcode/util/ColorUtils.java | 12 ++++----- .../com/blankj/utilcode/util/CrashUtils.java | 4 +-- .../com/blankj/utilcode/util/DeviceUtils.java | 4 +-- .../blankj/utilcode/util/FragmentUtils.java | 21 ++++++++-------- .../com/blankj/utilcode/util/ImageUtils.java | 14 +++++------ .../com/blankj/utilcode/util/IntentUtils.java | 4 +-- .../com/blankj/utilcode/util/LogUtils.java | 8 +++--- .../blankj/utilcode/util/MetaDataUtils.java | 2 +- .../blankj/utilcode/util/NetworkUtils.java | 2 +- .../utilcode/util/NotificationUtils.java | 6 ++--- .../com/blankj/utilcode/util/ObjectUtils.java | 6 ++--- .../blankj/utilcode/util/PermissionUtils.java | 8 +++--- .../com/blankj/utilcode/util/PhoneUtils.java | 2 +- .../blankj/utilcode/util/ProcessUtils.java | 4 +-- .../com/blankj/utilcode/util/RegexUtils.java | 2 +- .../blankj/utilcode/util/ResourceUtils.java | 2 +- .../blankj/utilcode/util/SPStaticUtils.java | 2 +- .../com/blankj/utilcode/util/SPUtils.java | 2 +- .../com/blankj/utilcode/util/ScreenUtils.java | 5 ++-- .../blankj/utilcode/util/SnackbarUtils.java | 14 +++++------ .../com/blankj/utilcode/util/SpanUtils.java | 16 ++++++------ .../com/blankj/utilcode/util/StringUtils.java | 4 +-- .../com/blankj/utilcode/util/ThreadUtils.java | 7 +++--- .../com/blankj/utilcode/util/TimeUtils.java | 2 +- .../com/blankj/utilcode/util/ToastUtils.java | 10 ++++---- .../com/blankj/utilcode/util/UriUtils.java | 25 +++++++++++++------ .../java/com/blankj/utilcode/util/Utils.java | 2 +- .../blankj/utilcode/util/VibrateUtils.java | 2 +- .../blankj/utilcode/util/ObjectUtilsTest.java | 5 ++-- .../pkg/feature/activity/ActivityActivity.kt | 2 +- .../feature/activity/SubActivityActivity.kt | 2 +- .../feature/bar/BarStatusFragmentActivity.kt | 16 ++++++------ .../pkg/feature/fragment/ContainerFragment.kt | 6 ++--- .../pkg/feature/fragment/FragmentActivity.kt | 6 ++--- .../pkg/feature/image/ImageActivity.kt | 8 +++--- .../pkg/feature/snackbar/SnackbarActivity.kt | 2 +- .../utilcode/pkg/feature/span/SpanActivity.kt | 2 +- .../utilcode/pkg/feature/toast/CustomToast.kt | 2 +- .../pkg/feature/toast/ToastActivity.kt | 2 +- .../utilcode/pkg/helper/DialogHelper.kt | 2 +- .../main/res/layout/activity_adaptscreen.xml | 4 +-- .../res/layout/activity_adaptscreen_close.xml | 4 +-- .../layout/activity_adaptscreen_height.xml | 4 +-- .../res/layout/activity_adaptscreen_width.xml | 4 +-- .../layout/activity_bar_status_fragment.xml | 4 +-- .../src/main/res/layout/activity_fragment.xml | 2 +- .../src/main/res/layout/activity_image.xml | 2 +- 84 files changed, 241 insertions(+), 220 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8271c33548..a1706be701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `19/03/09` [fix] UriUtils#uri2File. * `19/03/08` [add] LogUtils support multi process. Publish v1.23.7. * `19/03/02` [fix] LogUtils#file. * `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6. diff --git a/config.gradle b/config.gradle index 57c3d35e99..106f066059 100644 --- a/config.gradle +++ b/config.gradle @@ -2,7 +2,7 @@ ext { applicationId = 'com.blankj.androidutilcode' appName = 'Util' - compileSdkVersion = 27 + compileSdkVersion = 28 minSdkVersion = 14 targetSdkVersion = 27 versionCode = 1_023_007 @@ -16,8 +16,8 @@ ext { // lib version kotlin_version = '1.3.0' - support_version = '27.1.1' leakcanary_version = '1.6.3' + androidx_version = '1.0.0' dep = [ plugin : [ @@ -30,19 +30,18 @@ ext { ], // lib - support : [ - appcompat_v7: "com.android.support:appcompat-v7:$support_version", - design : "com.android.support:design:$support_version", - multidex : "com.android.support:multidex:1.0.2", - ], - constraint : "com.android.support.constraint:constraint-layout:1.1.3", + appcompat : "androidx.appcompat:appcompat:$androidx_version", + design : "com.google.android.material:material:$androidx_version", + multidex : "androidx.multidex:multidex:2.0.1", + constraint : "androidx.constraintlayout:constraintlayout:1.1.3", + kotlin : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", leakcanary : [ android : "com.squareup.leakcanary:leakcanary-android:$leakcanary_version", android_no_op : "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version", support_fragment: "com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version" ], - free_proguard: "com.blankj:free-proguard:0.0.7", + free_proguard: "com.blankj:free-proguard:0.0.12", adapt_screen : "com.blankj:adapt-screen:0.0.3", gson : "com.google.code.gson:gson:2.8.2", diff --git a/gradle.properties b/gradle.properties index e98b0a89fc..ad5471a961 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 \ No newline at end of file +#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt index 27d29a032a..e6dc516ed6 100644 --- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt +++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt @@ -2,7 +2,7 @@ package com.blankj.launcher.pkg import android.graphics.Color import android.os.Bundle -import android.support.v7.app.ActionBarDrawerToggle +import androidx.appcompat.app.ActionBarDrawerToggle import android.view.View import android.widget.ImageView import com.blankj.lib.base.BaseDrawerActivity diff --git a/launcher/pkg/src/main/res/layout/activity_main.xml b/launcher/pkg/src/main/res/layout/activity_main.xml index 3b31dafe32..ee8b62a6fa 100644 --- a/launcher/pkg/src/main/res/layout/activity_main.xml +++ b/launcher/pkg/src/main/res/layout/activity_main.xml @@ -1,17 +1,17 @@ - - - - - - + + - @@ -69,5 +69,5 @@ android:text="@string/sub_util" /> - - + + diff --git a/lib/base/build.gradle b/lib/base/build.gradle index bd369d23ee..8c6cb29835 100644 --- a/lib/base/build.gradle +++ b/lib/base/build.gradle @@ -7,9 +7,9 @@ dependencies { api project(':utilcode-lib') api project(':subutil-lib') - api dep.support.appcompat_v7 - api dep.support.design - api dep.support.multidex + api dep.appcompat + api dep.design + api dep.multidex api dep.constraint api dep.kotlin api dep.free_proguard diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt index deb05718a9..b1b3086f14 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt @@ -2,7 +2,7 @@ package com.blankj.lib.base import android.app.Activity import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity import android.view.LayoutInflater import android.view.View import com.blankj.utilcode.util.AntiShakeUtils diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt index f3eb078f79..873c71fa49 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt @@ -2,7 +2,7 @@ package com.blankj.lib.base import android.app.Application import android.content.Context -import android.support.multidex.MultiDex +import androidx.multidex.MultiDex import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.CrashUtils import com.blankj.utilcode.util.LogUtils diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt index a29cc60cc8..3514d2fdd3 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt @@ -2,8 +2,8 @@ package com.blankj.lib.base import android.content.Intent import android.net.Uri -import android.support.annotation.StringRes -import android.support.v4.widget.DrawerLayout +import androidx.annotation.StringRes +import androidx.drawerlayout.widget.DrawerLayout import android.view.LayoutInflater import android.widget.FrameLayout import com.blankj.utilcode.util.ActivityUtils @@ -20,7 +20,7 @@ import kotlinx.android.synthetic.main.activity_drawer.* */ abstract class BaseDrawerActivity : BaseActivity() { - protected lateinit var mBaseDrawerRootLayout: DrawerLayout + protected lateinit var mBaseDrawerRootLayout: androidx.drawerlayout.widget.DrawerLayout protected lateinit var mBaseDrawerContainerView: FrameLayout override fun isSwipeBack(): Boolean { diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt index 42e7073529..3db893bea2 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt @@ -3,8 +3,8 @@ package com.blankj.lib.base import android.app.Activity import android.content.Context import android.os.Bundle -import android.support.annotation.IdRes -import android.support.v4.app.Fragment +import androidx.annotation.IdRes +import androidx.fragment.app.Fragment import android.util.Log import android.view.LayoutInflater import android.view.View @@ -19,7 +19,7 @@ import com.blankj.utilcode.util.AntiShakeUtils * desc : base about v4-fragment * ``` */ -abstract class BaseFragment : Fragment(), IBaseView { +abstract class BaseFragment : androidx.fragment.app.Fragment(), IBaseView { companion object { private const val TAG = "BaseFragment" diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java index ee47e751f5..6441f8c1fd 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java @@ -1,7 +1,7 @@ package com.blankj.lib.base.rv; -import android.support.annotation.IdRes; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.IdRes; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.View; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java index 3d2b90f302..dd20894e10 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java @@ -5,11 +5,11 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.support.annotation.DrawableRes; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.ViewCompat; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.LinearLayout; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java index f5acee0bb3..b8cf5ae12d 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java @@ -1,9 +1,9 @@ package com.blankj.lib.base.rv.adapter; import android.content.Context; -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java index 619c8fc688..b7e81b892b 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java @@ -1,6 +1,6 @@ package com.blankj.lib.base.rv.adapter; -import android.support.annotation.LayoutRes; +import androidx.annotation.LayoutRes; import java.util.List; diff --git a/lib/base/src/main/res/layout/activity_back.xml b/lib/base/src/main/res/layout/activity_back.xml index 5747922950..848cc885fe 100644 --- a/lib/base/src/main/res/layout/activity_back.xml +++ b/lib/base/src/main/res/layout/activity_back.xml @@ -1,26 +1,26 @@ - - - - + - - - + + diff --git a/lib/base/src/main/res/layout/activity_drawer.xml b/lib/base/src/main/res/layout/activity_drawer.xml index 1fec3fc953..697e83f643 100644 --- a/lib/base/src/main/res/layout/activity_drawer.xml +++ b/lib/base/src/main/res/layout/activity_drawer.xml @@ -1,5 +1,5 @@ - - - + diff --git a/subutil/lib/build.gradle b/subutil/lib/build.gradle index a8b9264e6c..8f8aa8198f 100644 --- a/subutil/lib/build.gradle +++ b/subutil/lib/build.gradle @@ -1,7 +1,7 @@ apply { from "${rootDir.path}/config_lib.gradle" - plugin "tech.harmonysoft.oss.traute" +// plugin "tech.harmonysoft.oss.traute" plugin "com.github.dcendents.android-maven" plugin "com.jfrog.bintray" plugin "readme-sub" @@ -13,8 +13,8 @@ readme { } dependencies { - compileOnly dep.support.appcompat_v7 - compileOnly dep.support.design + compileOnly dep.appcompat + compileOnly dep.design api(dep.glide) { exclude group: "com.android.support" } diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java index 7ee8747902..0c177b534c 100755 --- a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java +++ b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java @@ -11,7 +11,7 @@ import android.location.LocationProvider; import android.os.Bundle; import android.provider.Settings; -import android.support.annotation.RequiresPermission; +import androidx.annotation.RequiresPermission; import android.util.Log; import java.io.IOException; diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java index 22486b3a91..934408c65e 100644 --- a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java +++ b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java @@ -1,6 +1,6 @@ package com.blankj.subutil.util; -import android.support.v4.util.SimpleArrayMap; +import androidx.collection.SimpleArrayMap; /** *
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
index 9cbf4e06fd..91b336abcf 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
@@ -7,8 +7,8 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.lang.reflect.InvocationTargetException;
 
diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
index 45e67a4a0d..9eba25c622 100644
--- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
+++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.subutil.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import com.blankj.subutil.pkg.R
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.PermissionUtils
diff --git a/utilcode/lib/build.gradle b/utilcode/lib/build.gradle
index 3570124816..41b0dacaa4 100644
--- a/utilcode/lib/build.gradle
+++ b/utilcode/lib/build.gradle
@@ -1,7 +1,7 @@
 apply {
     from "${rootDir.path}/config_lib.gradle"
 
-    plugin "tech.harmonysoft.oss.traute"
+//    plugin "tech.harmonysoft.oss.traute"
     plugin "com.github.dcendents.android-maven"
     plugin "com.jfrog.bintray"
     plugin "readme-core"
@@ -17,10 +17,10 @@ apply from: "${rootDir.path}/gradle/bintrayUploadAndroid.gradle"
 dependencies {
     compile dep.gson
 
-    compileOnly dep.support.appcompat_v7
-    compileOnly dep.support.design
+    compileOnly dep.appcompat
+    compileOnly dep.design
 
     testImplementation dep.junit
     testImplementation dep.robolectric
-    testImplementation dep.support.appcompat_v7
+    testImplementation dep.appcompat
 }
\ No newline at end of file
diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index 22ae3b8603..d0f2a3f7e0 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,7 +1,7 @@
 #project
 project.name=UtilCode
 project.groupId=com.blankj
-project.artifactId=utilcode
+project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
index b68bfcb113..5c05c0163e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index 76f7e9a217..6db826e4ab 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -4,7 +4,7 @@
 import android.Manifest.permission;
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.StringDef;
+import androidx.annotation.StringDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
index 9932037bf8..45090576e3 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index 4b8a9a07b5..9dd16d6e48 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -10,15 +10,16 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.util.Pair;
 import android.util.Log;
 import android.view.View;
 
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.util.Pair;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
index 7e87e73474..ca9036225e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
@@ -1,9 +1,10 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.View;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index 136f27b5ed..357c423fc6 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -17,8 +17,6 @@
 import android.net.Uri;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import java.io.File;
@@ -27,6 +25,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..22178a5c20 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -8,11 +8,6 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.widget.DrawerLayout;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Display;
@@ -27,6 +22,12 @@
 
 import java.lang.reflect.Method;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import static android.Manifest.permission.EXPAND_STATUS_BAR;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
index f9344b0a59..bacc519540 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
@@ -2,11 +2,12 @@
 
 import android.content.ContentResolver;
 import android.provider.Settings;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.Window;
 import android.view.WindowManager;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
index bb48a4b5cf..c5a9a17a6d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
index 99aef6b078..2e6637febf 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
@@ -8,7 +8,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
 import com.blankj.utilcode.constant.CacheConstants;
@@ -37,6 +36,8 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
index 2ef267bd01..6dbb9f7475 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
index c800423c78..aca1c25837 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
@@ -3,7 +3,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
index 56abfba117..aedcfa7fc4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
index d0e06e394d..ddaa2baed9 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
-import android.support.v4.util.LruCache;
+import androidx.annotation.NonNull;
+import androidx.collection.LruCache;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 4c0c22232b..a6603cfc44 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
 import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index 9ef930c467..a096321cf4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -5,8 +5,8 @@
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedWriter;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index c1c2c3c76e..d0c1788a02 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -8,8 +8,8 @@
 import android.os.Build;
 import android.os.PowerManager;
 import android.provider.Settings;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
 import android.text.TextUtils;
 
 import java.io.File;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
index 43b8537e75..9e8ae14ef1 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
@@ -3,16 +3,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.AnimatorRes;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.View;
 
@@ -20,6 +10,17 @@
 import java.util.Collections;
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.AnimatorRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 83e01eb1ad..cbee7dd4bd 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -27,13 +27,13 @@
 import android.renderscript.Element;
 import android.renderscript.RenderScript;
 import android.renderscript.ScriptIntrinsicBlur;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.view.View;
 
 import java.io.BufferedOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 6faa37d043..1e26dc8a9a 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,8 +8,8 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.content.FileProvider;
+import androidx.annotation.RequiresPermission;
+import androidx.core.content.FileProvider;
 
 import java.io.File;
 import java.util.ArrayList;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
index e1e2e78600..f5d814207d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -12,10 +12,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.RequiresApi;
+import androidx.collection.SimpleArrayMap;
 import android.util.Log;
 
 import com.google.gson.Gson;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
index 6f6cf85b80..bd4b8da935 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
@@ -8,7 +8,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index f281d777c2..3171837f46 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -7,7 +7,7 @@
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.format.Formatter;
 import android.util.Log;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
index b8163d2e66..73a900b465 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
@@ -5,9 +5,9 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
index be5491ece0..3c0c087a39 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
@@ -1,9 +1,9 @@
 package com.blankj.utilcode.util;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.RequiresApi;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index 235a0f3f94..1cb3df0156 100755
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -10,10 +10,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.WindowManager;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
index 99068781a4..f407f81b5f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
@@ -7,7 +7,7 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
index 7db75522d9..00c2bf6f73 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
@@ -10,8 +10,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index ba57fab956..817a94149f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 import com.blankj.utilcode.constant.RegexConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
index 92424163bb..ee41e95958 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.RawRes;
+import androidx.annotation.RawRes;
 
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
index d3e21fb873..21274c3023 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
index 554a2ed586..a9d18a1a55 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
@@ -3,7 +3,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index c3e089a90f..f55e4a21db 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -7,12 +7,11 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Point;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.DisplayMetrics;
 import android.view.Surface;
 import android.view.View;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
index b164e6154e..eab1990d29 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.Snackbar;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.snackbar.Snackbar;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
index 641204fd63..d79cf9262b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
@@ -14,14 +14,14 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
 import android.text.Layout;
 import android.text.Layout.Alignment;
 import android.text.SpannableStringBuilder;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..70f0defe50 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -1,8 +1,8 @@
 package com.blankj.utilcode.util;
 
 import android.content.res.Resources;
-import android.support.annotation.ArrayRes;
-import android.support.annotation.StringRes;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.StringRes;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index ba7122e366..819af790e8 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -2,9 +2,6 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -21,6 +18,10 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
index adaa920474..a5286b0fbe 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.TimeConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index b4fe658945..b25360e52c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -14,11 +14,11 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.core.app.NotificationManagerCompat;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 98f3ef66a8..8e4fd9d09c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -8,12 +8,14 @@
 import android.os.Environment;
 import android.provider.DocumentsContract;
 import android.provider.MediaStore;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
 import android.util.Log;
 
 import java.io.File;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
@@ -70,12 +72,19 @@ public static File uri2File(@NonNull final Uri uri) {
                 Log.d("UriUtils", uri.toString() + " parse failed. -> 1");
                 return null;
             } else if ("com.android.providers.downloads.documents".equals(authority)) {
-                final String id = DocumentsContract.getDocumentId(uri);
-                final Uri contentUri = ContentUris.withAppendedId(
-                        Uri.parse("content://downloads/public_downloads"),
-                        Long.valueOf(id)
-                );
-                return getFileFromUri(contentUri, 2);
+                String id = DocumentsContract.getDocumentId(uri);
+                if (!TextUtils.isEmpty(id)) {
+                    if (id.startsWith("raw:")) {
+                        return new File(id.substring(4));
+                    }
+                    final Uri contentUri = ContentUris.withAppendedId(
+                            Uri.parse(Environment.DIRECTORY_DOWNLOADS),
+                            Long.valueOf(id)
+                    );
+                    return getFileFromUri(contentUri, 2);
+                }
+                Log.d("UriUtils", uri.toString() + " parse failed. -> 3");
+                return null;
             } else if ("com.android.providers.media.documents".equals(authority)) {
                 final String docId = DocumentsContract.getDocumentId(uri);
                 final String[] split = docId.split(":");
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
index 52b82376e1..d858e4ad22 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
@@ -7,7 +7,7 @@
 import android.app.Application.ActivityLifecycleCallbacks;
 import android.content.Context;
 import android.os.Bundle;
-import android.support.v4.content.FileProvider;
+import androidx.core.content.FileProvider;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
index a57bbb8241..622d657817 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.os.Vibrator;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 
 import static android.Manifest.permission.VIBRATE;
 
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
index a0203f78fc..ed12c24d8d 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
@@ -1,7 +1,5 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
@@ -12,6 +10,9 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index 5ace21f5b1..f3d3600a27 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -6,7 +6,7 @@ import android.graphics.Bitmap
 import android.graphics.drawable.BitmapDrawable
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityOptionsCompat
+import androidx.core.app.ActivityOptionsCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
index 4815032936..864f1c12b4 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.activity
 
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityCompat
+import androidx.core.app.ActivityCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
index b2633ddf5c..0dac18c72c 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.bar
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentPagerAdapter
-import android.support.v4.view.ViewPager
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -37,7 +37,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             R.id.barStatusFragmentNavigationCustom
     )
 
-    private val mFragmentList = ArrayList()
+    private val mFragmentList = ArrayList()
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
         when (item.itemId) {
@@ -78,8 +78,8 @@ class BarStatusFragmentActivity : BaseActivity() {
         mFragmentList.add(BarStatusCustomFragment.newInstance())
 
         barStatusFragmentVp.offscreenPageLimit = 3
-        barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
-            override fun getItem(position: Int): Fragment {
+        barStatusFragmentVp.adapter = object : androidx.fragment.app.FragmentPagerAdapter(supportFragmentManager) {
+            override fun getItem(position: Int): androidx.fragment.app.Fragment {
                 return mFragmentList[position]
             }
 
@@ -88,7 +88,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             }
         }
 
-        barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+        barStatusFragmentVp.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
             override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
 
             override fun onPageSelected(position: Int) {
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
index ca0289a158..117c7d121e 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -2,8 +2,8 @@ package com.blankj.utilcode.pkg.feature.fragment
 
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.RequiresApi
-import android.support.v4.app.Fragment
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
 import android.transition.*
 import android.view.View
 import com.blankj.lib.base.BaseLazyFragment
@@ -129,7 +129,7 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener
         }
     }
 
-    private fun addSharedElement(fragment: Fragment): Fragment {
+    private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             fragment.sharedElementEnterTransition = DetailTransition()
             fragment.enterTransition = Fade()
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
index b768f563e5..6e3137b9c6 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -4,8 +4,8 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.os.PersistableBundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -30,7 +30,7 @@ class FragmentActivity : BaseActivity() {
         }
     }
 
-    private val mFragments = arrayListOf()
+    private val mFragments = arrayListOf()
     private var curIndex: Int = 0
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 496c5a4032..636d92c030 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -6,9 +6,9 @@ import android.graphics.Bitmap
 import android.graphics.Color
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.LayoutRes
-import android.support.annotation.StringRes
-import android.support.v7.widget.LinearLayoutManager
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.LinearLayoutManager
 import android.view.View
 import android.widget.ImageView
 import android.widget.TextView
@@ -92,7 +92,7 @@ class ImageActivity : BaseActivity() {
         }
 
         imageRv.adapter = ImageAdapter(mList, R.layout.item_image)
-        imageRv.layoutManager = LinearLayoutManager(this)
+        imageRv.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this)
     }
 
     override fun doBusiness() {}
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index 4bd07d274e..34d3914fe1 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.text.SpannableStringBuilder
 import android.view.View
 import android.view.ViewGroup
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index f3a1a3ee02..7c5fd45308 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.*
 import android.os.Bundle
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
 import android.text.Layout
 import android.text.SpannableStringBuilder
 import android.text.TextPaint
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..458ecbb3fb 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.toast
 
 import android.os.Handler
 import android.os.Looper
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.widget.TextView
 import android.widget.Toast
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index ea6c10c24d..40055d14b9 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v4.content.ContextCompat
+import androidx.core.content.ContextCompat
 import android.view.Gravity
 import android.view.View
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 7e6094414a..c3247b1312 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import android.text.method.ScrollingMovementMethod
 import android.view.LayoutInflater
 import android.view.View
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
index 003c6f5840..e33848b84d 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
index c3f88ecba3..e43cbb2bb5 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.CloseAdaptActivity">
 
-    
 
@@ -42,6 +42,6 @@
             android:textSize="30pt"
             app:layout_constraintTop_toBottomOf="@id/adaptScreenCloseAdaptDpTv" />
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
index 0b207d97f5..07c76be55b 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.HeightActivity">
 
-    
 
@@ -94,6 +94,6 @@
         
 
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
index 46e0f2f1a2..5a791d924f 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.WidthActivity">
 
-    
 
@@ -147,6 +147,6 @@
 
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
index c5f975b58f..1a36770b58 100644
--- a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
@@ -7,7 +7,7 @@
     android:background="@color/white"
     android:orientation="vertical">
 
-    
 
-    
 
-    
 
-    

From 70b6089109b6e58734d0a500820f54cb41858eba Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 8 Mar 2019 18:07:14 +0800
Subject: [PATCH 005/239] see 03/08 log

---
 utilcode/README-CN.md | 3 +++
 utilcode/README.md    | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index f3756be966..7fc06ebf99 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -3,6 +3,9 @@
 Gradle:
 ```groovy
 implementation 'com.blankj:utilcode:1.23.7'
+
+// if u use AndroidX, use the following
+implementation 'com.blankj:utilcodex:1.23.7'
 ```
 
 
diff --git a/utilcode/README.md b/utilcode/README.md
index 75d8757892..094cc44c08 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -3,6 +3,9 @@
 Gradle:
 ```groovy
 implementation 'com.blankj:utilcode:1.23.7'
+
+// if u use AndroidX, use the following
+implementation 'com.blankj:utilcodex:1.23.7'
 ```
 
 

From 4e2bad2c6293a70c14dcda1118b72b11cd307d93 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sun, 10 Mar 2019 23:05:30 +0800
Subject: [PATCH 006/239] see 03/10 log

---
 .../com/blankj/lib/base/BaseApplication.kt    |  4 --
 .../blankj/utilcode/util/MessengerUtils.java  | 62 ++++++++++++-------
 utilcode/pkg/src/main/AndroidManifest.xml     |  6 +-
 .../utilcode/pkg/feature/CoreUtilActivity.kt  |  7 +++
 .../pkg/feature/activity/ActivityActivity.kt  | 22 +++++--
 5 files changed, 65 insertions(+), 36 deletions(-)

diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt
index e5c348f3aa..8afc0f8674 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt
@@ -6,11 +6,7 @@ import android.support.multidex.MultiDex
 import com.blankj.utilcode.util.AppUtils
 import com.blankj.utilcode.util.CrashUtils
 import com.blankj.utilcode.util.LogUtils
-<<<<<<< HEAD
 import com.blankj.utilcode.util.MessengerUtils
-=======
-import com.blankj.utilcode.util.ProcessUtils
->>>>>>> master
 import com.squareup.leakcanary.LeakCanary
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
index 4d6c750d50..df926923e4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java
@@ -16,6 +16,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -44,11 +45,11 @@ public class MessengerUtils {
 
     public static void init() {
         if (isMainProcess()) {
-            LogUtils.e();
+            LogUtils.e("init " + getCurrentProcessName());
             Intent intent = new Intent(Utils.getApp(), ServerService.class);
             Utils.getApp().startService(intent);
         } else {
-            LogUtils.e();
+            LogUtils.e("init " + getCurrentProcessName());
             registerClient();
         }
     }
@@ -79,14 +80,14 @@ public static void unsubscribe(String key) {
     public static void post(@NonNull String key, @NonNull Bundle data) {
         data.putString(KEY_STRING, key);
         if (sLocalClient != null) {
-            sLocalClient.sendMsg(data);
+            sLocalClient.sendMsg2Server(data);
         } else {
             Intent intent = new Intent(Utils.getApp(), ServerService.class);
             intent.putExtras(data);
             Utils.getApp().startService(intent);
         }
 //        if (otherAppClient != null) {
-//            otherAppClient.sendMsg(data);
+//            otherAppClient.sendMsg2Server(data);
 //        }
     }
 
@@ -149,16 +150,18 @@ public void onServiceConnected(ComponentName name, IBinder service) {
                 try {
                     mServer.send(subscribeMsg);
                 } catch (RemoteException e) {
-                    e.printStackTrace();
+                    Log.e("MessengerUtils", "onServiceConnected: ", e);
                 }
-                sendCachedMsg();
+                sendCachedMsg2Server();
             }
 
             @Override
             public void onServiceDisconnected(ComponentName name) {
-                LogUtils.d("client service disconnected", name);
+                Log.w("MessengerUtils", "client service disconnected:" + name);
                 mServer = null;
-//            connect();
+                if (!bind()) {
+                    Log.e("MessengerUtils", "client service rebind failed: " + name);
+                }
             }
         };
 
@@ -181,26 +184,37 @@ void unbind() {
             Utils.getApp().unbindService(mConn);
         }
 
-        void sendMsg(Bundle bundle) {
-            if (mServer != null) {
-                sendCachedMsg();
-                Message msg = Message.obtain(mHandler, SEND_MSG_TO_TARGET);
-                msg.setData(bundle);
-                msg.replyTo = mClient;
-                try {
-                    mServer.send(msg);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
-                }
-            } else {
+        void sendMsg2Server(Bundle bundle) {
+            if (mServer == null) {
                 mCached.addFirst(bundle);
+                LogUtils.d("save the bundle", bundle);
+            } else {
+                sendCachedMsg2Server();
+                if (!send2Server(bundle)) {
+                    mCached.addFirst(bundle);
+                }
             }
         }
 
-        private void sendCachedMsg() {
-            for (int i = mCached.size() - 1; i >= 0; i--) {
-                sendMsg(mCached.get(i));
-                mCached.remove(i);
+        private void sendCachedMsg2Server() {
+            if (mCached.isEmpty()) return;
+            for (int i = mCached.size() - 1; i >= 0; --i) {
+                if (send2Server(mCached.get(i))) {
+                    mCached.remove(i);
+                }
+            }
+        }
+
+        private boolean send2Server(Bundle bundle) {
+            Message msg = Message.obtain(mHandler, SEND_MSG_TO_TARGET);
+            msg.setData(bundle);
+            msg.replyTo = mClient;
+            try {
+                mServer.send(msg);
+                return true;
+            } catch (RemoteException e) {
+                Log.e("MessengerUtils", "send2Server: ", e);
+                return false;
             }
         }
     }
diff --git a/utilcode/pkg/src/main/AndroidManifest.xml b/utilcode/pkg/src/main/AndroidManifest.xml
index 211f824410..6559682d6e 100644
--- a/utilcode/pkg/src/main/AndroidManifest.xml
+++ b/utilcode/pkg/src/main/AndroidManifest.xml
@@ -38,14 +38,14 @@
     
         
+            android:launchMode="singleTop" />
 
         
+            android:logo="@drawable/activity_activity_logo"
+            android:process=":remote" />
         
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
index 48bbd77cff..8cc49383a6 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
@@ -35,6 +35,8 @@ import com.blankj.utilcode.pkg.feature.span.SpanActivity
 import com.blankj.utilcode.pkg.feature.toast.ToastActivity
 import com.blankj.utilcode.pkg.feature.vibrate.VibrateActivity
 import com.blankj.utilcode.util.BusUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.MessengerUtils
 
 /**
  * ```
@@ -61,6 +63,11 @@ class CoreUtilActivity : BaseTitleBarActivity() {
     override fun initData(bundle: Bundle?) {}
 
     override fun bindLayout(): Int {
+        MessengerUtils.subscribe("core", object: MessengerUtils.MessageCallback {
+            override fun onMsgCallBack(data: Bundle?) {
+                LogUtils.eTag("Messenger", data)
+            }
+        })
         return R.layout.activity_util_core
     }
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index 5ace21f5b1..2d443d6849 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -12,10 +12,7 @@ import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.pkg.feature.CoreUtilActivity
-import com.blankj.utilcode.util.ActivityUtils
-import com.blankj.utilcode.util.AppUtils
-import com.blankj.utilcode.util.LogUtils
-import com.blankj.utilcode.util.SpanUtils
+import com.blankj.utilcode.util.*
 import kotlinx.android.synthetic.main.activity_activity.*
 import java.util.*
 
@@ -51,6 +48,16 @@ class ActivityActivity : BaseTitleBarActivity() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
         }
+        var bundle = Bundle()
+        bundle.putString("activity", "ActivityActivity");
+        MessengerUtils.post("core", bundle)
+
+        MessengerUtils.subscribe("activity", object: MessengerUtils.MessageCallback {
+            override fun onMsgCallBack(data: Bundle?) {
+                LogUtils.eTag("Messenger", data)
+            }
+        })
+
         return R.layout.activity_activity
     }
 
@@ -106,7 +113,12 @@ class ActivityActivity : BaseTitleBarActivity() {
 
     override fun onWidgetClick(view: View) {
         when (view.id) {
-            R.id.activityClzBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java)
+            R.id.activityClzBtn -> {
+                var bundle = Bundle()
+                bundle.putString("activity", "ActivityActivity");
+                MessengerUtils.post("activity", bundle)
+            }
+//            R.id.activityClzBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java)
             R.id.activityClzOptBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java,
                     getOption(random.nextInt(5)))
             R.id.activityClzAnimBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java,

From 2fa66306221456a5be12d9d201c7495958596fb4 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Mon, 11 Mar 2019 20:45:31 +0800
Subject: [PATCH 007/239] see 03/11 log

---
 utilcode/lib/project.properties | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index d0f2a3f7e0..d238eda740 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,9 +1,9 @@
 #project
-project.name=UtilCode
+project.name=UtilCodeX
 project.groupId=com.blankj
 project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
 #javadoc
-javadoc.name=UtilCode
\ No newline at end of file
+javadoc.name=UtilCodeX
\ No newline at end of file

From 22db2430792c881cd03d418529c1f238c40469ab Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Wed, 13 Mar 2019 19:54:14 +0800
Subject: [PATCH 008/239] see 03/13

---
 utilcode/README-CN.md                         |  43 ++--
 utilcode/README.md                            |  15 +-
 .../com/blankj/utilcode/app/UtilCodeApp.kt    |   2 +
 .../com/blankj/utilcode/util/AppUtils.java    |  74 +++++-
 .../com/blankj/utilcode/util/GsonUtils.java   |  35 ++-
 .../com/blankj/utilcode/util/LogUtils.java    |  26 +-
 .../blankj/utilcode/util/MessengerUtils.java  | 226 ++++++++++++------
 .../blankj/utilcode/util/NetworkUtils.java    | 165 ++++++++++++-
 .../blankj/utilcode/util/ProcessUtils.java    |   3 +-
 .../com/blankj/utilcode/util/ShellUtils.java  |  88 +++++++
 .../com/blankj/utilcode/util/ThreadUtils.java |   6 +-
 .../com/blankj/utilcode/util/ToastUtils.java  |   8 +-
 .../java/com/blankj/utilcode/util/Utils.java  |  65 +++++
 utilcode/pkg/src/main/AndroidManifest.xml     |  10 +-
 .../utilcode/pkg/feature/CoreUtilActivity.kt  |  11 +-
 .../pkg/feature/activity/ActivityActivity.kt  |  22 +-
 .../utilcode/pkg/feature/app/AppActivity.kt   |   4 +-
 .../utilcode/pkg/feature/bus/BusActivity.kt   |  72 ++++++
 .../pkg/feature/bus/BusRemoteActivity.kt      |  67 ++++++
 .../pkg/feature/network/NetworkActivity.kt    |  57 +++--
 .../pkg/src/main/res/layout/activity_bus.xml  |  24 ++
 .../main/res/layout/activity_bus_remote.xml   |  24 ++
 .../main/res/layout/activity_util_core.xml    |   7 +
 utilcode/pkg/src/main/res/values/strings.xml  |   6 +
 24 files changed, 870 insertions(+), 190 deletions(-)
 create mode 100644 utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt
 create mode 100644 utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusRemoteActivity.kt
 create mode 100644 utilcode/pkg/src/main/res/layout/activity_bus.xml
 create mode 100644 utilcode/pkg/src/main/res/layout/activity_bus_remote.xml

diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index f3756be966..a555f074f1 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -55,6 +55,7 @@ isAppRoot                         : 判断 App 是否有 root 权限
 isAppDebug                        : 判断 App 是否是 Debug 版本
 isAppSystem                       : 判断 App 是否是系统应用
 isAppForeground                   : 判断 App 是否处于前台
+isAppRunning                      : 判断 App 是否运行
 launchApp                         : 打开 App
 relaunchApp                       : 重启 App
 launchAppDetailsSettings          : 打开 App 具体设置
@@ -525,25 +526,27 @@ getMetaDataInReceiver: 获取 receiver 的 meta-data 值
 
 * ### 网络相关 -> [NetworkUtils.java][network.java] -> [Demo][network.demo]
 ```
-openWirelessSettings  : 打开网络设置界面
-isConnected           : 判断网络是否连接
-isAvailableByPing     : 判断网络是否可用
-getMobileDataEnabled  : 判断移动数据是否打开
-setMobileDataEnabled  : 打开或关闭移动数据
-isMobileData          : 判断网络是否是移动数据
-is4G                  : 判断网络是否是 4G
-getWifiEnabled        : 判断 wifi 是否打开
-setWifiEnabled        : 打开或关闭 wifi
-isWifiConnected       : 判断 wifi 是否连接状态
-isWifiAvailable       : 判断 wifi 数据是否可用
-getNetworkOperatorName: 获取移动网络运营商名称
-getNetworkType        : 获取当前网络类型
-getIPAddress          : 获取 IP 地址
-getDomainAddress      : 获取域名 IP 地址
-getIpAddressByWifi    : 根据 WiFi 获取网络 IP 地址
-getGatewayByWifi      : 根据 WiFi 获取网关 IP 地址
-getNetMaskByWifi      : 根据 WiFi 获取子网掩码 IP 地址
-getServerAddressByWifi: 根据 WiFi 获取服务端 IP 地址
+openWirelessSettings    : 打开网络设置界面
+isConnected             : 判断网络是否连接
+isAvailable[Async]      : 判断网络是否可用
+isAvailableByPing[Async]: 用 ping 判断网络是否可用
+isAvailableByDns[Async] : 用 DNS 判断网络是否可用
+getMobileDataEnabled    : 判断移动数据是否打开
+setMobileDataEnabled    : 打开或关闭移动数据
+isMobileData            : 判断网络是否是移动数据
+is4G                    : 判断网络是否是 4G
+getWifiEnabled          : 判断 wifi 是否打开
+setWifiEnabled          : 打开或关闭 wifi
+isWifiConnected         : 判断 wifi 是否连接状态
+isWifiAvailable[Async]  : 判断 wifi 数据是否可用
+getNetworkOperatorName  : 获取移动网络运营商名称
+getNetworkType          : 获取当前网络类型
+getIPAddress            : 获取 IP 地址
+getDomainAddress[Async] : 获取域名 IP 地址
+getIpAddressByWifi      : 根据 WiFi 获取网络 IP 地址
+getGatewayByWifi        : 根据 WiFi 获取网关 IP 地址
+getNetMaskByWifi        : 根据 WiFi 获取子网掩码 IP 地址
+getServerAddressByWifi  : 根据 WiFi 获取服务端 IP 地址
 ```
 
 * ### 对象相关 -> [ObjectUtils.java][object.java] -> [Test][object.test]
@@ -746,7 +749,7 @@ isServiceRunning     : 判断服务是否运行
 
 * ### Shell 相关 -> [ShellUtils.java][shell.java]
 ```
-execCmd: 是否是在 root 下执行命令
+execCmd[Async]: 执行命令
 ```
 
 * ### 尺寸相关 -> [SizeUtils.java][size.java]
diff --git a/utilcode/README.md b/utilcode/README.md
index 75d8757892..3516ea3aba 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -11,6 +11,7 @@ implementation 'com.blankj:utilcode:1.23.7'
 * ### About Activity -> [ActivityUtils.java][activity.java] -> [Demo][activity.demo]
 ```
 getActivityByView
+getActivityByContext
 isActivityExists
 startActivity
 startActivityForResult
@@ -54,6 +55,7 @@ isAppRoot
 isAppDebug
 isAppSystem
 isAppForeground
+isAppRunning
 launchApp
 relaunchApp
 launchAppDetailsSettings
@@ -526,7 +528,9 @@ getMetaDataInReceiver
 ```
 openWirelessSettings
 isConnected
-isAvailableByPing
+isAvailable[Async]      : 判断网络是否可用
+isAvailableByPing[Async]: 用 ping 判断网络是否可用
+isAvailableByDns[Async] : 用 DNS 判断网络是否可用
 getMobileDataEnabled
 setMobileDataEnabled
 isMobileData
@@ -534,11 +538,11 @@ is4G
 getWifiEnabled
 setWifiEnabled
 isWifiConnected
-isWifiAvailable
+isWifiAvailable[Async]  : 判断 wifi 数据是否可用
 getNetworkOperatorName
 getNetworkType
 getIPAddress
-getDomainAddress
+getDomainAddress[Async] : 获取域名 IP 地址
 getIpAddressByWifi
 getGatewayByWifi
 getNetMaskByWifi
@@ -745,7 +749,7 @@ isServiceRunning
 
 * ### About Shell -> [ShellUtils.java][shell.java]
 ```
-execCmd
+execCmd[Async]: 执行命令
 ```
 
 * ### About Size -> [SizeUtils.java][size.java]
@@ -887,6 +891,7 @@ executeByCustom
 executeByCustomWithDelay
 executeByCustomAtFixRate
 cancel
+setDeliver
 ```
 
 * ### About Time -> [TimeUtils.java][time.java] -> [Test][time.test]
@@ -940,7 +945,7 @@ file2Uri
 uri2File
 ```
 
-* ### About Vibrate -> [VibrateUtils.java][vibrate.java] -> [Demo][demo.demo]
+* ### About Vibrate -> [VibrateUtils.java][vibrate.java] -> [Demo][vibrate.demo]
 ```
 vibrate
 cancel
diff --git a/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt b/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt
index d7925fa610..2cd3d1d391 100644
--- a/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt
+++ b/utilcode/app/src/main/java/com/blankj/utilcode/app/UtilCodeApp.kt
@@ -3,6 +3,7 @@ package com.blankj.utilcode.app
 import android.content.Context
 
 import com.blankj.lib.base.BaseApplication
+import com.blankj.utilcode.util.MessengerUtils
 import com.blankj.utilcode.util.Utils
 
 
@@ -29,6 +30,7 @@ class UtilCodeApp : BaseApplication() {
         Utils.init(this)
         super.onCreate()
         instance = this
+        MessengerUtils.registerClient("com.blankj.androidutilcode")
     }
 }
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index 136f27b5ed..495f688466 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -286,13 +286,13 @@ public static boolean uninstallAppSilent(final String packageName,
     /**
      * Return whether the app is installed.
      *
-     * @param packageName The name of the package.
+     * @param pkgName The name of the package.
      * @return {@code true}: yes
{@code false}: no */ - public static boolean isAppInstalled(@NonNull final String packageName) { + public static boolean isAppInstalled(@NonNull final String pkgName) { PackageManager packageManager = Utils.getApp().getPackageManager(); try { - return packageManager.getApplicationInfo(packageName, 0) != null; + return packageManager.getApplicationInfo(pkgName, 0) != null; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return false; @@ -388,6 +388,46 @@ public static boolean isAppForeground(@NonNull final String packageName) { return !isSpace(packageName) && packageName.equals(getForegroundProcessName()); } + + /** + * Return whether application is running. + * + * @param pkgName The name of the package. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isAppRunning(@NonNull final String pkgName) { + int uid; + PackageManager packageManager = Utils.getApp().getPackageManager(); + try { + ApplicationInfo ai = packageManager.getApplicationInfo(pkgName, 0); + if (ai == null) return false; + uid = ai.uid; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return false; + } + ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE); + if (am != null) { + List taskInfo = am.getRunningTasks(Integer.MAX_VALUE); + if (taskInfo != null && taskInfo.size() > 0) { + for (ActivityManager.RunningTaskInfo aInfo : taskInfo) { + if (pkgName.equals(aInfo.baseActivity.getPackageName())) { + return true; + } + } + } + List serviceInfo = am.getRunningServices(Integer.MAX_VALUE); + if (serviceInfo != null && serviceInfo.size() > 0) { + for (ActivityManager.RunningServiceInfo aInfo : serviceInfo) { + if (uid == aInfo.uid) { + return true; + } + } + } + } + return false; + } + /** * Launch the application. * @@ -697,6 +737,34 @@ public static String getAppSignatureMD5(final String packageName) { return getAppSignatureHash(packageName, "MD5"); } + + /** + * Return the application's user-ID. + * + * @return the application's signature for MD5 value + */ + public static int getAppUid() { + return getAppUid(Utils.getApp().getPackageName()); + } + + /** + * Return the application's user-ID. + * + * @param pkgName The name of the package. + * @return the application's signature for MD5 value + */ + public static int getAppUid(String pkgName) { + try { + ApplicationInfo ai = Utils.getApp().getPackageManager().getApplicationInfo(pkgName, 0); + if (ai != null) { + return ai.uid; + } + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + } + private static String getAppSignatureHash(final String packageName, final String algorithm) { if (isSpace(packageName)) return ""; Signature[] signature = getAppSignature(packageName); diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/GsonUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/GsonUtils.java index 93846e0d35..2951f9797f 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/GsonUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/GsonUtils.java @@ -41,7 +41,7 @@ public static Gson getGson() { /** * Gets pre-configured {@link Gson} instance. * - * @param serializeNulls determines if nulls will be serialized. + * @param serializeNulls Determines if nulls will be serialized. * @return {@link Gson} instance. */ public static Gson getGson(final boolean serializeNulls) { @@ -51,7 +51,7 @@ public static Gson getGson(final boolean serializeNulls) { /** * Serializes an object into json. * - * @param object the object to serialize. + * @param object The object to serialize. * @return object serialized into json. */ public static String toJson(final Object object) { @@ -61,20 +61,43 @@ public static String toJson(final Object object) { /** * Serializes an object into json. * - * @param object the object to serialize. - * @param includeNulls determines if nulls will be included. + * @param object The object to serialize. + * @param includeNulls Determines if nulls will be included. * @return object serialized into json. */ public static String toJson(final Object object, final boolean includeNulls) { return includeNulls ? GSON.toJson(object) : GSON_NO_NULLS.toJson(object); } + /** + * Serializes an object into json. + * + * @param src The object to serialize. + * @param typeOfSrc The specific genericized type of src. + * @return object serialized into json. + */ + public static String toJson(final Object src, final Type typeOfSrc) { + return toJson(src, typeOfSrc, true); + } + + /** + * Serializes an object into json. + * + * @param src The object to serialize. + * @param typeOfSrc The specific genericized type of src. + * @param includeNulls Determines if nulls will be included. + * @return object serialized into json. + */ + public static String toJson(final Object src, final Type typeOfSrc, final boolean includeNulls) { + return includeNulls ? GSON.toJson(src, typeOfSrc) : GSON_NO_NULLS.toJson(src, typeOfSrc); + } + /** * Converts {@link String} to given type. * - * @param json the json to convert. - * @param type type type json will be converted to. + * @param json The json to convert. + * @param type Type json will be converted to. * @return instance of type */ public static T fromJson(final String json, final Class type) { diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java index e1e2e78600..312deec24c 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java @@ -1,9 +1,7 @@ package com.blankj.utilcode.util; -import android.app.ActivityManager; import android.content.ClipData; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -25,8 +23,10 @@ import org.json.JSONException; import org.json.JSONObject; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; +import java.io.FileReader; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; @@ -42,7 +42,6 @@ import java.util.Date; import java.util.Formatter; import java.util.Iterator; -import java.util.List; import java.util.Locale; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -813,19 +812,16 @@ public int getSaveDays() { } private static String getCurrentProcessName() { - ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE); - if (am == null) return ""; - List info = am.getRunningAppProcesses(); - if (info == null || info.size() == 0) return ""; - int pid = android.os.Process.myPid(); - for (ActivityManager.RunningAppProcessInfo aInfo : info) { - if (aInfo.pid == pid) { - if (aInfo.processName != null) { - return aInfo.processName; - } - } + try { + File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline"); + BufferedReader mBufferedReader = new BufferedReader(new FileReader(file)); + String processName = mBufferedReader.readLine().trim(); + mBufferedReader.close(); + return processName; + } catch (Exception e) { + e.printStackTrace(); + return ""; } - return ""; } @Override diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java index df926923e4..7562d0888f 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MessengerUtils.java @@ -7,6 +7,8 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -18,9 +20,13 @@ import android.text.TextUtils; import android.util.Log; -import java.util.ArrayList; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** @@ -35,13 +41,13 @@ public class MessengerUtils { private static ConcurrentHashMap subscribers = new ConcurrentHashMap<>(); - private static List sClients = new ArrayList<>(); - private static Client sLocalClient; + private static Map sClientMap = new HashMap<>(); + private static Client sLocalClient; - private static final int SUBSCRIBE = 1; - private static final int UNSUBSCRIBE = -1; - private static final int SEND_MSG_TO_TARGET = 2; - private static final String KEY_STRING = "MESSENGER_UTILS"; + private static final int WHAT_SUBSCRIBE = 0x00; + private static final int WHAT_UNSUBSCRIBE = 0x01; + private static final int WHAT_SEND = 0x02; + private static final String KEY_STRING = "MESSENGER_UTILS"; public static void init() { if (isMainProcess()) { @@ -54,6 +60,28 @@ public static void init() { } } + public static void registerClient(final String pkgName) { + if (sClientMap.containsKey(pkgName)) { + Log.i("MessengerUtils", "registerClient: client registered: " + pkgName); + return; + } + Client client = new Client(pkgName); + if (client.bind()) { + sClientMap.put(pkgName, client); + } else { + Log.e("MessengerUtils", "registerClient: client bind failed: " + pkgName); + } + } + + public static void unregisterClient(final String pkgName) { + if (sClientMap.containsKey(pkgName)) { + Client client = sClientMap.get(pkgName); + client.unbind(); + } else { + Log.i("MessengerUtils", "unregisterClient: client didn't register: " + pkgName); + } + } + public static void registerClient() { Client client = new Client(null); if (client.bind()) { @@ -69,11 +97,11 @@ public static void unregisterClient() { } } - public static void subscribe(String key, MessageCallback callback) { + public static void subscribe(@NonNull final String key, @NonNull final MessageCallback callback) { subscribers.put(key, callback); } - public static void unsubscribe(String key) { + public static void unsubscribe(@NonNull final String key) { subscribers.remove(key); } @@ -86,14 +114,9 @@ public static void post(@NonNull String key, @NonNull Bundle data) { intent.putExtras(data); Utils.getApp().startService(intent); } -// if (otherAppClient != null) { -// otherAppClient.sendMsg2Server(data); -// } - } - - - public static void onMsgReceive(Bundle bundle) { - + for (Client client : sClientMap.values()) { + client.sendMsg2Server(data); + } } private static boolean isMainProcess() { @@ -101,19 +124,59 @@ private static boolean isMainProcess() { } private static String getCurrentProcessName() { + try { + File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline"); + BufferedReader mBufferedReader = new BufferedReader(new FileReader(file)); + String processName = mBufferedReader.readLine().trim(); + mBufferedReader.close(); + return processName; + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + private static boolean isAppInstalled(@NonNull final String pkgName) { + PackageManager packageManager = Utils.getApp().getPackageManager(); + try { + return packageManager.getApplicationInfo(pkgName, 0) != null; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return false; + } + } + + private static boolean isAppRunning(@NonNull final String pkgName) { + int uid; + PackageManager packageManager = Utils.getApp().getPackageManager(); + try { + ApplicationInfo ai = packageManager.getApplicationInfo(pkgName, 0); + if (ai == null) return false; + uid = ai.uid; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return false; + } ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE); - //noinspection ConstantConditions - List info = am.getRunningAppProcesses(); - if (info == null || info.size() == 0) return ""; - int pid = android.os.Process.myPid(); - for (ActivityManager.RunningAppProcessInfo aInfo : info) { - if (aInfo.pid == pid) { - if (aInfo.processName != null) { - return aInfo.processName; + if (am != null) { + List taskInfo = am.getRunningTasks(Integer.MAX_VALUE); + if (taskInfo != null && taskInfo.size() > 0) { + for (ActivityManager.RunningTaskInfo aInfo : taskInfo) { + if (pkgName.equals(aInfo.baseActivity.getPackageName())) { + return true; + } + } + } + List serviceInfo = am.getRunningServices(Integer.MAX_VALUE); + if (serviceInfo != null && serviceInfo.size() > 0) { + for (ActivityManager.RunningServiceInfo aInfo : serviceInfo) { + if (uid == aInfo.uid) { + return true; + } } } } - return ""; + return false; } static class Client { @@ -122,22 +185,22 @@ static class Client { Messenger mServer; LinkedList mCached = new LinkedList<>(); @SuppressLint("HandlerLeak") - Handler mHandler = new Handler() { + Handler mReceiveServeMsgHandler = new Handler() { @Override public void handleMessage(Message msg) { Bundle data = msg.getData(); if (data != null) { String key = data.getString(KEY_STRING); if (key != null) { - MessageCallback messageCallback = subscribers.get(key); - if (messageCallback != null) { - messageCallback.onMsgCallBack(data); + MessageCallback callback = subscribers.get(key); + if (callback != null) { + callback.onMsgCallBack(data); } } } } }; - Messenger mClient = new Messenger(mHandler); + Messenger mClient = new Messenger(mReceiveServeMsgHandler); ServiceConnection mConn = new ServiceConnection() { @Override @@ -145,10 +208,10 @@ public void onServiceConnected(ComponentName name, IBinder service) { LogUtils.d("client service connected", name); mServer = new Messenger(service); int key = getCurrentProcessName().hashCode(); - Message subscribeMsg = Message.obtain(mHandler, SUBSCRIBE, key, 0); - subscribeMsg.replyTo = mClient; + Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_SUBSCRIBE, key, 0); + msg.replyTo = mClient; try { - mServer.send(subscribeMsg); + mServer.send(msg); } catch (RemoteException e) { Log.e("MessengerUtils", "onServiceConnected: ", e); } @@ -170,17 +233,33 @@ public void onServiceDisconnected(ComponentName name) { } boolean bind() { - Intent intent; if (TextUtils.isEmpty(mPkgName)) { - intent = new Intent(Utils.getApp(), ServerService.class); + Intent intent = new Intent(Utils.getApp(), ServerService.class); + return Utils.getApp().bindService(intent, mConn, Context.BIND_AUTO_CREATE); + } + if (isAppInstalled(mPkgName)) { + if (isAppRunning(mPkgName)) { + Intent intent = new Intent(mPkgName + ".messenger"); + intent.setPackage(mPkgName); + return Utils.getApp().bindService(intent, mConn, Context.BIND_AUTO_CREATE); + } else { + Log.e("MessengerUtils", "bind: the app is not running -> " + mPkgName); + return false; + } } else { - intent = new Intent(mPkgName + ".messenger"); - intent.setPackage(mPkgName); + Log.e("MessengerUtils", "bind: the app is not installed -> " + mPkgName); + return false; } - return Utils.getApp().bindService(intent, mConn, Context.BIND_AUTO_CREATE); } void unbind() { + Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_UNSUBSCRIBE); + msg.replyTo = mClient; + try { + mServer.send(msg); + } catch (RemoteException e) { + Log.e("MessengerUtils", "unbind: ", e); + } Utils.getApp().unbindService(mConn); } @@ -206,7 +285,7 @@ private void sendCachedMsg2Server() { } private boolean send2Server(Bundle bundle) { - Message msg = Message.obtain(mHandler, SEND_MSG_TO_TARGET); + Message msg = Message.obtain(mReceiveServeMsgHandler, WHAT_SEND); msg.setData(bundle); msg.replyTo = mClient; try { @@ -221,23 +300,23 @@ private boolean send2Server(Bundle bundle) { public static class ServerService extends Service { - private final ConcurrentHashMap messengerMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap mClientMap = new ConcurrentHashMap<>(); @SuppressLint("HandlerLeak") - private final Handler handler = new Handler() { + private final Handler mReceiveClientMsgHandler = new Handler() { @Override public void handleMessage(Message msg) { LogUtils.e(msg.toString()); - int key = msg.arg1; switch (msg.what) { - case SUBSCRIBE: - messengerMap.put(key, msg.replyTo); + case WHAT_SUBSCRIBE: + mClientMap.put(msg.arg1, msg.replyTo); break; - case SEND_MSG_TO_TARGET: - sendMsg(msg); + case WHAT_SEND: + sendMsg2Client(msg); + consumeServerProcessCallback(msg); break; - case UNSUBSCRIBE: - messengerMap.remove(key); + case WHAT_UNSUBSCRIBE: + mClientMap.remove(msg.arg1); break; default: super.handleMessage(msg); @@ -245,7 +324,7 @@ public void handleMessage(Message msg) { } }; - private final Messenger messenger = new Messenger(handler); + private final Messenger messenger = new Messenger(mReceiveClientMsgHandler); @Nullable @Override @@ -260,39 +339,38 @@ public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null) { Bundle extras = intent.getExtras(); if (extras != null) { - Message message = Message.obtain(handler, SEND_MSG_TO_TARGET); - message.replyTo = messenger; - message.setData(extras); - sendMsg(message); + Message msg = Message.obtain(mReceiveClientMsgHandler, WHAT_SEND); + msg.replyTo = messenger; + msg.setData(extras); + sendMsg2Client(msg); + consumeServerProcessCallback(msg); } } return START_NOT_STICKY; } - private void sendMsg(Message msg) { - try { - Message msgToClient = Message.obtain(msg); - for (Messenger messenger : messengerMap.values()) { - if (messenger != null) { - Message m = new Message(); - m.copyFrom(msgToClient); - messenger.send(m); + private void sendMsg2Client(final Message msg) { + for (Messenger client : mClientMap.values()) { + try { + if (client != null) { + client.send(msg); } + } catch (RemoteException e) { + e.printStackTrace(); } - Message m = new Message(); - m.copyFrom(msgToClient); - Bundle data = msg.getData(); - if (data != null) { - String key = data.getString(KEY_STRING); - if (key != null) { - MessageCallback messageCallback = subscribers.get(key); - if (messageCallback != null) { - messageCallback.onMsgCallBack(data); - } + } + } + + private void consumeServerProcessCallback(final Message msg) { + Bundle data = msg.getData(); + if (data != null) { + String key = data.getString(KEY_STRING); + if (key != null) { + MessageCallback callback = subscribers.get(key); + if (callback != null) { + callback.onMsgCallBack(data); } } - } catch (RemoteException e) { - e.printStackTrace(); } } } diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java index f281d777c2..bbf033e98e 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java @@ -7,8 +7,10 @@ import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Build; +import android.support.annotation.NonNull; import android.support.annotation.RequiresPermission; import android.telephony.TelephonyManager; +import android.text.TextUtils; import android.text.format.Formatter; import android.util.Log; @@ -75,6 +77,65 @@ public static boolean isConnected() { return info != null && info.isConnected(); } + /** + * Return whether network is available. + *

Must hold {@code }

+ * + * @param callback The callback. + */ + @RequiresPermission(INTERNET) + public static Utils.Task isAvailableAsync(@NonNull final Utils.Callback callback) { + return Utils.doAsync(new Utils.Task(callback) { + @RequiresPermission(INTERNET) + @Override + public Boolean doInBackground() { + return isAvailable(); + } + }); + } + + /** + * Return whether network is available. + *

Must hold {@code }

+ * + * @return {@code true}: yes
{@code false}: no + */ + @RequiresPermission(INTERNET) + public static boolean isAvailable() { + return isAvailableByDns() || isAvailableByPing(null); + } + + /** + * Return whether network is available using ping. + *

Must hold {@code }

+ *

The default ping ip: 223.5.5.5

+ * + * @param callback The callback. + */ + @RequiresPermission(INTERNET) + public static void isAvailableByPingAsync(final Utils.Callback callback) { + isAvailableByPingAsync("", callback); + } + + /** + * Return whether network is available using ping. + *

Must hold {@code }

+ * + * @param ip The ip address. + * @param callback The callback. + */ + @RequiresPermission(INTERNET) + public static Utils.Task isAvailableByPingAsync(final String ip, + @NonNull final Utils.Callback callback) { + return Utils.doAsync(new Utils.Task(callback) { + @RequiresPermission(INTERNET) + @Override + public Boolean doInBackground() { + return isAvailableByPing(ip); + } + }); + } + /** * Return whether network is available using ping. *

Must hold {@code }

@@ -84,7 +145,7 @@ public static boolean isConnected() { */ @RequiresPermission(INTERNET) public static boolean isAvailableByPing() { - return isAvailableByPing(null); + return isAvailableByPing(""); } /** @@ -95,11 +156,9 @@ public static boolean isAvailableByPing() { * @return {@code true}: yes
{@code false}: no */ @RequiresPermission(INTERNET) - public static boolean isAvailableByPing(String ip) { - if (ip == null || ip.length() <= 0) { - ip = "223.5.5.5";// default ping ip - } - ShellUtils.CommandResult result = ShellUtils.execCmd(String.format("ping -c 1 %s", ip), false); + public static boolean isAvailableByPing(final String ip) { + final String realIp = TextUtils.isEmpty(ip) ? "223.5.5.5" : ip; + ShellUtils.CommandResult result = ShellUtils.execCmd(String.format("ping -c 1 %s", realIp), false); boolean ret = result.result == 0; if (result.errorMsg != null) { Log.d("NetworkUtils", "isAvailableByPing() called" + result.errorMsg); @@ -110,14 +169,65 @@ public static boolean isAvailableByPing(String ip) { return ret; } + /** + * Return whether network is available using domain. + *

Must hold {@code }

+ * + * @param callback The callback. + */ + @RequiresPermission(INTERNET) + public static void isAvailableByDnsAsync(final Utils.Callback callback) { + isAvailableByDnsAsync("", callback); + } + /** + * Return whether network is available using domain. + *

Must hold {@code }

+ * + * @param domain The name of domain. + * @param callback The callback. + */ @RequiresPermission(INTERNET) - public static void isAvailableByDns(String ip) { + public static Utils.Task isAvailableByDnsAsync(final String domain, + @NonNull final Utils.Callback callback) { + return Utils.doAsync(new Utils.Task(callback) { + @RequiresPermission(INTERNET) + @Override + public Boolean doInBackground() { + return isAvailableByDns(domain); + } + }); + } + /** + * Return whether network is available using domain. + *

Must hold {@code }

+ * + * @return {@code true}: yes
{@code false}: no + */ + @RequiresPermission(INTERNET) + public static boolean isAvailableByDns() { + return isAvailableByDns(""); } - public interface Callback { - void call(boolean isSuccess); + /** + * Return whether network is available using domain. + *

Must hold {@code }

+ * + * @param domain The name of domain. + * @return {@code true}: yes
{@code false}: no + */ + @RequiresPermission(INTERNET) + public static boolean isAvailableByDns(final String domain) { + final String realDomain = TextUtils.isEmpty(domain) ? "www.baidu.com" : domain; + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(realDomain); + return inetAddress != null; + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return false; } /** @@ -256,7 +366,23 @@ public static boolean isWifiConnected() { */ @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET}) public static boolean isWifiAvailable() { - return getWifiEnabled() && isAvailableByPing(); + return getWifiEnabled() && isAvailable(); + } + + /** + * Return whether wifi is available. + *

Must hold {@code }, + * {@code }

+ */ + @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET}) + public static Utils.Task isWifiAvailableAsync(@NonNull final Utils.Callback callback) { + return Utils.doAsync(new Utils.Task(callback) { + @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET}) + @Override + public Boolean doInBackground() { + return isWifiAvailable(); + } + }); } /** @@ -431,6 +557,25 @@ public static String getBroadcastIpAddress() { return ""; } + /** + * Return the domain address. + *

Must hold {@code }

+ * + * @param domain The name of domain. + * @param callback The callback. + */ + @RequiresPermission(INTERNET) + public static Utils.Task getDomainAddressAsync(final String domain, + @NonNull final Utils.Callback callback) { + return Utils.doAsync(new Utils.Task(callback) { + @RequiresPermission(INTERNET) + @Override + public String doInBackground() { + return getDomainAddress(domain); + } + }); + } + /** * Return the domain address. *

Must hold {@code }

diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java index 7db75522d9..2e24ebc155 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java @@ -149,6 +149,7 @@ public static Set killAllBackgroundProcesses() { //noinspection ConstantConditions List info = am.getRunningAppProcesses(); Set set = new HashSet<>(); + if (info == null) return set; for (ActivityManager.RunningAppProcessInfo aInfo : info) { for (String pkg : aInfo.pkgList) { am.killBackgroundProcesses(pkg); @@ -217,7 +218,7 @@ public static String getCurrentProcessName() { return processName; } catch (Exception e) { e.printStackTrace(); - return null; + return ""; } } diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java index 194ac40ed0..ad343467ea 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java @@ -1,5 +1,7 @@ package com.blankj.utilcode.util; +import android.support.annotation.NonNull; + import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; @@ -22,6 +24,92 @@ private ShellUtils() { throw new UnsupportedOperationException("u can't instantiate me..."); } + /** + * Execute the command asynchronously. + * + * @param command The command. + * @param isRooted True to use root, false otherwise. + * @param callback The callback. + */ + public static void execCmdAsync(final String command, final boolean isRooted, final Utils.Callback callback) { + execCmdAsync(new String[]{command}, isRooted, true, callback); + } + + /** + * Execute the command asynchronously. + * + * @param commands The commands. + * @param isRooted True to use root, false otherwise. + * @param callback The callback. + */ + public static void execCmdAsync(final List commands, final boolean isRooted, final Utils.Callback callback) { + execCmdAsync(commands == null ? null : commands.toArray(new String[]{}), isRooted, true, callback); + } + + /** + * Execute the command asynchronously. + * + * @param commands The commands. + * @param isRooted True to use root, false otherwise. + * @param callback The callback. + */ + public static void execCmdAsync(final String[] commands, final boolean isRooted, final Utils.Callback callback) { + execCmdAsync(commands, isRooted, true, callback); + } + + /** + * Execute the command asynchronously. + * + * @param command The command. + * @param isRooted True to use root, false otherwise. + * @param isNeedResultMsg True to return the message of result, false otherwise. + * @param callback The callback. + */ + public static void execCmdAsync(final String command, + final boolean isRooted, + final boolean isNeedResultMsg, + final Utils.Callback callback) { + execCmdAsync(new String[]{command}, isRooted, isNeedResultMsg, callback); + } + + /** + * Execute the command asynchronously. + * + * @param commands The commands. + * @param isRooted True to use root, false otherwise. + * @param isNeedResultMsg True to return the message of result, false otherwise. + * @param callback The callback. + */ + public static void execCmdAsync(final List commands, + final boolean isRooted, + final boolean isNeedResultMsg, + final Utils.Callback callback) { + execCmdAsync(commands == null ? null : commands.toArray(new String[]{}), + isRooted, + isNeedResultMsg, + callback); + } + + /** + * Execute the command asynchronously. + * + * @param commands The commands. + * @param isRooted True to use root, false otherwise. + * @param isNeedResultMsg True to return the message of result, false otherwise. + * @param callback The callback. + */ + public static Utils.Task execCmdAsync(final String[] commands, + final boolean isRooted, + final boolean isNeedResultMsg, + @NonNull final Utils.Callback callback) { + return Utils.doAsync(new Utils.Task(callback) { + @Override + public CommandResult doInBackground() { + return execCmd(commands, isRooted, isNeedResultMsg); + } + }); + } + /** * Execute the command. * diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java index ba7122e366..56c11a861e 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java @@ -1008,7 +1008,6 @@ public abstract static class Task implements Runnable { public abstract void onFail(Throwable t); - @Override public void run() { try { @@ -1063,6 +1062,10 @@ public void run() { public boolean isCanceled() { return state == CANCELLED; } + + public boolean isDone() { + return state != NEW; + } } private static final class UtilsThreadFactory extends AtomicLong @@ -1096,6 +1099,5 @@ public void run() { t.setPriority(priority); return t; } - } } diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java index b4fe658945..0e2b8bf48d 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java @@ -12,7 +12,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; -import android.os.Looper; import android.os.Message; import android.support.annotation.ColorInt; import android.support.annotation.DrawableRes; @@ -40,7 +39,6 @@ public final class ToastUtils { private static final int COLOR_DEFAULT = 0xFEFFFFFF; - private static final Handler HANDLER = new Handler(Looper.getMainLooper()); private static final String NULL = "null"; private static IToast iToast; @@ -245,7 +243,7 @@ private static void show(final String format, final int duration, final Object.. } private static void show(final CharSequence text, final int duration) { - HANDLER.post(new Runnable() { + Utils.UTIL_HANDLER.post(new Runnable() { @SuppressLint("ShowToast") @Override public void run() { @@ -268,7 +266,7 @@ public void run() { } private static void show(final View view, final int duration) { - HANDLER.post(new Runnable() { + Utils.UTIL_HANDLER.post(new Runnable() { @Override public void run() { cancel(); @@ -487,7 +485,7 @@ public void show() { } } catch (Exception ignored) { /**/ } - HANDLER.postDelayed(new Runnable() { + Utils.UTIL_HANDLER.postDelayed(new Runnable() { @Override public void run() { cancel(); diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java index 52b82376e1..5b82a40e3a 100644 --- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java +++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java @@ -7,6 +7,8 @@ import android.app.Application.ActivityLifecycleCallbacks; import android.content.Context; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.support.v4.content.FileProvider; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -20,6 +22,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** *
@@ -46,10 +50,13 @@ public final class Utils {
             "com.blankj.utilcode.util.PermissionUtils$PermissionActivity";
 
     private static final ActivityLifecycleImpl ACTIVITY_LIFECYCLE = new ActivityLifecycleImpl();
+    private static final ExecutorService       UTIL_POOL          = Executors.newFixedThreadPool(3);
+    static final         Handler               UTIL_HANDLER       = new Handler(Looper.getMainLooper());
 
     @SuppressLint("StaticFieldLeak")
     private static Application sApplication;
 
+
     private Utils() {
         throw new UnsupportedOperationException("u can't instantiate me...");
     }
@@ -156,6 +163,11 @@ static boolean isAppForeground() {
         return false;
     }
 
+    static  Task doAsync(final Task task) {
+        UTIL_POOL.execute(task);
+        return task;
+    }
+
     static class ActivityLifecycleImpl implements ActivityLifecycleCallbacks {
 
         final LinkedList                            mActivityList         = new LinkedList<>();
@@ -371,6 +383,59 @@ public boolean onCreate() {
     // interface
     ///////////////////////////////////////////////////////////////////////////
 
+    public abstract static class Task implements Runnable {
+
+        private static final int NEW         = 0;
+        private static final int COMPLETING  = 1;
+        private static final int CANCELLED   = 2;
+        private static final int EXCEPTIONAL = 3;
+
+        private volatile int state = NEW;
+
+        abstract Result doInBackground();
+
+        private Callback mCallback;
+
+        public Task(final Callback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void run() {
+            try {
+                final Result t = doInBackground();
+
+                if (state != NEW) return;
+                state = COMPLETING;
+                UTIL_HANDLER.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mCallback.onCall(t);
+                    }
+                });
+            } catch (Throwable th) {
+                if (state != NEW) return;
+                state = EXCEPTIONAL;
+            }
+        }
+
+        public void cancel() {
+            state = CANCELLED;
+        }
+
+        public boolean isDone() {
+            return state != NEW;
+        }
+
+        public boolean isCanceled() {
+            return state == CANCELLED;
+        }
+    }
+
+    public interface Callback {
+        void onCall(T data);
+    }
+
     public interface OnAppStatusChangedListener {
         void onForeground();
 
diff --git a/utilcode/pkg/src/main/AndroidManifest.xml b/utilcode/pkg/src/main/AndroidManifest.xml
index 6559682d6e..4f85cbc32e 100644
--- a/utilcode/pkg/src/main/AndroidManifest.xml
+++ b/utilcode/pkg/src/main/AndroidManifest.xml
@@ -44,8 +44,7 @@
             android:name=".feature.activity.ActivityActivity"
             android:icon="@drawable/activity_activity_icon"
             android:launchMode="singleTop"
-            android:logo="@drawable/activity_activity_logo"
-            android:process=":remote" />
+            android:logo="@drawable/activity_activity_logo" />
         
@@ -100,6 +99,13 @@
         
+        
+        
         
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
index 8cc49383a6..e6d2c3dd54 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/CoreUtilActivity.kt
@@ -35,8 +35,6 @@ import com.blankj.utilcode.pkg.feature.span.SpanActivity
 import com.blankj.utilcode.pkg.feature.toast.ToastActivity
 import com.blankj.utilcode.pkg.feature.vibrate.VibrateActivity
 import com.blankj.utilcode.util.BusUtils
-import com.blankj.utilcode.util.LogUtils
-import com.blankj.utilcode.util.MessengerUtils
 
 /**
  * ```
@@ -63,11 +61,6 @@ class CoreUtilActivity : BaseTitleBarActivity() {
     override fun initData(bundle: Bundle?) {}
 
     override fun bindLayout(): Int {
-        MessengerUtils.subscribe("core", object: MessengerUtils.MessageCallback {
-            override fun onMsgCallBack(data: Bundle?) {
-                LogUtils.eTag("Messenger", data)
-            }
-        })
         return R.layout.activity_util_core
     }
 
@@ -101,6 +94,10 @@ class CoreUtilActivity : BaseTitleBarActivity() {
         CleanActivity.start(this)
     }
 
+    fun busClick(view: View) {
+        BusUtils.postStatic("BusActivity#start", this)
+    }
+
     fun crashClick(view: View) {
         throw NullPointerException("crash test")
     }
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index 2d443d6849..5ace21f5b1 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -12,7 +12,10 @@ import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.pkg.feature.CoreUtilActivity
-import com.blankj.utilcode.util.*
+import com.blankj.utilcode.util.ActivityUtils
+import com.blankj.utilcode.util.AppUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.SpanUtils
 import kotlinx.android.synthetic.main.activity_activity.*
 import java.util.*
 
@@ -48,16 +51,6 @@ class ActivityActivity : BaseTitleBarActivity() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
         }
-        var bundle = Bundle()
-        bundle.putString("activity", "ActivityActivity");
-        MessengerUtils.post("core", bundle)
-
-        MessengerUtils.subscribe("activity", object: MessengerUtils.MessageCallback {
-            override fun onMsgCallBack(data: Bundle?) {
-                LogUtils.eTag("Messenger", data)
-            }
-        })
-
         return R.layout.activity_activity
     }
 
@@ -113,12 +106,7 @@ class ActivityActivity : BaseTitleBarActivity() {
 
     override fun onWidgetClick(view: View) {
         when (view.id) {
-            R.id.activityClzBtn -> {
-                var bundle = Bundle()
-                bundle.putString("activity", "ActivityActivity");
-                MessengerUtils.post("activity", bundle)
-            }
-//            R.id.activityClzBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java)
+            R.id.activityClzBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java)
             R.id.activityClzOptBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java,
                     getOption(random.nextInt(5)))
             R.id.activityClzAnimBtn -> ActivityUtils.startActivity(SubActivityActivity::class.java,
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
index 9988539b9c..442207f5d3 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
@@ -65,7 +65,8 @@ class AppActivity : BaseTitleBarActivity() {
                 .appendLine("isAppRoot: " + AppUtils.isAppRoot())
                 .appendLine("isAppDebug: " + AppUtils.isAppDebug())
                 .appendLine("isAppSystem: " + AppUtils.isAppSystem())
-                .appendLine("isAppForeground: " + AppUtils.isAppForeground())
+                .appendLine("isAppForeground: " + AppUtils.isAppForeground("com.blankj.androidutilcode"))
+                .appendLine("isAppRunning: " + AppUtils.isAppRunning("com.blankj.androidutilcode"))
                 .append("getAppIcon: ").appendImage(AppUtils.getAppIcon(), SpanUtils.ALIGN_CENTER)
                 .appendLine()
                 .appendLine("getAppPackageName: " + AppUtils.getAppPackageName())
@@ -76,6 +77,7 @@ class AppActivity : BaseTitleBarActivity() {
                 .appendLine("getAppSignatureSHA1: " + AppUtils.getAppSignatureSHA1())
                 .appendLine("getAppSignatureSHA256: " + AppUtils.getAppSignatureSHA256())
                 .appendLine("getAppSignatureMD5: " + AppUtils.getAppSignatureMD5())
+                .appendLine("getAppUid: " + AppUtils.getAppUid())
                 .append("getApkInfo: " + AppUtils.getApkInfo(AppUtils.getAppPath()))
                 .create()
     }
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt
new file mode 100644
index 0000000000..d498370306
--- /dev/null
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt
@@ -0,0 +1,72 @@
+package com.blankj.utilcode.pkg.feature.bus
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import com.blankj.lib.base.BaseTitleBarActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.BusUtils
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.MessengerUtils
+import kotlinx.android.synthetic.main.activity_bus.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog  : http://blankj.com
+ * time  : 2019/03/12
+ * desc  : demo about BusUtils
+ * ```
+ */
+class BusActivity : BaseTitleBarActivity() {
+
+    companion object {
+        const val BUS_KEY = "BusActivity"
+
+        @BusUtils.Subscribe(name = "BusActivity#start")
+        fun start(context: Context) {
+            val starter = Intent(context, BusActivity::class.java)
+            context.startActivity(starter)
+        }
+
+        val BUNDLE = Bundle()
+
+        init {
+            BUNDLE.putString("activity", "BusActivity")
+        }
+    }
+
+    override fun bindTitle(): CharSequence {
+        return getString(R.string.demo_bus)
+    }
+
+    override fun initData(bundle: Bundle?) {}
+
+    override fun bindLayout(): Int {
+        return R.layout.activity_bus
+    }
+
+    override fun initView(savedInstanceState: Bundle?, contentView: View) {
+        busStartRemoteBtn.setOnClickListener(this)
+        busPostBtn.setOnClickListener(this)
+    }
+
+    override fun doBusiness() {
+        MessengerUtils.subscribe(BUS_KEY, object : MessengerUtils.MessageCallback {
+            override fun onMsgCallBack(data: Bundle?) {
+                LogUtils.eTag("MessengerUtils", data)
+            }
+        })
+    }
+
+    override fun onWidgetClick(view: View) {
+        when (view.id) {
+            R.id.busStartRemoteBtn -> BusRemoteActivity.start(this)
+            R.id.busPostBtn -> {
+                MessengerUtils.post(BUS_KEY, BUNDLE)
+                MessengerUtils.post(BusRemoteActivity.BUS_KEY, BusRemoteActivity.BUNDLE)
+            }
+        }
+    }
+}
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusRemoteActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusRemoteActivity.kt
new file mode 100644
index 0000000000..41ec18f8fb
--- /dev/null
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusRemoteActivity.kt
@@ -0,0 +1,67 @@
+package com.blankj.utilcode.pkg.feature.bus
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import com.blankj.lib.base.BaseTitleBarActivity
+import com.blankj.utilcode.pkg.R
+import com.blankj.utilcode.util.LogUtils
+import com.blankj.utilcode.util.MessengerUtils
+import kotlinx.android.synthetic.main.activity_bus_remote.*
+
+/**
+ * ```
+ * author: Blankj
+ * blog  : http://blankj.com
+ * time  : 2019/03/12
+ * desc  : demo about BusUtils
+ * ```
+ */
+class BusRemoteActivity : BaseTitleBarActivity() {
+
+    companion object {
+        const val BUS_KEY = "BusRemoteActivity"
+
+        fun start(context: Context) {
+            val starter = Intent(context, BusRemoteActivity::class.java)
+            context.startActivity(starter)
+        }
+
+        val BUNDLE = Bundle()
+
+        init {
+            BUNDLE.putString("activity", "BusRemoteActivity")
+        }
+    }
+
+    override fun bindTitle(): CharSequence {
+        return getString(R.string.demo_bus)
+    }
+
+    override fun initData(bundle: Bundle?) {}
+
+    override fun bindLayout(): Int {
+        return R.layout.activity_bus_remote
+    }
+
+    override fun initView(savedInstanceState: Bundle?, contentView: View) {
+        busRemotePostBtn.setOnClickListener(this)
+        busRemotePost2MainBtn.setOnClickListener(this)
+    }
+
+    override fun doBusiness() {
+        MessengerUtils.subscribe(BUS_KEY, object : MessengerUtils.MessageCallback {
+            override fun onMsgCallBack(data: Bundle?) {
+                LogUtils.eTag("MessengerUtils", data)
+            }
+        })
+    }
+
+    override fun onWidgetClick(view: View) {
+        when (view.id) {
+            R.id.busRemotePostBtn -> MessengerUtils.post(BUS_KEY, BUNDLE)
+            R.id.busRemotePost2MainBtn -> MessengerUtils.post(BusActivity.BUS_KEY, BusActivity.BUNDLE)
+        }
+    }
+}
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
index c442e54381..28b3327aa6 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
@@ -10,7 +10,7 @@ import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.util.AppUtils
 import com.blankj.utilcode.util.NetworkUtils
 import com.blankj.utilcode.util.SpanUtils
-import com.blankj.utilcode.util.ThreadUtils
+import com.blankj.utilcode.util.Utils
 import kotlinx.android.synthetic.main.activity_network.*
 
 /**
@@ -23,6 +23,9 @@ import kotlinx.android.synthetic.main.activity_network.*
  */
 class NetworkActivity : BaseTitleBarActivity() {
 
+    var cur: Int = 0
+    var count: Int = 0;
+
     companion object {
         fun start(context: Context) {
             val starter = Intent(context, NetworkActivity::class.java)
@@ -30,20 +33,7 @@ class NetworkActivity : BaseTitleBarActivity() {
         }
     }
 
-    private lateinit var spannableStringBuilder: SpannableStringBuilder
-
-    private var mSimpleTask = object : ThreadUtils.SimpleTask() {
-        override fun doInBackground(): CharSequence? {
-            return SpanUtils().appendLine(spannableStringBuilder)
-                    .appendLine("isAvailableByPing: " + NetworkUtils.isAvailableByPing())
-                    .append("getBaiduDomainAddress: " + NetworkUtils.getDomainAddress("baidu.com"))
-                    .create()
-        }
-
-        override fun onSuccess(result: CharSequence?) {
-            result?.run { networkAboutTv.text = this }
-        }
-    }
+    private lateinit var spanSb: SpannableStringBuilder
 
     override fun bindTitle(): CharSequence {
         return getString(R.string.demo_network)
@@ -80,9 +70,7 @@ class NetworkActivity : BaseTitleBarActivity() {
         updateAboutNetwork()
     }
 
-    override fun doBusiness() {
-        ThreadUtils.executeBySingle(mSimpleTask)
-    }
+    override fun doBusiness() {}
 
     override fun onWidgetClick(view: View) {
         when (view.id) {
@@ -91,15 +79,18 @@ class NetworkActivity : BaseTitleBarActivity() {
         updateAboutNetwork()
     }
 
+    private lateinit var wifiAvailableAsyncTask: Utils.Task
+    private lateinit var availableAsyncTask: Utils.Task
+    private lateinit var domainAddressAsyncTask: Utils.Task
+
     private fun updateAboutNetwork() {
-        spannableStringBuilder = SpanUtils.with(networkAboutTv)
+        spanSb = SpanUtils.with(networkAboutTv)
                 .appendLine("isConnected: " + NetworkUtils.isConnected())
                 .appendLine("getMobileDataEnabled: " + NetworkUtils.getMobileDataEnabled())
                 .appendLine("isMobileData: " + NetworkUtils.isMobileData())
                 .appendLine("is4G: " + NetworkUtils.is4G())
                 .appendLine("getWifiEnabled: " + NetworkUtils.getWifiEnabled())
                 .appendLine("isWifiConnected: " + NetworkUtils.isWifiConnected())
-                .appendLine("isWifiAvailable: " + NetworkUtils.isWifiAvailable())
                 .appendLine("getNetworkOperatorName: " + NetworkUtils.getNetworkOperatorName())
                 .appendLine("getNetworkTypeName: " + NetworkUtils.getNetworkType())
                 .appendLine("getIPv4Address: " + NetworkUtils.getIPAddress(true))
@@ -110,11 +101,33 @@ class NetworkActivity : BaseTitleBarActivity() {
                 .appendLine("getNetMaskByWifi: " + NetworkUtils.getNetMaskByWifi())
                 .append("getServerAddressByWifi: " + NetworkUtils.getServerAddressByWifi())
                 .create()
-        ThreadUtils.executeBySingle(mSimpleTask)
+
+        wifiAvailableAsyncTask = NetworkUtils.isWifiAvailableAsync { data ->
+            spanSb = SpanUtils().appendLine(spanSb)
+                    .append("isWifiAvailable: $data")
+                    .create()
+            networkAboutTv.text = spanSb
+        }
+
+        availableAsyncTask = NetworkUtils.isAvailableAsync { data ->
+            spanSb = SpanUtils().appendLine(spanSb)
+                    .append("isAvailable: $data")
+                    .create()
+            networkAboutTv.text = spanSb
+        }
+
+        domainAddressAsyncTask = NetworkUtils.getDomainAddressAsync("baidu.com") { data ->
+            spanSb = SpanUtils().appendLine(spanSb)
+                    .append("getBaiduDomainAddress: $data")
+                    .create()
+            networkAboutTv.text = spanSb
+        }
     }
 
     override fun onDestroy() {
-        mSimpleTask.cancel()
+        wifiAvailableAsyncTask.cancel()
+        availableAsyncTask.cancel()
+        domainAddressAsyncTask.cancel()
         super.onDestroy()
     }
 }
diff --git a/utilcode/pkg/src/main/res/layout/activity_bus.xml b/utilcode/pkg/src/main/res/layout/activity_bus.xml
new file mode 100644
index 0000000000..3f4199219a
--- /dev/null
+++ b/utilcode/pkg/src/main/res/layout/activity_bus.xml
@@ -0,0 +1,24 @@
+
+
+
+    
- */ -public class AppStoreUtils { - - private static final String TAG = "AppStoreUtils"; - - private static final String larkPkg = "com.ss.android.lark"; - - private static ArrayMap appStore; - - /** - * 判断手机是否有应用商店 - */ - public static boolean hasAppStore(final Context context) { - if (context == null) return false; - Uri uri = Uri.parse("appStore://details?id=" + larkPkg); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return getAvailableIntentSize(context, intent) > 0; - } - - /** - * 跳转到应用商店的 lark 页面 - * 默认跳转 - */ - public static void go2AppStoreAtLarkPage(final Context context) { - if (context == null) return; - try { - Uri uri = Uri.parse("appStore://details?id=" + larkPkg); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - int availableIntentSize = getAvailableIntentSize(context, intent); - if (availableIntentSize == 0) { - LogUtils.e(TAG, "No app store!"); - } else if (availableIntentSize == 1) { - context.startActivity(intent); - LogUtils.e(TAG, "Show app store"); - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - int systemSize = context.getPackageManager() - .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY) - .size();// 获取系统商店个数 - if (systemSize > 0) { - go2FirstAppStore(context, intent, PackageManager.MATCH_SYSTEM_ONLY); - return; - } - } - go2AppStoreWithPriority(context, intent); - } - } catch (Exception e) { - LogUtils.e(TAG, e.toString()); - } - } - - private static void go2AppStoreWithPriority(final Context context, final Intent intent) { - if (appStore == null) { - appStore = new ArrayMap<>(); - appStore.put("yingyongbao", "com.tencent.android.qqdownloader"); - appStore.put("360", "com.qihoo.appstore"); - appStore.put("wandoujia", "com.wandoujia.phoenix2"); - appStore.put("xiaomi", "com.xiaomi.shop"); - appStore.put("oppo", "com.oppo.appStore"); - appStore.put("huawei", "com.huawei.appmarket"); - appStore.put("meizu", "com.meizu.mstore"); - appStore.put("vivo", "com.bbk.appstore"); - appStore.put("sanxing", "com.sec.android.app.samsungapps"); - appStore.put("baidu", "com.baidu.appsearch"); - appStore.put("sougou", "com.sogou.appmall"); - appStore.put("yingyonghui", "com.yingyonghui.appStore"); - appStore.put("anzhi", "cn.goapk.appStore"); - } - - List list = getAppStoreList(); - if (list == null || list.isEmpty()) {// 商店列表为空则默认跳转到第一个 - go2FirstAppStore(context, intent, PackageManager.MATCH_DEFAULT_ONLY); - return; - } - for (String s : list) { - String pkgName = appStore.get(s); - if (pkgName != null) { - intent.setPackage(pkgName); - if (getAvailableIntentSize(context, intent) > 0) { - go2FirstAppStore(context, intent, PackageManager.MATCH_DEFAULT_ONLY); - return; - } - } - } - - go2FirstAppStore(context, intent, PackageManager.MATCH_DEFAULT_ONLY); - } - - private static List getAppStoreList() { - return null; - } - - private static void go2FirstAppStore(Context context, Intent intent, int matchDefaultOnly) { - String packageName = context.getPackageManager() - .queryIntentActivities(intent, matchDefaultOnly) - .get(0).activityInfo.packageName; - intent.setPackage(packageName); - context.startActivity(intent); - } - - private static int getAvailableIntentSize(Context context, final Intent intent) { - return context.getPackageManager() - .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) - .size(); - } -} diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt index 5d8573376c..cb9efb9d50 100644 --- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt +++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt @@ -59,7 +59,7 @@ class PermissionActivity : BaseTitleActivity() { override fun onResume() { super.onResume() - updateAboutPermission() + Utils.runOnUiThreadDelayed(Runnable(this@PermissionActivity::updateAboutPermission), 100) } override fun doBusiness() {} @@ -182,6 +182,5 @@ class PermissionActivity : BaseTitleActivity() { appendLine("DRAW_OVERLAYS: " + PermissionUtils.isGrantedDrawOverlays()) } } - .create() } } diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt index dd79cdb5ee..344a69e448 100644 --- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt +++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt @@ -28,7 +28,6 @@ object DialogHelper { fun showRationaleDialog(shouldRequest: ShouldRequest) { val topActivity = ActivityUtils.getTopActivity() - if (!ActivityUtils.isActivityAlive(topActivity)) return AlertDialog.Builder(topActivity) .setTitle(android.R.string.dialog_alert_title) .setMessage(R.string.permission_rationale_message) @@ -41,7 +40,6 @@ object DialogHelper { fun showOpenAppSettingDialog() { val topActivity = ActivityUtils.getTopActivity() - if (!ActivityUtils.isActivityAlive(topActivity)) return AlertDialog.Builder(topActivity) .setTitle(android.R.string.dialog_alert_title) .setMessage(R.string.permission_denied_forever_message) @@ -54,7 +52,6 @@ object DialogHelper { fun showKeyboardDialog() { val topActivity = ActivityUtils.getTopActivity() - if (!ActivityUtils.isActivityAlive(topActivity)) return val dialog = Dialog(topActivity) val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_keyboard, null) @@ -94,7 +91,6 @@ object DialogHelper { fun showFragmentDialog(info: CharSequence) { val topActivity = ActivityUtils.getTopActivity() - if (!ActivityUtils.isActivityAlive(topActivity)) return val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_fragment, null) val aboutTv = dialogView.findViewById(R.id.fragmentDialogAboutTv) aboutTv.movementMethod = ScrollingMovementMethod.getInstance() @@ -105,7 +101,6 @@ object DialogHelper { fun showScreenshotDialog(screenshot: Bitmap) { val topActivity = ActivityUtils.getTopActivity() - if (!ActivityUtils.isActivityAlive(topActivity)) return val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_screen, null) val screenshotIv = dialogView.findViewById(R.id.screenDialogScreenshotIv) screenshotIv.setImageBitmap(screenshot) @@ -115,7 +110,6 @@ object DialogHelper { fun showToastDialog() { val topActivity = ActivityUtils.getTopActivity() - if (!ActivityUtils.isActivityAlive(topActivity)) return val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_toast, null) dialogView.findViewById
*/ -public abstract class BaseItem> { +public abstract class BaseItem { private static final SparseIntArray LAYOUT_SPARSE_ARRAY = new SparseIntArray(); private static final SparseArray VIEW_SPARSE_ARRAY = new SparseArray<>(); @@ -80,12 +80,12 @@ private int getViewTypeByView(@NonNull View view) { } public void update() { - int index = getIndex(); - if (index == -1) return; - getAdapter().notifyItemChanged(index); + //noinspection unchecked + getAdapter().updateItem((T) this); } public int getIndex() { + //noinspection SuspiciousMethodCalls return getAdapter().getItems().indexOf(this); } } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java index 0a86944237..85d6b62cab 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/rv/BaseItemAdapter.java @@ -17,9 +17,9 @@ * desc : *
*/ -public class BaseItemAdapter> extends RecyclerView.Adapter { +public class BaseItemAdapter extends RecyclerView.Adapter { - public List mItems; + public List mItems; private RecyclerView mRecyclerView; public BaseItemAdapter() { @@ -150,6 +150,17 @@ public int removeItemById(final long id, boolean notifyRemoved) { // operate /////////////////////////////////////////////////////////////////////////// + public void updateItem(@NonNull final Item item) { + int itemIndex = mItems.indexOf(item); + if (itemIndex != -1) { + notifyItemChanged(itemIndex); + } + } + + public void updateItem(@IntRange(from = 0) final int index) { + notifyItemChanged(index); + } + public void addItem(@NonNull final Item item) { addItem(item, false); } @@ -210,10 +221,10 @@ public boolean replaceItems(@NonNull final List items) { return replaceItems(items, false); } - public boolean replaceItems(@NonNull final List items, boolean notifyDataSetChanged) { + public boolean replaceItems(@NonNull final List items, boolean notifyChanged) { mItems.clear(); boolean added = mItems.addAll(items); - if (notifyDataSetChanged) notifyDataSetChanged(); + if (notifyChanged) notifyDataSetChanged(); return added; } @@ -227,12 +238,12 @@ public Item removeItem(@IntRange(from = 0) final int index, boolean notifyRemove return removedItem; } - public int removeItem(@NonNull final Item object) { - return removeItem(object, false); + public int removeItem(@NonNull final Item item) { + return removeItem(item, false); } - public int removeItem(@NonNull final Item object, boolean notifyRemoved) { - int itemIndex = mItems.indexOf(object); + public int removeItem(@NonNull final Item item, boolean notifyRemoved) { + int itemIndex = mItems.indexOf(item); if (itemIndex != -1) { mItems.remove(itemIndex); if (notifyRemoved) notifyItemRemoved(itemIndex); diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java index bf61920d29..c1d956eb40 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseContentFloatView.java @@ -1,5 +1,6 @@ package com.blankj.utildebug.base.view; +import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.support.annotation.LayoutRes; import android.support.annotation.StringRes; @@ -9,6 +10,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -16,11 +18,11 @@ import com.blankj.utilcode.util.ClickUtils; import com.blankj.utilcode.util.SizeUtils; import com.blankj.utilcode.util.StringUtils; +import com.blankj.utilcode.util.TouchUtils; import com.blankj.utildebug.R; -import com.blankj.utildebug.base.drawable.ShadowUtils; import com.blankj.utildebug.base.view.listener.OnRefreshListener; import com.blankj.utildebug.config.DebugConfig; -import com.blankj.utildebug.helper.TouchHelper; +import com.blankj.utildebug.helper.ShadowHelper; import com.blankj.utildebug.helper.WindowHelper; import java.util.Stack; @@ -37,6 +39,7 @@ public abstract class BaseContentFloatView> ex private static final int ROTATE_DELAY = 30; + private LinearLayout bcfRootLayout; private RelativeLayout bcfTitleRl; private ImageView bcfCloseIv; private TextView bcfTitleTv; @@ -44,7 +47,6 @@ public abstract class BaseContentFloatView> ex private SwipePanel swipePanel; private BaseContentView mContentView; - private int mTitleBarHeight; private OnRefreshListener mRefreshListener; private Runnable mRotateRunnable = new Runnable() { @Override @@ -74,10 +76,11 @@ public int bindLayout() { } public BaseContentFloatView() { + bcfRootLayout = findViewById(R.id.bcfRootLayout); + ShadowHelper.applyFloatView(bcfRootLayout); + initTitleBar(); initSwipePanel(); - View bcfRootLl = findViewById(R.id.bcfRootLl); - ShadowUtils.apply(bcfRootLl, new ShadowUtils.Builder().setShadowRadius(SizeUtils.dp2px(8))); if (bindContentLayout() != NO_ID) { //noinspection unchecked @@ -92,20 +95,6 @@ public void onAttach() { } }.attach((T) this, true); } - - if (mLayoutParams.height == WindowManager.LayoutParams.WRAP_CONTENT) { - post(new Runnable() { - @Override - public void run() { - int contentHeight = 0; - if (mContentView != null) { - contentHeight = mContentView.getHeight(); - } - mLayoutParams.height = contentHeight + bcfTitleRl.getHeight() + SizeUtils.dp2px(8 + 8 + 4); - WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); - } - }); - } } public void setTitle(CharSequence title) { @@ -165,9 +154,9 @@ public BaseContentView getContentView() { @Override protected void onDetachedFromWindow() { - DebugConfig.saveFloatViewY(this, mLayoutParams.y); - DebugConfig.saveFloatViewHeight(this, mLayoutParams.height); - DebugConfig.saveFloatViewAlpha(this, mLayoutParams.alpha); + DebugConfig.saveViewY(this, mLayoutParams.y); + DebugConfig.saveViewHeight(this, mLayoutParams.height); + DebugConfig.saveViewAlpha(this, mLayoutParams.alpha); super.onDetachedFromWindow(); } @@ -188,23 +177,15 @@ private void initTitleBar() { bcfTitleTv = findViewById(R.id.bcfTitleTv); bcfAdjustIv = findViewById(R.id.bcfAdjustIv); - bcfCloseIv.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - dismiss(); - } - }); - ClickUtils.applyPressedBgDark(bcfTitleRl); - ClickUtils.applyPressedBgDark(bcfCloseIv, 0.8f); - ClickUtils.applyPressedBgDark(bcfAdjustIv, 0.8f); - bcfTitleTv.setText(bindTitle()); + ClickUtils.applyPressedBgDark(bcfTitleRl); bcfTitleRl.setOnClickListener(new ClickUtils.OnMultiClickListener(2) { @Override public void onTriggerClick(View v) { mLayoutParams.alpha = mLayoutParams.alpha == 0.5f ? 1f : 0.5f; WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + DebugConfig.saveViewAlpha(BaseContentFloatView.this, mLayoutParams.alpha); } @Override @@ -214,53 +195,76 @@ public void onBeforeTriggerClick(View v, int count) { } } }); - TouchHelper.applyDrag(bcfTitleRl, new TouchHelper.OnDragListener() { + TouchUtils.setOnTouchListener(bcfTitleRl, new TouchUtils.OnTouchUtilsListener() { @Override - public void onDown(View v, int x, int y, MotionEvent event) { + public boolean onDown(View view, int x, int y, MotionEvent event) { + return true; } @Override - public void onMove(View view, int x, int y, int dx, int dy, MotionEvent event) { -// bcfTitleTv.setText("(" + mLayoutParams.x + ", " + mLayoutParams.y + ")" + mLayoutParams.height); - mLayoutParams.y = Math.min(Math.max(mLayoutParams.y - dy, 0), WindowHelper.getAppWindowHeight() - getWindowHeight()); + public boolean onMove(View view, int direction, int x, int y, int dx, int dy, int totalX, int totalY, MotionEvent event) { + mLayoutParams.y = Math.min(Math.max(mLayoutParams.y + dy, 0), WindowHelper.getAppWindowHeight() - bcfRootLayout.getHeight()); WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + return true; } @Override - public void onStop(View view, int x, int y, MotionEvent event) { + public boolean onStop(View view, int direction, int x, int y, int totalX, int totalY, int vx, int vy, MotionEvent event) { + DebugConfig.saveViewY(BaseContentFloatView.this, mLayoutParams.y); + return true; } }); + ClickUtils.applyPressedBgDark(bcfCloseIv, 0.8f); + bcfCloseIv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + + ClickUtils.applyPressedBgDark(bcfAdjustIv, 0.8f); bcfAdjustIv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FloatToast.showLong(FloatToast.WARNING, StringUtils.getString(R.string.du_adjust_tips)); } }); - TouchHelper.applyDrag(bcfAdjustIv, new TouchHelper.OnDragListener() { + TouchUtils.setOnTouchListener(bcfAdjustIv, new TouchUtils.OnTouchUtilsListener() { + + private int minHeight; @Override - public void onDown(View v, int x, int y, MotionEvent event) { - if (mTitleBarHeight == 0) { - mTitleBarHeight = findViewById(R.id.bcfTitleRl).getHeight(); - } + public boolean onDown(View view, int x, int y, MotionEvent event) { + int[] locations = new int[2]; + getLocationOnScreen(locations); + mLayoutParams.height = WindowHelper.getAppWindowHeight() - locations[1]; + WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + + minHeight = bcfTitleRl.getHeight() + SizeUtils.dp2px(30); + return true; } @Override - public void onMove(View view, int x, int y, int dx, int dy, MotionEvent event) { -// bcfTitleTv.setText("(" + mLayoutParams.x + ", " + mLayoutParams.y + ")" + mLayoutParams.height); - mLayoutParams.height = Math.min(Math.max(getWindowHeight() - dy, mTitleBarHeight + SizeUtils.dp2px(30)), WindowHelper.getAppWindowHeight() - mLayoutParams.y); - WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + public boolean onMove(View view, int direction, int x, int y, int dx, final int dy, int totalX, int totalY, MotionEvent event) { + ViewGroup.LayoutParams layoutParams = bcfRootLayout.getLayoutParams(); + layoutParams.height = Math.min(Math.max(bcfRootLayout.getHeight() + dy, minHeight), mLayoutParams.height); + bcfRootLayout.setLayoutParams(layoutParams); + return true; } @Override - public void onStop(View view, int x, int y, MotionEvent event) { + public boolean onStop(View view, int direction, int x, int y, int totalX, int totalY, int vx, int vy, MotionEvent event) { + mLayoutParams.height = bcfRootLayout.getHeight(); + WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + DebugConfig.saveViewHeight(BaseContentFloatView.this, mLayoutParams.height); + return true; } }); } private void initSwipePanel() { - swipePanel = findViewById(R.id.baseFloatSwipePanel); + swipePanel = findViewById(R.id.bcfSwipePanel); swipePanel.setOnFullSwipeListener(new SwipePanel.OnFullSwipeListener() { @Override public void onFullSwipe(int direction) { @@ -304,18 +308,39 @@ private void stopRotate() { @Override protected void onCreateLayoutParams() { super.onCreateLayoutParams(); - mLayoutParams.gravity = Gravity.CENTER | Gravity.BOTTOM; + mLayoutParams.gravity = Gravity.TOP; mLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; + mLayoutParams.height = DebugConfig.getViewHeight(BaseContentFloatView.this, WindowManager.LayoutParams.WRAP_CONTENT); mLayoutParams.windowAnimations = R.style.FloatAnimation; - mLayoutParams.height = DebugConfig.getFloatViewHeight(this); - mLayoutParams.y = DebugConfig.getFloatViewY(this); - mLayoutParams.alpha = DebugConfig.getFloatViewAlpha(this); + mLayoutParams.alpha = DebugConfig.getViewAlpha(this); + mLayoutParams.y = DebugConfig.getViewY(this); + post(new Runnable() { + @Override + public void run() { + wrapWindow(); + } + }); } - private int getWindowHeight() { - if (mLayoutParams.height == WindowManager.LayoutParams.WRAP_CONTENT) { - return BaseContentFloatView.this.getHeight(); + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + wrapWindow(); + } + + private void wrapWindow() { + int[] locations = new int[2]; + getLocationOnScreen(locations); + int floatViewHeight = DebugConfig.getViewHeight(BaseContentFloatView.this, bcfRootLayout.getHeight()); + if (locations[1] + floatViewHeight > WindowHelper.getAppWindowHeight()) { + floatViewHeight = WindowHelper.getAppWindowHeight() - locations[1]; } - return mLayoutParams.height; + mLayoutParams.height = floatViewHeight; + + WindowHelper.updateViewLayout(BaseContentFloatView.this, mLayoutParams); + + ViewGroup.LayoutParams layoutParams = bcfRootLayout.getLayoutParams(); + layoutParams.height = mLayoutParams.height; + bcfRootLayout.setLayoutParams(layoutParams); } } \ No newline at end of file diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java index 70c21d3a6f..4db1374806 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/BaseFloatView.java @@ -11,7 +11,6 @@ import com.blankj.utilcode.util.ActivityUtils; import com.blankj.utilcode.util.AppUtils; -import com.blankj.utilcode.util.LogUtils; import com.blankj.utilcode.util.Utils; import com.blankj.utildebug.DebugUtils; import com.blankj.utildebug.R; @@ -39,10 +38,10 @@ public abstract class BaseFloatView extends RelativeLayout public BaseFloatView() { super(DebugUtils.getApp()); setId(R.id.baseFloatView); - inflate(getContext(), bindLayout(), this); + if (bindLayout() != NO_ID) { + inflate(getContext(), bindLayout(), this); + } onCreateLayoutParams(); - -// ShadowHelper.applyFloatView(this); } void createFloatView() { @@ -60,6 +59,11 @@ protected void onCreateLayoutParams() { } mLayoutParams.format = PixelFormat.TRANSPARENT; mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + try { + int currentFlags = (Integer) mLayoutParams.getClass().getField("privateFlags").get(mLayoutParams); + mLayoutParams.getClass().getField("privateFlags").set(mLayoutParams, currentFlags | 0x00000040); + } catch (Exception ignore) { + } } public void show() { @@ -78,7 +82,7 @@ public WindowManager.LayoutParams getLayoutParams() { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - AppUtils.registerAppStatusChangedListener(this, this); + AppUtils.registerAppStatusChangedListener(this); } @Override @@ -88,12 +92,12 @@ protected void onDetachedFromWindow() { } @Override - public void onForeground() { + public void onForeground(Activity activity) { setVisibility(VISIBLE); } @Override - public void onBackground() { + public void onBackground(Activity activity) { setVisibility(GONE); } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java index f70c31ea8a..9bb78cefd5 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatEditText.java @@ -56,7 +56,8 @@ public void bindFloatView(final BaseContentFloatView floatView) { public void onFocusChange(View v, boolean hasFocus) { WindowManager.LayoutParams params = floatView.getLayoutParams(); if ((params.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) { - params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + params.flags = params.flags & ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + params.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; WindowHelper.updateViewLayout(floatView, params); KeyboardUtils.showSoftInput(v); } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java index fea236749d..59a3b4c494 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/base/view/FloatViewManager.java @@ -2,6 +2,7 @@ import android.view.WindowManager; +import com.blankj.utilcode.util.Utils; import com.blankj.utildebug.helper.WindowHelper; import java.util.ArrayList; @@ -31,16 +32,26 @@ private static final class LazyHolder { private static final FloatViewManager INSTANCE = new FloatViewManager(); } - public void show(BaseFloatView view) { - if (mFloatViews.contains(view)) return; - view.createFloatView(); - mWM.addView(view, view.getLayoutParams()); - mFloatViews.add(view); + public void show(final BaseFloatView view) { + Utils.runOnUiThread(new Runnable() { + @Override + public void run() { + if (mFloatViews.contains(view)) return; + view.createFloatView(); + mWM.addView(view, view.getLayoutParams()); + mFloatViews.add(view); + } + }); } - public void dismiss(BaseFloatView view) { - if (!mFloatViews.contains(view)) return; - mWM.removeView(view); - mFloatViews.remove(view); + public void dismiss(final BaseFloatView view) { + Utils.runOnUiThread(new Runnable() { + @Override + public void run() { + if (!mFloatViews.contains(view)) return; + mWM.removeView(view); + mFloatViews.remove(view); + } + }); } } diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java b/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java index 6933dee4a2..6d15b4fc3b 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/config/DebugConfig.java @@ -1,10 +1,9 @@ package com.blankj.utildebug.config; -import android.view.WindowManager; +import android.view.View; import com.blankj.utilcode.util.SPUtils; import com.blankj.utilcode.util.ScreenUtils; -import com.blankj.utildebug.base.view.BaseContentFloatView; /** *
@@ -44,28 +43,64 @@ public static boolean isNoMoreReminder() {
         return getSp().getBoolean(NO_MORE_REMINDER, false);
     }
 
-    public static void saveFloatViewY(BaseContentFloatView floatView, int y) {
-        getSp().put(floatView.getClass().getSimpleName() + ".y", y);
+    public static void saveViewY(View view, int y) {
+        if (ScreenUtils.isPortrait()) {
+            getSp().put(view.getClass().getSimpleName() + ".yP", y);
+        } else {
+            getSp().put(view.getClass().getSimpleName() + ".yL", y);
+        }
     }
 
-    public static int getFloatViewY(BaseContentFloatView floatView) {
-        return getSp().getInt(floatView.getClass().getSimpleName() + ".y", 0);
+    public static int getViewY(View view) {
+        return getViewY(view, 0);
     }
 
-    public static void saveFloatViewHeight(BaseContentFloatView floatView, int height) {
-        getSp().put(floatView.getClass().getSimpleName() + ".height", height);
+    public static int getViewY(View view, int defaultVal) {
+        if (ScreenUtils.isPortrait()) {
+            return getSp().getInt(view.getClass().getSimpleName() + ".yP", defaultVal);
+        } else {
+            return getSp().getInt(view.getClass().getSimpleName() + ".yL", defaultVal);
+        }
     }
 
-    public static int getFloatViewHeight(BaseContentFloatView floatView) {
-        return getSp().getInt(floatView.getClass().getSimpleName() + ".height", WindowManager.LayoutParams.WRAP_CONTENT);
+    public static void saveViewX(View view, int x) {
+        if (ScreenUtils.isPortrait()) {
+            getSp().put(view.getClass().getSimpleName() + ".xP", x);
+        } else {
+            getSp().put(view.getClass().getSimpleName() + ".xL", x);
+        }
     }
 
-    public static void saveFloatViewAlpha(BaseContentFloatView floatView, float alpha) {
-        getSp().put(floatView.getClass().getSimpleName() + ".alpha", alpha);
+    public static int getViewX(View view) {
+        if (ScreenUtils.isPortrait()) {
+            return getSp().getInt(view.getClass().getSimpleName() + ".xP");
+        } else {
+            return getSp().getInt(view.getClass().getSimpleName() + ".xL");
+        }
     }
 
-    public static float getFloatViewAlpha(BaseContentFloatView floatView) {
-        return getSp().getFloat(floatView.getClass().getSimpleName() + ".alpha", 1f);
+    public static void saveViewHeight(View view, int height) {
+        if (ScreenUtils.isPortrait()) {
+            getSp().put(view.getClass().getSimpleName() + ".heightP", height);
+        } else {
+            getSp().put(view.getClass().getSimpleName() + ".heightL", height);
+        }
+    }
+
+    public static int getViewHeight(View view, int height) {
+        if (ScreenUtils.isPortrait()) {
+            return getSp().getInt(view.getClass().getSimpleName() + ".heightP", height);
+        } else {
+            return getSp().getInt(view.getClass().getSimpleName() + ".heightL", height);
+        }
+    }
+
+    public static void saveViewAlpha(View view, float alpha) {
+        getSp().put(view.getClass().getSimpleName() + ".alpha", alpha);
+    }
+
+    public static float getViewAlpha(View view) {
+        return getSp().getFloat(view.getClass().getSimpleName() + ".alpha", 1f);
     }
 
     private static SPUtils getSp() {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java
index 91d3f78909..1b2c9a0d94 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/appInfo/AppInfoItem.java
@@ -54,7 +54,7 @@ public void bind(@NonNull ItemViewHolder holder, int position) {
         titleTv.setText(mTitle);
         contentTv.setText(mContent);
         if (mListener != null) {
-            ClickUtils.applyPressedViewScale(holder.itemView);
+            ClickUtils.applyPressedBgDark(holder.itemView);
             ClickUtils.applyGlobalDebouncing(holder.itemView, mListener);
             holder.findViewById(R.id.baseInfoGoIv).setVisibility(View.VISIBLE);
         } else {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java
index b1346f3157..a6c8396752 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/deviceInfo/DeviceInfoItem.java
@@ -58,7 +58,7 @@ public void bind(@NonNull ItemViewHolder holder, int position) {
         titleTv.setText(mTitle);
         contentTv.setText(mContent);
         if (mListener != null) {
-            ClickUtils.applyPressedViewScale(holder.itemView);
+            ClickUtils.applyPressedBgDark(holder.itemView);
             ClickUtils.applyGlobalDebouncing(holder.itemView, mListener);
             holder.findViewById(R.id.baseInfoGoIv).setVisibility(View.VISIBLE);
         } else {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java
index bce2f3b5b8..bb8ff191bc 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileContentView.java
@@ -54,6 +54,10 @@ public void onAttach() {
         fileExplorerSearchEt = findViewById(R.id.fileExplorerSearchEt);
         fileExplorerRv = findViewById(R.id.fileExplorerRv);
 
+        if (FileItem.isEmptyItems(mSrcItems)) {
+            fileExplorerSearchEt.setVisibility(GONE);
+        }
+
         mAdapter = new BaseItemAdapter<>();
         mAdapter.setItems(mSrcItems);
         fileExplorerRv.setAdapter(mAdapter);
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java
index 8cc57ac4f9..b8e8c1cb91 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/FileItem.java
@@ -1,20 +1,27 @@
 package com.blankj.utildebug.debug.tool.fileExplorer;
 
+import android.content.Intent;
 import android.support.annotation.NonNull;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import com.blankj.utilcode.constant.PermissionConstants;
+import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.ClickUtils;
 import com.blankj.utilcode.util.CollectionUtils;
 import com.blankj.utilcode.util.FileUtils;
 import com.blankj.utilcode.util.PathUtils;
+import com.blankj.utilcode.util.PermissionUtils;
+import com.blankj.utilcode.util.SDCardUtils;
 import com.blankj.utilcode.util.StringUtils;
 import com.blankj.utilcode.util.TimeUtils;
+import com.blankj.utilcode.util.UriUtils;
 import com.blankj.utildebug.R;
 import com.blankj.utildebug.base.rv.BaseItem;
 import com.blankj.utildebug.base.rv.ItemViewHolder;
+import com.blankj.utildebug.base.view.FloatToast;
 import com.blankj.utildebug.debug.tool.fileExplorer.image.ImageViewer;
 import com.blankj.utildebug.debug.tool.fileExplorer.sp.SpViewerContentView;
 import com.blankj.utildebug.helper.FileHelper;
@@ -36,9 +43,12 @@
  */
 public class FileItem extends BaseItem {
 
+    private static final ArrayList EMPTY = CollectionUtils.newArrayList(new FileItem());
+
     private FileItem mParent;
     private File     mFile;
     private String   mName;
+    private boolean  isSdcard;
 
     private RelativeLayout fileContentRl;
     private ImageView      fileTypeIv;
@@ -46,17 +56,22 @@ public class FileItem extends BaseItem {
     private TextView       fileInfoTv;
     private TextView       fileMenuDeleteTv;
 
-    public FileItem(FileItem parent, File file) {
+    public FileItem(File file, String name) {
+        this(file, name, false);
+    }
+
+    public FileItem(File file, String name, boolean isSdcard) {
         super(R.layout.du_item_file);
-        mParent = parent;
         mFile = file;
-        mName = file.getName();
+        mName = name;
+        this.isSdcard = isSdcard;
     }
 
-    public FileItem(File file, String name) {
+    public FileItem(FileItem parent, File file) {
         super(R.layout.du_item_file);
+        mParent = parent;
         mFile = file;
-        mName = name;
+        mName = file.getName();
     }
 
     public FileItem() {
@@ -80,11 +95,16 @@ public void bind(@NonNull ItemViewHolder holder, int position) {
         fileMenuDeleteTv.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                FileUtils.delete(mFile);
-                getAdapter().removeItem(FileItem.this, true);
-                if (getAdapter().getItems().isEmpty()) {
-                    getAdapter().addItem(new FileItem());
-                    getAdapter().notifyDataSetChanged();
+                boolean delete = FileUtils.delete(mFile);
+                if (delete) {
+                    getAdapter().removeItem(FileItem.this, true);
+                    if (getAdapter().getItems().isEmpty()) {
+                        getAdapter().addItem(new FileItem());
+                        getAdapter().notifyDataSetChanged();
+                        v.getRootView().findViewById(R.id.fileExplorerSearchEt).setVisibility(View.GONE);
+                    }
+                } else {
+                    FloatToast.showLong(FloatToast.WARNING, "Delete failed!");
                 }
             }
         });
@@ -92,12 +112,29 @@ public void onClick(View v) {
 
         if (mFile.isDirectory()) {
             fileTypeIv.setImageResource(R.drawable.du_ic_debug_file_explorer);
-            fileInfoTv.setText(String.format("%s  %s", StringUtils.getString(R.string.du_file_item_num, mFile.list().length), TimeUtils.millis2String(mFile.lastModified(), "yyyy.MM.dd")));
+            fileInfoTv.setText(String.format("%s  %s", StringUtils.getString(R.string.du_file_item_num, CollectionUtils.size(mFile.list())), TimeUtils.millis2String(mFile.lastModified(), "yyyy.MM.dd")));
             fileContentRl.setOnClickListener(new View.OnClickListener() {
                 @Override
-                public void onClick(View v) {
-                    FileExplorerFloatView floatView = (FileExplorerFloatView) v.getRootView();
-                    FileContentView.show(floatView, FileItem.this);
+                public void onClick(final View v) {
+                    if (isSdcard) {
+                        PermissionUtils.permission(PermissionConstants.STORAGE)
+                                .callback(new PermissionUtils.SimpleCallback() {
+                                    @Override
+                                    public void onGranted() {
+                                        FileExplorerFloatView floatView = (FileExplorerFloatView) v.getRootView();
+                                        FileContentView.show(floatView, FileItem.this);
+                                    }
+
+                                    @Override
+                                    public void onDenied() {
+                                        FloatToast.showShort("Permission of storage denied!");
+                                    }
+                                })
+                                .request();
+                    } else {
+                        FileExplorerFloatView floatView = (FileExplorerFloatView) v.getRootView();
+                        FileContentView.show(floatView, FileItem.this);
+                    }
                 }
             });
         } else {
@@ -125,7 +162,17 @@ public void onClick(View v) {
                     }
                 });
             } else {
-                fileContentRl.setOnClickListener(null);
+                fileContentRl.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        Intent intent = new Intent(Intent.ACTION_VIEW);
+                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        intent.setData(UriUtils.file2Uri(mFile));
+                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+                        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+                        ActivityUtils.startActivity(intent);
+                    }
+                });
                 fileTypeIv.setImageResource(R.drawable.du_ic_item_file_default);
             }
         }
@@ -137,11 +184,7 @@ public File getFile() {
 
     public static List getFileItems(final FileItem parent) {
         if (parent == null) return getFileItems();
-        List files = FileUtils.listFilesInDir(parent.getFile());
-        if (CollectionUtils.isEmpty(files)) {
-            return CollectionUtils.newArrayList(new FileItem());
-        }
-        Collections.sort(files, new Comparator() {
+        List files = FileUtils.listFilesInDir(parent.getFile(), new Comparator() {
             @Override
             public int compare(File o1, File o2) {
                 if (o1.isDirectory() && o2.isFile()) {
@@ -177,6 +220,16 @@ private static List getFileItems() {
                 fileItems.add(new FileItem(externalDataFile, "external"));
             }
         }
+        List mountedSDCardPath = SDCardUtils.getMountedSDCardPath();
+        if (!mountedSDCardPath.isEmpty()) {
+            for (int i = 0; i < mountedSDCardPath.size(); i++) {
+                String path = mountedSDCardPath.get(i);
+                File sdPath = new File(path);
+                if (sdPath.exists()) {
+                    fileItems.add(new FileItem(sdPath, "sdcard" + i + "_" + sdPath.getName(), true));
+                }
+            }
+        }
         return fileItems;
     }
 
@@ -188,4 +241,8 @@ public boolean evaluate(FileItem item) {
             }
         });
     }
+
+    public static boolean isEmptyItems(List items) {
+        return EMPTY == items;
+    }
 }
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java
index 4e81f35537..184df8e2dd 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/debug/tool/fileExplorer/sp/SpItem.java
@@ -105,7 +105,7 @@ public void onClick(View v) {
             goIv.setVisibility(View.GONE);
             contentRl.setOnClickListener(null);
         } else {
-            ClickUtils.applyPressedViewScale(holder.itemView);
+            ClickUtils.applyPressedBgDark(holder.itemView);
             aSwitch.setVisibility(View.GONE);
             goIv.setVisibility(View.VISIBLE);
             contentRl.setOnClickListener(new View.OnClickListener() {
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java
index 40ed38df06..7ae20adb6c 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/FileHelper.java
@@ -49,7 +49,7 @@ public static int getFileType(File file) {
                 }
             }
         }
-        if (StringUtils.equals(FileUtils.getFileCharsetSimple(file), "UTF-8")) {
+        if (FileUtils.isUtf8(file)) {
             return UTF8;
         }
         return UNKNOWN;
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java
index afffdc39b3..dbeadbc9a8 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/ShadowHelper.java
@@ -17,26 +17,18 @@ public class ShadowHelper {
 
     public static void applyDebugIcon(View view) {
         ShadowUtils.apply(view, new ShadowUtils.Builder()
-                .setDrawableRadius(SizeUtils.getMeasuredWidth(view) / 2)
-                .setShadowRadius(SizeUtils.dp2px(8))
-                .setShadowColor(0xb0_ffffff, 0xb0_000000)
+                .setCircle()
+                .setShadowColor(0xc0_ffffff, 0x60_ffffff)
         );
     }
 
     public static void applyFloatView(View view) {
-        ShadowUtils.apply(view, new ShadowUtils.Builder()
-                .setDrawableRadius(SizeUtils.dp2px(8))
-                .setShadowRadius(SizeUtils.dp2px(8))
-                .setShadowColor(0xb0_000000)
-        );
+        ShadowUtils.apply(view, new ShadowUtils.Builder().setShadowRadius(SizeUtils.dp2px(8)));
     }
 
     public static void applyMenu(View view) {
-        view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-//        ShadowUtils.apply(view, new ShadowUtils.Builder()
-//                .setDrawableRadius(SizeUtils.dp2px(4))
-//                .setShadowRadius(SizeUtils.dp2px(4), SizeUtils.dp2px(4))
-//                .setShadowColor(0xb0_000000)
-//        );
+        ShadowUtils.apply(view, new ShadowUtils.Builder()
+                .setShadowRadius(SizeUtils.dp2px(4))
+        );
     }
 }
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java
deleted file mode 100755
index 3074d86707..0000000000
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/TouchHelper.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.blankj.utildebug.helper;
-
-import android.annotation.SuppressLint;
-import android.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.animation.DecelerateInterpolator;
-
-import com.blankj.utilcode.util.BarUtils;
-import com.blankj.utilcode.util.ScreenUtils;
-import com.blankj.utilcode.util.SizeUtils;
-
-/**
- * 
- *     author: blankj
- *     blog  : http://blankj.com
- *     time  : 2019/08/26
- *     desc  :
- * 
- */ -public class TouchHelper { - - private static final int MIN_DISTANCE_MOVE = SizeUtils.dp2px(4); - private static final int MIN_TAP_TIME = 1000; - - private static final int STATE_MOVE = 0; - private static final int STATE_STOP = 1; - - private static int mState = STATE_STOP; - private static int mLastX = -1; - private static int mLastY = -1; - - private TouchHelper() { - } - - public static void applyDrag(final View v, final OnDragListener listener) { - if (v == null || listener == null) return; - v.setOnTouchListener(new View.OnTouchListener() { - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouch(View v, MotionEvent event) { - return onDragEvent(v, event, listener); - } - }); - } - - private static boolean onDragEvent(View v, MotionEvent event, OnDragListener listener) { - if (listener == null) return false; - int x = (int) event.getRawX(); - int y = (int) event.getRawY(); - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mLastX = x; - mLastY = y; - listener._onDown(v, x, y, event); - return false; - case MotionEvent.ACTION_MOVE: - if (mLastX == -1) { - mLastX = x; - mLastY = y; - } - if (mState != STATE_MOVE - && Math.abs(x - mLastX) < MIN_DISTANCE_MOVE - && Math.abs(y - mLastY) < MIN_DISTANCE_MOVE) { - return true; - } - listener._onMove(v, x, y, mLastX, mLastY, event); - mLastX = x; - mLastY = y; - mState = STATE_MOVE; - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - listener._onStop(v, x, y, event); - if (event.getAction() == MotionEvent.ACTION_UP) { - if (mState != STATE_MOVE - && event.getEventTime() - event.getDownTime() < MIN_TAP_TIME) { - v.performClick(); - } - } - final long now = SystemClock.uptimeMillis(); - final MotionEvent cancelEvent = MotionEvent.obtain(now, now, - MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); - v.onTouchEvent(cancelEvent); - mState = STATE_STOP; - return false; - default: - break; - } - return false; - } - - public static abstract class OnDragListener { - - public static final int DIRECTION_LEFT = 1; - public static final int DIRECTION_TOP = 2; - public static final int DIRECTION_RIGHT = 4; - public static final int DIRECTION_BOTTOM = 8; - public static final int DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; - public static final int DIRECTION_VERTICAL = DIRECTION_TOP | DIRECTION_BOTTOM; - public static final int DIRECTION_ALL = DIRECTION_LEFT | DIRECTION_TOP | DIRECTION_RIGHT | DIRECTION_BOTTOM; - - private boolean isApplyScale; - private boolean isHorizontalSticky; - private int availableDirection; - private boolean isFirstMove; - private boolean isMoveAvailable; - protected int appWidth; - protected int appHeight; - protected int viewWidth; - protected int viewHeight; - protected int statusBarHeight; - - public OnDragListener() { - this(DIRECTION_ALL, false, false); - } - - public OnDragListener(boolean isApplyScale) { - this(DIRECTION_ALL, isApplyScale, false); - } - - public OnDragListener(boolean isApplyScale, boolean isHorizontalSticky) { - this(DIRECTION_ALL, isApplyScale, isHorizontalSticky); - } - - public OnDragListener(int availableDirection, boolean isApplyScale, boolean isHorizontalSticky) { - this.availableDirection = availableDirection; - this.isApplyScale = isApplyScale; - this.isHorizontalSticky = isHorizontalSticky; - } - - public abstract void onDown(View v, int x, int y, MotionEvent event); - - public abstract void onMove(View view, int x, int y, int dx, int dy, MotionEvent event); - - public abstract void onStop(View view, int x, int y, MotionEvent event); - - private void _onDown(View view, int x, int y, MotionEvent event) { - isFirstMove = false; - viewWidth = view.getWidth(); - viewHeight = view.getHeight(); - appWidth = ScreenUtils.getAppScreenWidth(); - appHeight = ScreenUtils.getAppScreenHeight(); - statusBarHeight = BarUtils.getStatusBarHeight(); - if (isApplyScale) { - processScale(view, true); - } - onDown(view, x, y, event); - } - - private void _onMove(View view, int x, int y, int lastX, int lastY, MotionEvent event) { - if (!isFirstMove) { - if (availableDirection == DIRECTION_ALL) { - isMoveAvailable = true; - } else { - if (Math.abs(x - lastX) >= Math.abs(y - lastY)) { - int direction = availableDirection & DIRECTION_HORIZONTAL; - if (direction == DIRECTION_HORIZONTAL) { - isMoveAvailable = true; - } else if (direction == DIRECTION_LEFT && x - lastX < 0) { - isMoveAvailable = true; - } else if (direction == DIRECTION_RIGHT && x - lastX > 0) { - isMoveAvailable = true; - } - } else { - int direction = availableDirection & DIRECTION_VERTICAL; - if (direction == DIRECTION_VERTICAL) { - isMoveAvailable = true; - } else if (direction == DIRECTION_TOP && y - lastY < 0) { - isMoveAvailable = true; - } else if (direction == DIRECTION_BOTTOM && y - lastY > 0) { - isMoveAvailable = true; - } - } - } - isFirstMove = true; - } - if (isMoveAvailable) { - onMove(view, x, y, x - lastX, y - lastY, event); - } - } - - private void _onStop(View view, int x, int y, MotionEvent event) { - if (isHorizontalSticky) { - float middleX = view.getX() + viewWidth / 2f; - if (middleX > appWidth / 2f) { - view.animate() - .setInterpolator(new DecelerateInterpolator()) - .translationX(appWidth - viewWidth) - .setDuration(100) - .start(); - } else { - view.animate() - .setInterpolator(new DecelerateInterpolator()) - .setDuration(100) - .translationX(0) - .start(); - } - } - - if (isApplyScale) { - processScale(view, false); - } - onStop(view, x, y, event); - } - - private void processScale(final View view, boolean isDown) { - float value = isDown ? 1 - 0.1f : 1; - view.animate() - .scaleX(value) - .scaleY(value) - .setDuration(100) - .start(); - } - } - - public interface OnMoveListener { - boolean onMove(int dx, int dy); - } -} diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java index 504f6b610e..e64574363c 100644 --- a/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java +++ b/lib/utildebug/src/main/java/com/blankj/utildebug/helper/WindowHelper.java @@ -6,7 +6,7 @@ import android.view.WindowManager; import com.blankj.utilcode.util.ScreenUtils; -import com.blankj.utildebug.DebugUtils; +import com.blankj.utilcode.util.Utils; /** *
@@ -19,29 +19,21 @@
 public class WindowHelper {
 
     private static WindowManager sWM;
-    private static int           windowHeight;
 
     private WindowHelper() {
     }
 
-    public static void updateViewLayout(View view, ViewGroup.LayoutParams params) {
+    public static void updateViewLayout(final View view, ViewGroup.LayoutParams params) {
         getWindowManager().updateViewLayout(view, params);
     }
 
     public static int getAppWindowHeight() {
-        if (windowHeight == 0) {
-            windowHeight = ScreenUtils.getAppScreenHeight();
-        }
-        return windowHeight;
-    }
-
-    public static void updateWindowHeight() {
-        windowHeight = ScreenUtils.getAppScreenHeight();
+        return ScreenUtils.getAppScreenHeight();
     }
 
     public static WindowManager getWindowManager() {
         if (sWM == null) {
-            sWM = (WindowManager) DebugUtils.getApp().getSystemService(Context.WINDOW_SERVICE);
+            sWM = (WindowManager) Utils.getApp().getSystemService(Context.WINDOW_SERVICE);
         }
         return sWM;
     }
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java b/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java
index 27b3dfb936..e5a65d4eac 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/icon/DebugIcon.java
@@ -1,19 +1,21 @@
 package com.blankj.utildebug.icon;
 
+import android.content.res.Configuration;
 import android.os.Build;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.animation.DecelerateInterpolator;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 
+import com.blankj.utilcode.util.BarUtils;
 import com.blankj.utilcode.util.PermissionUtils;
-import com.blankj.utilcode.util.SizeUtils;
 import com.blankj.utilcode.util.ToastUtils;
+import com.blankj.utilcode.util.TouchUtils;
 import com.blankj.utildebug.DebugUtils;
 import com.blankj.utildebug.R;
 import com.blankj.utildebug.config.DebugConfig;
 import com.blankj.utildebug.helper.ShadowHelper;
-import com.blankj.utildebug.helper.TouchHelper;
 import com.blankj.utildebug.menu.DebugMenu;
 
 /**
@@ -28,9 +30,7 @@ public class DebugIcon extends RelativeLayout {
 
     private static final DebugIcon INSTANCE = new DebugIcon();
 
-    private int   mIconId;
-    private float globalX = DebugConfig.getDebugIconX();
-    private float globalY = DebugConfig.getDebugIconY();
+    private int mIconId;
 
     public static DebugIcon getInstance() {
         return INSTANCE;
@@ -44,24 +44,63 @@ public static void setVisibility(boolean isShow) {
     public DebugIcon() {
         super(DebugUtils.getApp());
         inflate(getContext(), R.layout.du_debug_icon, this);
-        int spacing = SizeUtils.dp2px(8);
-        setPadding(spacing, spacing, spacing, spacing);
-
         ShadowHelper.applyDebugIcon(this);
-        TouchHelper.applyDrag(this, new TouchHelper.OnDragListener(true, true) {
+        TouchUtils.setOnTouchListener(this, new TouchUtils.OnTouchUtilsListener() {
+
+            private int rootViewWidth;
+            private int rootViewHeight;
+            private int viewWidth;
+            private int viewHeight;
+            private int statusBarHeight;
 
             @Override
-            public void onDown(View view, int x, int y, MotionEvent event) {
+            public boolean onDown(View view, int x, int y, MotionEvent event) {
+                viewWidth = view.getWidth();
+                viewHeight = view.getHeight();
+                View contentView = view.getRootView().findViewById(android.R.id.content);
+                rootViewWidth = contentView.getWidth();
+                rootViewHeight = contentView.getHeight();
+                statusBarHeight = BarUtils.getStatusBarHeight();
+
+                processScale(view, true);
+                return true;
             }
 
             @Override
-            public void onMove(View view, int x, int y, int dx, int dy, MotionEvent event) {
-                view.setX(Math.min(Math.max(0, view.getX() + dx), appWidth - viewWidth));
-                view.setY(Math.min(Math.max(statusBarHeight, view.getY() + dy), appHeight - viewHeight));
+            public boolean onMove(View view, int direction, int x, int y, int dx, int dy, int totalX, int totalY, MotionEvent event) {
+                view.setX(Math.min(Math.max(0, view.getX() + dx), rootViewWidth - viewWidth));
+                view.setY(Math.min(Math.max(statusBarHeight, view.getY() + dy), rootViewHeight - viewHeight));
+                return true;
             }
 
             @Override
-            public void onStop(View view, int x, int y, MotionEvent event) {
+            public boolean onStop(View view, int direction, int x, int y, int totalX, int totalY, int vx, int vy, MotionEvent event) {
+                stick2HorizontalSide(view);
+                processScale(view, false);
+                return true;
+            }
+
+            private void stick2HorizontalSide(View view) {
+                view.animate()
+                        .setInterpolator(new DecelerateInterpolator())
+                        .translationX(view.getX() + viewWidth / 2f > rootViewWidth / 2f ? rootViewWidth - viewWidth : 0)
+                        .setDuration(100)
+                        .withEndAction(new Runnable() {
+                            @Override
+                            public void run() {
+                                savePosition();
+                            }
+                        })
+                        .start();
+            }
+
+            private void processScale(final View view, boolean isDown) {
+                float value = isDown ? 1 - 0.1f : 1;
+                view.animate()
+                        .scaleX(value)
+                        .scaleY(value)
+                        .setDuration(100)
+                        .start();
             }
         });
 
@@ -90,22 +129,41 @@ public void onDenied() {
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        setX(globalX);
-        setY(globalY);
+        wrapPosition();
     }
 
     @Override
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        globalX = getX();
-        globalY = getY();
-        DebugConfig.saveDebugIconX(globalX);
-        DebugConfig.saveDebugIconY(globalY);
+        savePosition();
+    }
+
+    private void savePosition() {
+        DebugConfig.saveViewX(this, (int) getX());
+        DebugConfig.saveViewY(this, (int) getY());
+    }
+
+    @Override
+    protected void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        wrapPosition();
+    }
+
+    private void wrapPosition() {
+        post(new Runnable() {
+            @Override
+            public void run() {
+                View contentView = getRootView().findViewById(android.R.id.content);
+                if (contentView == null) return;
+                setX(DebugConfig.getViewX(DebugIcon.this));
+                setY(DebugConfig.getViewY(DebugIcon.this, contentView.getHeight() / 3));
+                setX(getX() + getWidth() / 2f > contentView.getWidth() / 2f ? contentView.getWidth() - getWidth() : 0);
+            }
+        });
     }
 
     public void setIconId(final int iconId) {
         ImageView debugPanelIconIv = findViewById(R.id.debugIconIv);
-        mIconId = iconId == -1 ? R.drawable.du_ic_icon_default : iconId;
         debugPanelIconIv.setImageResource(mIconId);
     }
 
diff --git a/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java b/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java
index 8df4b197b7..1de083a6c9 100644
--- a/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java
+++ b/lib/utildebug/src/main/java/com/blankj/utildebug/menu/DebugMenu.java
@@ -26,6 +26,8 @@ public class DebugMenu extends BaseContentFloatView {
 
     private List mDebugs;
 
+    private BaseItemAdapter mAdapter;
+
     private RecyclerView debugMenuRv;
 
     public static DebugMenu getInstance() {
@@ -62,13 +64,20 @@ public void initContentView() {
         setSwipeBackEnabled(false);
 
         debugMenuRv = findViewById(R.id.debugMenuRv);
-        BaseItemAdapter adapter = new BaseItemAdapter<>();
-        adapter.setItems(DebugMenuItem.getDebugMenuItems(mDebugs));
-        debugMenuRv.setAdapter(adapter);
+        mAdapter = new BaseItemAdapter<>();
+        mAdapter.setItems(DebugMenuItem.getDebugMenuItems(mDebugs));
+        debugMenuRv.setAdapter(mAdapter);
         debugMenuRv.setLayoutManager(new LinearLayoutManager(getContext()));
     }
 
     public void setDebugs(List debugs) {
         mDebugs = debugs;
     }
+
+    public void addDebugs(List debugs) {
+        if (debugs == null || debugs.size() == 0) return;
+        mDebugs.addAll(debugs);
+        if (mAdapter == null) return;
+        mAdapter.notifyDataSetChanged();
+    }
 }
diff --git a/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml b/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml
index 1850575379..5943aeceeb 100644
--- a/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml
+++ b/lib/utildebug/src/main/res/drawable/du_shape_base_float_bg.xml
@@ -1,5 +1,5 @@
 
 
-    
+    
     
 
\ No newline at end of file
diff --git a/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml b/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml
index 74770f3764..fc9efdc1da 100644
--- a/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml
+++ b/lib/utildebug/src/main/res/drawable/du_shape_base_float_title_bg.xml
@@ -1,7 +1,7 @@
 
 
     
+        android:bottomLeftRadius="8dp"
+        android:bottomRightRadius="8dp"/>
     
 
\ No newline at end of file
diff --git a/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml b/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml
index 346ecb3795..3d0415b8e0 100644
--- a/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml
+++ b/lib/utildebug/src/main/res/drawable/du_shape_shadow.xml
@@ -2,6 +2,6 @@
 
     
+        android:endColor="#37000000"
+        android:startColor="#03000000" />
 
\ No newline at end of file
diff --git a/lib/utildebug/src/main/res/layout/du_base_content_float.xml b/lib/utildebug/src/main/res/layout/du_base_content_float.xml
index 73f51dff11..9380648980 100644
--- a/lib/utildebug/src/main/res/layout/du_base_content_float.xml
+++ b/lib/utildebug/src/main/res/layout/du_base_content_float.xml
@@ -4,16 +4,37 @@
     xmlns:tools="http://schemas.android.com/tools">
 
     
 
+        
+
+        
+
+        
+
         
 
-        
-
-        
-
-        
-
     
 
diff --git a/lib/utildebug/src/main/res/layout/du_debug_icon.xml b/lib/utildebug/src/main/res/layout/du_debug_icon.xml
index 8ea7e1e4db..9d3118ef3a 100644
--- a/lib/utildebug/src/main/res/layout/du_debug_icon.xml
+++ b/lib/utildebug/src/main/res/layout/du_debug_icon.xml
@@ -5,6 +5,7 @@
     
+        android:layout_height="40dp"
+        android:src="http://github.com/@drawable/du_ic_icon_default" />
 
 
diff --git a/lib/utildebug/src/main/res/values/values-cardview.xml b/lib/utildebug/src/main/res/values/values-cardview.xml
deleted file mode 100644
index c54222f9eb..0000000000
--- a/lib/utildebug/src/main/res/values/values-cardview.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-    
-    #FF424242
-    #FFFFFFFF
-    #03000000
-    #37000000
-    
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-        
-    
-    0dp
-    
-    
-    
-    
-
\ No newline at end of file
diff --git a/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java b/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java
deleted file mode 100644
index ea1f901d70..0000000000
--- a/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.blankj.utildebug;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see Testing documentation
- */
-public class ExampleUnitTest {
-    @Test
-    public void addition_isCorrect() {
-        assertEquals(4, 2 + 2);
-    }
-}
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/CHANGELOG.md b/plugin/api-gradle-plugin/CHANGELOG.md
index 6dc7341833..4b3fb04315 100644
--- a/plugin/api-gradle-plugin/CHANGELOG.md
+++ b/plugin/api-gradle-plugin/CHANGELOG.md
@@ -1,4 +1,7 @@
 # Change Log
 
+## v1.1(2019/10/30)
+新增 onlyScanLibRegex, jumpScanLibRegex 的 DSL
+
 ## v1.0(2019/07/20)
 发布初版本
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 516145f0af..4c08cb40c7 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -28,7 +28,7 @@
 buildscript {
     dependencies {
         ...
-        classpath 'com.blankj:api-gradle-plugin:1.0'
+        classpath 'com.blankj:api-gradle-plugin:1.1'
     }
 }
 ```
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy
index 05ff41e142..87ec26e571 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiExtension.groovy
@@ -4,13 +4,16 @@ class ApiExtension {
 
     boolean abortOnError = true
     String apiUtilsClass = "com.blankj.utilcode.util.ApiUtils";
+    String onlyScanLibRegex = ""
+    String jumpScanLibRegex = ""
 
     @Override
     String toString() {
-        return "BusExtension { " +
+        return "ApiExtension { " +
                 "abortOnError: " + abortOnError +
                 ", apiUtilsClass: " + apiUtilsClass +
+                (onlyScanLibRegex == "" ? "" : ", onlyScanLibRegex: " + onlyScanLibRegex) +
+                (jumpScanLibRegex == "" ? "" : ", jumpScanLibRegex: " + jumpScanLibRegex) +
                 " }";
     }
-
 }
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
index 36b679ff99..ad2525d063 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
@@ -62,10 +62,10 @@ class ApiScan {
             ClassReader cr = new ClassReader(file.bytes);
             ClassWriter cw = new ClassWriter(cr, 0);
             ClassVisitor cv = new ApiClassVisitor(cw, apiImplMap, apiClasses, apiUtilsClass);
-            cr.accept(cv, ClassReader.SKIP_FRAMES);
-
-            if (cv.errorStr != null) {
-                throw new Exception(cv.errorStr)
+            try {
+                cr.accept(cv, ClassReader.SKIP_FRAMES);
+            } catch (Exception ignore) {
+                ignore.printStackTrace()
             }
         }
     }
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy
index c4bdf9dfc7..34ce323c81 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiTransform.groovy
@@ -7,6 +7,8 @@ import com.blankj.api.util.LogUtils
 import org.apache.commons.io.FileUtils
 import org.gradle.api.Project
 
+import java.util.regex.Pattern
+
 class ApiTransform extends Transform {
 
     Project mProject;
@@ -88,7 +90,7 @@ class ApiTransform extends Transform {
                 )
                 FileUtils.copyFile(jar, dest)
 
-                if (jumpScan(jarName)) {
+                if (jumpScan(jarName, ext)) {
                     LogUtils.l("jump jar: $jarName -> $dest")
                     return
                 }
@@ -136,14 +138,26 @@ class ApiTransform extends Transform {
         LogUtils.l(getName() + " finished: " + (System.currentTimeMillis() - stTime) + "ms")
     }
 
-    private static jumpScan(String jarName) {
-        boolean isExcept = false
-        for (String except : Config.EXCEPTS) {
-            if (jarName.startsWith(except)) {
-                isExcept = true
-                break
+    private static jumpScan(String jarName, ApiExtension ext) {
+        if (jarName.contains("utilcode")) {
+            return false
+        }
+
+        if (ext.onlyScanLibRegex != null && ext.onlyScanLibRegex.trim().length() > 0) {
+            return !Pattern.matches(ext.onlyScanLibRegex, jarName)
+        }
+
+        if (ext.jumpScanLibRegex != null && ext.jumpScanLibRegex.trim().length() > 0) {
+            if (Pattern.matches(ext.jumpScanLibRegex, jarName)) {
+                return true
             }
         }
-        return isExcept
+
+        for (exclude in Config.EXCLUDE_LIBS_START_WITH) {
+            if (jarName.startsWith(exclude)) {
+                return true
+            }
+        }
+        return false
     }
 }
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy
index d5dfa69c4c..fcf51fec4e 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/Config.groovy
@@ -4,13 +4,15 @@ class Config {
 
     public static final String EXT_NAME = 'api'
 
-    public static final List EXCEPTS = [
-            'com.android.support:',
-            'com.android.support.constraint:',
-            'android.arch.',
-            'org.jetbrains.kotlin:',
-            'org.jetbrains:',
-            'com.squareup.'
+    public static final List EXCLUDE_LIBS_START_WITH = [
+            'com.android.support',
+            'androidx',
+            'com.google',
+            'android.arch',
+            'org.jetbrains',
+            'com.squareup',
+            'org.greenrobot',
+            'com.github.bumptech.glide'
     ]
 
     public static final String FILE_SEP = System.getProperty("file.separator")
diff --git a/plugin/bus-gradle-plugin/CHANGELOG.md b/plugin/bus-gradle-plugin/CHANGELOG.md
index 19885a70c7..d9f4853c03 100644
--- a/plugin/bus-gradle-plugin/CHANGELOG.md
+++ b/plugin/bus-gradle-plugin/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Change Log
 
+## v2.3
+新增 onlyScanLibRegex, jumpScanLibRegex 的 DSL
+
+## v2.2
+修复含有 for 循环的字段导致 out of index 的 bug
+
 ## v2.1
 支持 Tag 一对多,同 Tag 可设置事件优先级
 
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index ed5d87567e..328a783796 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -19,7 +19,7 @@
 buildscript {
     dependencies {
         ...
-        classpath 'com.blankj:bus-gradle-plugin:2.1'
+        classpath 'com.blankj:bus-gradle-plugin:2.3'
     }
 }
 ```
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java
index e72130d14f..581c984af4 100644
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusClassVisitor.java
@@ -29,6 +29,7 @@ public class BusClassVisitor extends ClassVisitor {
     private String  tag;
     private String  funParamDesc;
     private String  mBusUtilsClass;
+    private boolean isStartVisitParams;
 
     public BusClassVisitor(ClassVisitor classVisitor, Map> busMap, String busUtilsClass) {
         super(Opcodes.ASM5, classVisitor);
@@ -47,6 +48,7 @@ public MethodVisitor visitMethod(int access, String funName, String desc, String
         if (cv == null) return null;
         MethodVisitor mv = cv.visitMethod(access, funName, desc, signature, exceptions);
         busInfo = null;
+        isStartVisitParams = false;
         mv = new AdviceAdapter(Opcodes.ASM5, mv, access, funName, desc) {
             @Override
             public AnnotationVisitor visitAnnotation(String desc1, boolean visible) {
@@ -83,6 +85,10 @@ public void visitEnum(String name, String desc, String value) {
             public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
                 super.visitLocalVariable(name, desc, signature, start, end, index);// 获取方法参数信息
                 if (busInfo != null && !funParamDesc.equals("")) {
+                    if (!isStartVisitParams && index != 0) {
+                        return;
+                    }
+                    isStartVisitParams = true;
                     if ("this".equals(name)) {
                         return;
                     }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
index 87d6060870..14d296b2d7 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusExtension.groovy
@@ -4,12 +4,16 @@ class BusExtension {
 
     boolean abortOnError = true;
     String busUtilsClass = "com.blankj.utilcode.util.BusUtils";
+    String onlyScanLibRegex = ""
+    String jumpScanLibRegex = ""
 
     @Override
     String toString() {
         return "BusExtension { " +
                 "abortOnError: " + abortOnError +
                 ", busUtilsClass: " + busUtilsClass +
+                (onlyScanLibRegex == "" ? "" : ", onlyScanLibRegex: " + onlyScanLibRegex) +
+                (jumpScanLibRegex == "" ? "" : ", jumpScanLibRegex: " + jumpScanLibRegex) +
                 " }";
     }
 }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
index 5050938d0d..a08d53f202 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
@@ -60,7 +60,11 @@ class BusScan {
             ClassReader cr = new ClassReader(file.bytes);
             ClassWriter cw = new ClassWriter(cr, 0);
             ClassVisitor cv = new BusClassVisitor(cw, busMap, busUtilsClass);
-            cr.accept(cv, ClassReader.SKIP_FRAMES);
+            try {
+                cr.accept(cv, ClassReader.SKIP_FRAMES);
+            } catch (Exception ignore) {
+                ignore.printStackTrace()
+            }
         }
     }
 }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
index cfe7b54313..1581a61fb7 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusTransform.groovy
@@ -7,6 +7,8 @@ import com.blankj.bus.util.LogUtils
 import org.apache.commons.io.FileUtils
 import org.gradle.api.Project
 
+import java.util.regex.Pattern
+
 class BusTransform extends Transform {
 
     Project mProject;
@@ -87,7 +89,7 @@ class BusTransform extends Transform {
                 )
                 FileUtils.copyFile(jar, dest)
 
-                if (jumpScan(jarName)) {
+                if (jumpScan(jarName, ext)) {
                     LogUtils.l("jump jar: $jarName -> $dest")
                     return
                 }
@@ -153,14 +155,26 @@ class BusTransform extends Transform {
         LogUtils.l(getName() + " finished: " + (System.currentTimeMillis() - stTime) + "ms")
     }
 
-    private static jumpScan(String jarName) {
-        boolean isExcept = false
-        for (String except : Config.EXCEPTS) {
-            if (jarName.startsWith(except)) {
-                isExcept = true
-                break
+    private static jumpScan(String jarName, BusExtension ext) {
+        if (jarName.contains("utilcode")) {
+            return false
+        }
+
+        if (ext.onlyScanLibRegex != null && ext.onlyScanLibRegex.trim().length() > 0) {
+            return !Pattern.matches(ext.onlyScanLibRegex, jarName)
+        }
+
+        if (ext.jumpScanLibRegex != null && ext.jumpScanLibRegex.trim().length() > 0) {
+            if (Pattern.matches(ext.jumpScanLibRegex, jarName)) {
+                return true
             }
         }
-        return isExcept
+
+        for (exclude in Config.EXCLUDE_LIBS_START_WITH) {
+            if (jarName.startsWith(exclude)) {
+                return true
+            }
+        }
+        return false
     }
 }
\ No newline at end of file
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
index d33ad8485b..e52424affa 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/Config.groovy
@@ -4,13 +4,15 @@ class Config {
 
     public static final String EXT_NAME = 'bus'
 
-    public static final List EXCEPTS = [
-            'com.android.support:',
-            'com.android.support.constraint:',
-            'android.arch.',
-            'org.jetbrains.kotlin:',
-            'org.jetbrains:',
-            'com.squareup.'
+    public static final List EXCLUDE_LIBS_START_WITH = [
+            'com.android.support',
+            'androidx',
+            'com.google',
+            'android.arch',
+            'org.jetbrains',
+            'com.squareup',
+            'org.greenrobot',
+            'com.github.bumptech.glide'
     ]
 
     public static final String FILE_SEP = System.getProperty("file.separator")
diff --git a/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java b/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
index d253d2a4d4..b3af21cddb 100644
--- a/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
+++ b/plugin/bus-gradle-plugin/src/test/java/com/blankj/bus/BusTest.java
@@ -29,6 +29,9 @@ public class BusTest {
     private static final String TAG_NO_PARAM_STICKY  = "TagNoParamSticky";
     private static final String TAG_ONE_PARAM_STICKY = "TagOneParamSticky";
 
+    private String[] arr = new String[]{"0", "1"};
+    private String[] arr2 = new String[]{"0", "1"};
+
     @BusUtils.Bus(tag = TAG_NO_PARAM)
     public void noParamFun() {
         System.out.println("noParam");
@@ -61,6 +64,12 @@ public void noParamStickyFun() {
 
     @BusUtils.Bus(tag = TAG_ONE_PARAM_STICKY, sticky = true)
     public void oneParamStickyFun(Callback callback) {
+        for (String str : arr) {
+            System.out.println(str);
+        }
+        for (String str1 : arr2) {
+            System.out.println(str1);
+        }
         if (callback != null) {
             System.out.println(callback.call());
         }
diff --git a/reports/profile/css/base-style.css b/reports/profile/css/base-style.css
new file mode 100644
index 0000000000..4afa73e3dd
--- /dev/null
+++ b/reports/profile/css/base-style.css
@@ -0,0 +1,179 @@
+
+body {
+    margin: 0;
+    padding: 0;
+    font-family: sans-serif;
+    font-size: 12pt;
+}
+
+body, a, a:visited {
+    color: #303030;
+}
+
+#content {
+    padding-left: 50px;
+    padding-right: 50px;
+    padding-top: 30px;
+    padding-bottom: 30px;
+}
+
+#content h1 {
+    font-size: 160%;
+    margin-bottom: 10px;
+}
+
+#footer {
+    margin-top: 100px;
+    font-size: 80%;
+    white-space: nowrap;
+}
+
+#footer, #footer a {
+    color: #a0a0a0;
+}
+
+#line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+#label-for-line-wrapping-toggle {
+    vertical-align: middle;
+}
+
+ul {
+    margin-left: 0;
+}
+
+h1, h2, h3 {
+    white-space: nowrap;
+}
+
+h2 {
+    font-size: 120%;
+}
+
+ul.tabLinks {
+    padding-left: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    overflow: auto;
+    min-width: 800px;
+    width: auto !important;
+    width: 800px;
+}
+
+ul.tabLinks li {
+    float: left;
+    height: 100%;
+    list-style: none;
+    padding-left: 10px;
+    padding-right: 10px;
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-bottom: 0;
+    -moz-border-radius: 7px;
+    border-radius: 7px;
+    margin-right: 25px;
+    border: solid 1px #d4d4d4;
+    background-color: #f0f0f0;
+}
+
+ul.tabLinks li:hover {
+    background-color: #fafafa;
+}
+
+ul.tabLinks li.selected {
+    background-color: #c5f0f5;
+    border-color: #c5f0f5;
+}
+
+ul.tabLinks a {
+    font-size: 120%;
+    display: block;
+    outline: none;
+    text-decoration: none;
+    margin: 0;
+    padding: 0;
+}
+
+ul.tabLinks li h2 {
+    margin: 0;
+    padding: 0;
+}
+
+div.tab {
+}
+
+div.selected {
+    display: block;
+}
+
+div.deselected {
+    display: none;
+}
+
+div.tab table {
+    min-width: 350px;
+    width: auto !important;
+    width: 350px;
+    border-collapse: collapse;
+}
+
+div.tab th, div.tab table {
+    border-bottom: solid #d0d0d0 1px;
+}
+
+div.tab th {
+    text-align: left;
+    white-space: nowrap;
+    padding-left: 6em;
+}
+
+div.tab th:first-child {
+    padding-left: 0;
+}
+
+div.tab td {
+    white-space: nowrap;
+    padding-left: 6em;
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+div.tab td:first-child {
+    padding-left: 0;
+}
+
+div.tab td.numeric, div.tab th.numeric {
+    text-align: right;
+}
+
+span.code {
+    display: inline-block;
+    margin-top: 0em;
+    margin-bottom: 1em;
+}
+
+span.code pre {
+    font-size: 11pt;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0;
+    background-color: #f7f7f7;
+    border: solid 1px #d0d0d0;
+    min-width: 700px;
+    width: auto !important;
+    width: 700px;
+}
+
+span.wrapped pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+    word-break: break-all;
+}
+
+label.hidden {
+    display: none;
+}
\ No newline at end of file
diff --git a/reports/profile/css/style.css b/reports/profile/css/style.css
new file mode 100644
index 0000000000..c4a4239337
--- /dev/null
+++ b/reports/profile/css/style.css
@@ -0,0 +1,4 @@
+
+div.tab td.indentPath {
+    padding-left: 3em;
+}
diff --git a/reports/profile/js/report.js b/reports/profile/js/report.js
new file mode 100644
index 0000000000..83bab4a19f
--- /dev/null
+++ b/reports/profile/js/report.js
@@ -0,0 +1,194 @@
+(function (window, document) {
+    "use strict";
+
+    var tabs = {};
+
+    function changeElementClass(element, classValue) {
+        if (element.getAttribute("className")) {
+            element.setAttribute("className", classValue);
+        } else {
+            element.setAttribute("class", classValue);
+        }
+    }
+
+    function getClassAttribute(element) {
+        if (element.getAttribute("className")) {
+            return element.getAttribute("className");
+        } else {
+            return element.getAttribute("class");
+        }
+    }
+
+    function addClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element) + " " + classValue);
+    }
+
+    function removeClass(element, classValue) {
+        changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
+    }
+
+    function initTabs() {
+        var container = document.getElementById("tabs");
+
+        tabs.tabs = findTabs(container);
+        tabs.titles = findTitles(tabs.tabs);
+        tabs.headers = findHeaders(container);
+        tabs.select = select;
+        tabs.deselectAll = deselectAll;
+        tabs.select(0);
+
+        return true;
+    }
+
+    function getCheckBox() {
+        return document.getElementById("line-wrapping-toggle");
+    }
+
+    function getLabelForCheckBox() {
+        return document.getElementById("label-for-line-wrapping-toggle");
+    }
+
+    function findCodeBlocks() {
+        var spans = document.getElementById("tabs").getElementsByTagName("span");
+        var codeBlocks = [];
+        for (var i = 0; i < spans.length; ++i) {
+            if (spans[i].className.indexOf("code") >= 0) {
+                codeBlocks.push(spans[i]);
+            }
+        }
+        return codeBlocks;
+    }
+
+    function forAllCodeBlocks(operation) {
+        var codeBlocks = findCodeBlocks();
+
+        for (var i = 0; i < codeBlocks.length; ++i) {
+            operation(codeBlocks[i], "wrapped");
+        }
+    }
+
+    function toggleLineWrapping() {
+        var checkBox = getCheckBox();
+
+        if (checkBox.checked) {
+            forAllCodeBlocks(addClass);
+        } else {
+            forAllCodeBlocks(removeClass);
+        }
+    }
+
+    function initControls() {
+        if (findCodeBlocks().length > 0) {
+            var checkBox = getCheckBox();
+            var label = getLabelForCheckBox();
+
+            checkBox.onclick = toggleLineWrapping;
+            checkBox.checked = false;
+
+            removeClass(label, "hidden");
+         }
+    }
+
+    function switchTab() {
+        var id = this.id.substr(1);
+
+        for (var i = 0; i < tabs.tabs.length; i++) {
+            if (tabs.tabs[i].id === id) {
+                tabs.select(i);
+                break;
+            }
+        }
+
+        return false;
+    }
+
+    function select(i) {
+        this.deselectAll();
+
+        changeElementClass(this.tabs[i], "tab selected");
+        changeElementClass(this.headers[i], "selected");
+
+        while (this.headers[i].firstChild) {
+            this.headers[i].removeChild(this.headers[i].firstChild);
+        }
+
+        var h2 = document.createElement("H2");
+
+        h2.appendChild(document.createTextNode(this.titles[i]));
+        this.headers[i].appendChild(h2);
+    }
+
+    function deselectAll() {
+        for (var i = 0; i < this.tabs.length; i++) {
+            changeElementClass(this.tabs[i], "tab deselected");
+            changeElementClass(this.headers[i], "deselected");
+
+            while (this.headers[i].firstChild) {
+                this.headers[i].removeChild(this.headers[i].firstChild);
+            }
+
+            var a = document.createElement("A");
+
+            a.setAttribute("id", "ltab" + i);
+            a.setAttribute("href", "#tab" + i);
+            a.onclick = switchTab;
+            a.appendChild(document.createTextNode(this.titles[i]));
+
+            this.headers[i].appendChild(a);
+        }
+    }
+
+    function findTabs(container) {
+        return findChildElements(container, "DIV", "tab");
+    }
+
+    function findHeaders(container) {
+        var owner = findChildElements(container, "UL", "tabLinks");
+        return findChildElements(owner[0], "LI", null);
+    }
+
+    function findTitles(tabs) {
+        var titles = [];
+
+        for (var i = 0; i < tabs.length; i++) {
+            var tab = tabs[i];
+            var header = findChildElements(tab, "H2", null)[0];
+
+            header.parentNode.removeChild(header);
+
+            if (header.innerText) {
+                titles.push(header.innerText);
+            } else {
+                titles.push(header.textContent);
+            }
+        }
+
+        return titles;
+    }
+
+    function findChildElements(container, name, targetClass) {
+        var elements = [];
+        var children = container.childNodes;
+
+        for (var i = 0; i < children.length; i++) {
+            var child = children.item(i);
+
+            if (child.nodeType === 1 && child.nodeName === name) {
+                if (targetClass && child.className.indexOf(targetClass) < 0) {
+                    continue;
+                }
+
+                elements.push(child);
+            }
+        }
+
+        return elements;
+    }
+
+    // Entry point.
+
+    window.onload = function() {
+        initTabs();
+        initControls();
+    };
+} (window, window.document));
\ No newline at end of file
diff --git a/reports/profile/profile-2019-10-29-17-10-55.html b/reports/profile/profile-2019-10-29-17-10-55.html
new file mode 100644
index 0000000000..ce4c906a56
--- /dev/null
+++ b/reports/profile/profile-2019-10-29-17-10-55.html
@@ -0,0 +1,317 @@
+
+
+
+
+
+Profile report
+
+
+
+
+
+
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time4.150s
Startup1.202s
Settings and BuildSrc0.325s
Loading Projects0.037s
Configuring Projects-57.727s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-57.727s
:0.176s
:lib:base0.068s
:lib:utilcode0.038s
:plugin:api-gradle-plugin0.038s
:lib:subutil0.033s
:lib:utildebug0.028s
:lib:common0.027s
:lib:utildebug-no-op0.023s
:plugin:bus-gradle-plugin0.021s
:feature:main0.002s
:feature:utilcode0.002s
:lib0.001s
:feature0s
:feature:launcher0s
:feature:subutil0s
:plugin0s
:feature:launcher:app-58.184s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.124s
:classpath0.117s
:plugin:api-gradle-plugin:classpath0.003s
detachedConfiguration10.002s
detachedConfiguration20.002s
:plugin:bus-gradle-plugin:classpath0s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-14-42.html b/reports/profile/profile-2019-10-29-17-14-42.html new file mode 100644 index 0000000000..833ff50147 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-14-42.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time1.580s
Startup0.508s
Settings and BuildSrc0.097s
Loading Projects0.015s
Configuring Projects-42.833s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-42.833s
:0.143s
:lib:utildebug-no-op0.031s
:lib:base0.024s
:lib:subutil0.024s
:plugin:api-gradle-plugin0.023s
:lib:utilcode0.022s
:lib:common0.020s
:lib:utildebug0.019s
:plugin:bus-gradle-plugin0.008s
:feature:launcher0.001s
:feature:main0.001s
:feature0s
:feature:subutil0s
:feature:utilcode0s
:lib0s
:plugin0s
:feature:launcher:app-43.149s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.116s
:classpath0.110s
:plugin:api-gradle-plugin:classpath0.003s
detachedConfiguration10.002s
detachedConfiguration20.001s
:plugin:bus-gradle-plugin:classpath0s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-19-01.html b/reports/profile/profile-2019-10-29-17-19-01.html new file mode 100644 index 0000000000..eedef56720 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-19-01.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time4.828s
Startup0.463s
Settings and BuildSrc0.047s
Loading Projects0.006s
Configuring Projects-3.404s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-3.404s
:lib:base1.334s
:plugin:bus-gradle-plugin0.186s
:lib:subutil0.184s
:plugin:api-gradle-plugin0.140s
:0.116s
:lib:utilcode0.066s
:lib:utildebug0.054s
:lib:utildebug-no-op0.051s
:lib:common0.036s
:feature:subutil0.001s
:lib0.001s
:feature0s
:feature:launcher0s
:feature:main0s
:feature:utilcode0s
:plugin0s
:feature:launcher:app-5.573s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.030s
:classpath0.025s
:plugin:api-gradle-plugin:classpath0.002s
detachedConfiguration10.002s
:plugin:bus-gradle-plugin:classpath0.001s
detachedConfiguration20s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-19-16.html b/reports/profile/profile-2019-10-29-17-19-16.html new file mode 100644 index 0000000000..7d83036398 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-19-16.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time1.354s
Startup0.481s
Settings and BuildSrc0.071s
Loading Projects0.010s
Configuring Projects-17.351s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-17.351s
:0.131s
:lib:utildebug-no-op0.065s
:lib:utilcode0.042s
:lib:utildebug0.038s
:lib:subutil0.026s
:lib:base0.017s
:plugin:api-gradle-plugin0.016s
:lib:common0.015s
:plugin:bus-gradle-plugin0.008s
:lib0.001s
:feature0s
:feature:launcher0s
:feature:main0s
:feature:subutil0s
:feature:utilcode0s
:plugin0s
:feature:launcher:app-17.710s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.101s
:classpath0.098s
:plugin:api-gradle-plugin:classpath0.002s
detachedConfiguration10.001s
:plugin:bus-gradle-plugin:classpath0s
detachedConfiguration20s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + diff --git a/reports/profile/profile-2019-10-29-17-56-45.html b/reports/profile/profile-2019-10-29-17-56-45.html new file mode 100644 index 0000000000..a8f52f6803 --- /dev/null +++ b/reports/profile/profile-2019-10-29-17-56-45.html @@ -0,0 +1,317 @@ + + + + + +Profile report + + + + + +
+

Profile report

+ +
+ +
+

Summary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionDuration
Total Build Time7.699s
Startup0.511s
Settings and BuildSrc0.434s
Loading Projects0.045s
Configuring Projects-48.490s
Artifact Transforms0s
Task Execution0s
+
+
+

Configuration

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProjectDuration
All projects-48.490s
:lib:base1.721s
:0.538s
:plugin:api-gradle-plugin0.518s
:lib:subutil0.294s
:plugin:bus-gradle-plugin0.231s
:lib:utildebug0.127s
:lib:utilcode0.108s
:lib:utildebug-no-op0.069s
:lib:common0.059s
:feature:launcher0.004s
:feature:utilcode0.003s
:feature0.002s
:lib0.002s
:feature:main0.001s
:feature:subutil0.001s
:plugin0s
:feature:launcher:app-52.168s
+
+
+

Dependency Resolution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DependenciesDuration
All dependencies0.221s
:classpath0.214s
:plugin:api-gradle-plugin:classpath0.003s
detachedConfiguration10.002s
:plugin:bus-gradle-plugin:classpath0.001s
detachedConfiguration20.001s
+
+
+

Artifact Transforms

+ + + + + + + + + + + +
TransformDuration
All transforms0s
+
+
+

Task Execution

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TaskDurationResult
:0s(total)
:feature0s(total)
:feature:launcher0s(total)
:feature:launcher:app0s(total)
:feature:main0s(total)
:feature:subutil0s(total)
:feature:utilcode0s(total)
:lib0s(total)
:lib:base0s(total)
:lib:common0s(total)
:lib:subutil0s(total)
:lib:utilcode0s(total)
:lib:utildebug0s(total)
:lib:utildebug-no-op0s(total)
:plugin0s(total)
:plugin:api-gradle-plugin0s(total)
:plugin:bus-gradle-plugin0s(total)
+
+
+ +
+ + From 4e17cd81c8467fc381f1c2df36fdcf4fb94fd229 Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Sat, 23 Nov 2019 22:01:31 +0800 Subject: [PATCH 114/239] see 11/23 log --- CHANGELOG.md | 1 + build.gradle | 3 +- buildApp.gradle | 25 +- buildLib.gradle | 2 +- buildSrc/src/main/groovy/Config.groovy | 150 ++++------ buildSrc/src/main/groovy/ConfigUtils.groovy | 282 ++++-------------- buildSrc/src/main/groovy/DepConfig.groovy | 42 ++- buildSrc/src/main/groovy/GLog.groovy | 4 +- .../src/main/groovy/TaskDurationUtils.groovy | 86 ++++++ config.json | 27 ++ feature/launcher/app/build.gradle | 2 +- .../launcher/app/src/main/AndroidManifest.xml | 1 + feature/main/app/src/main/AndroidManifest.xml | 1 + feature/main/pkg/src/main/AndroidManifest.xml | 1 + .../java/com/blankj/main/pkg/MainActivity.kt | 5 + .../pkg/feature/pinyin/PinyinActivity.kt | 2 +- .../blankj/subutil/pkg/helper/DialogHelper.kt | 44 +-- .../utilcode/pkg/src/main/AndroidManifest.xml | 18 +- .../utilcode/pkg/feature/CoreUtilActivity.kt | 2 - .../pkg/feature/activity/ActivityActivity.kt | 16 +- .../feature/activity/SubActivityActivity.kt | 5 +- .../feature/adaptScreen/AdaptCloseActivity.kt | 3 +- .../adaptScreen/AdaptHeightActivity.kt | 3 +- .../feature/adaptScreen/AdaptWidthActivity.kt | 5 +- .../utilcode/pkg/feature/bar/BarActivity.kt | 16 +- .../pkg/feature/bar/BarStatusAlphaFragment.kt | 70 ----- .../pkg/feature/bar/BarStatusColorFragment.kt | 58 ---- .../feature/bar/BarStatusCustomFragment.kt | 43 --- .../feature/bar/BarStatusDrawerActivity.kt | 122 -------- .../feature/bar/BarStatusImageViewActivity.kt | 76 ----- .../feature/bar/BarStatusImageViewFragment.kt | 72 ----- .../feature/bar/{ => nav}/BarNavActivity.kt | 2 +- .../BarNotificationActivity.kt | 3 +- .../bar/{ => status}/BarStatusActivity.kt | 2 +- .../BarStatusActivityAlpha.kt} | 12 +- .../BarStatusActivityColor.kt} | 8 +- .../BarStatusActivityCustom.kt} | 11 +- .../bar/status/BarStatusActivityDrawer.kt | 111 +++++++ .../bar/status/BarStatusActivityImageView.kt | 63 ++++ .../fragment}/BarStatusFragmentActivity.kt | 24 +- .../status/fragment/BarStatusFragmentAlpha.kt | 68 +++++ .../status/fragment/BarStatusFragmentColor.kt | 59 ++++ .../fragment/BarStatusFragmentCustom.kt | 38 +++ .../fragment/BarStatusFragmentImageView.kt | 65 ++++ .../pkg/feature/bus/BusCompareActivity.kt | 10 +- .../pkg/feature/click/ClickActivity.kt | 123 +++++--- .../pkg/feature/fragment/ChildFragment.kt | 75 +++-- .../pkg/feature/fragment/ContainerFragment.kt | 208 +++++++------ .../pkg/feature/fragment/FragmentActivity.kt | 9 +- .../pkg/feature/fragment/RootFragment.kt | 11 +- .../pkg/feature/keyboard/KeyboardActivity.kt | 59 ++-- .../utilcode/pkg/feature/mvp/MvpActivity.java | 20 ++ .../pkg/feature/network/NetworkActivity.kt | 1 + .../feature/permission/PermissionActivity.kt | 7 +- .../utilcode/pkg/feature/span/SpanActivity.kt | 19 +- .../utilcode/pkg/helper/DialogHelper.kt | 216 +++++++++----- ...bottom_200.xml => slide_bottom_in_200.xml} | 0 ...ottom_200.xml => slide_bottom_out_200.xml} | 0 ..._left_1000.xml => slide_left_out_1000.xml} | 0 ...right_1000.xml => slide_right_in_1000.xml} | 0 .../main/res/drawable/keyboard_dialog_bg.xml | 10 + .../res/layout/activity_bar_status_alpha.xml | 32 -- .../res/layout/activity_bar_status_drawer.xml | 65 ---- .../layout/activity_bar_status_image_view.xml | 43 --- .../layout/activity_bar_status_swipe_back.xml | 53 ---- .../src/main/res/layout/activity_click.xml | 65 ---- ...activity_item_shared_element_activity.xml} | 0 .../src/main/res/layout/activity_keyboard.xml | 53 ---- ...vity_sub.xml => activity_sub_activity.xml} | 0 .../main/res/layout/activity_util_core.xml | 6 - ...ose.xml => adaptscreen_close_activity.xml} | 0 ...ht.xml => adaptscreen_height_activity.xml} | 0 ...dth.xml => adaptscreen_width_activity.xml} | 0 ...pha1.xml => bar_status_alpha_activity.xml} | 2 +- .../res/layout/bar_status_alpha_fragment.xml | 14 + .../res/layout/bar_status_color_fragment.xml | 14 + ...tom.xml => bar_status_custom_fragment.xml} | 0 .../res/layout/bar_status_drawer_activity.xml | 15 + ...t.xml => bar_status_fragment_activity.xml} | 2 +- .../layout/bar_status_image_view_activity.xml | 14 + .../layout/bar_status_image_view_fragment.xml | 27 ++ .../pkg/src/main/res/layout/dialog_screen.xml | 6 - ...ity_fragment.xml => fragment_activity.xml} | 2 +- .../res/layout/fragment_bar_status_alpha.xml | 44 --- .../res/layout/fragment_bar_status_color.xml | 35 --- .../layout/fragment_bar_status_image_view.xml | 51 ---- .../src/main/res/layout/fragment_child.xml | 36 +-- .../main/res/layout/fragment_container.xml | 80 +---- ...ialog_fragment.xml => fragment_dialog.xml} | 0 .../layout/fragment_item_shared_element.xml | 19 ++ .../pkg/src/main/res/layout/fragment_root.xml | 3 +- .../pkg/src/main/res/layout/item_image.xml | 18 -- .../src/main/res/layout/keyboard_activity.xml | 16 + ...ialog_keyboard.xml => keyboard_dialog.xml} | 7 +- .../pkg/src/main/res/layout/screen_dialog.xml | 15 + .../{activity_span.xml => span_activity.xml} | 0 .../{dialog_toast.xml => toast_dialog.xml} | 2 +- ...vigation_fragment.xml => fragment_nav.xml} | 0 ...tion_status_bar.xml => status_bar_nav.xml} | 0 .../pkg/src/main/res/values/strings.xml | 3 +- .../pkg/src/main/res/values/styles.xml | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- lib/base/build.gradle | 19 +- .../java/com/blankj/base/BaseActivity.java | 12 +- .../java/com/blankj/base/BaseApplication.java | 4 - .../java/com/blankj/base/BaseFragment.java | 100 +++++-- .../com/blankj/base/BaseLazyFragment.java | 38 --- .../main/java/com/blankj/base/IBaseView.java | 2 +- .../com/blankj/base/dialog/BaseDialog.java | 34 ++- .../base/dialog/BaseDialogFragment.java | 150 ++++++++++ .../blankj/base/dialog/DialogCallback.java | 21 ++ .../base/dialog/DialogLayoutCallback.java | 26 ++ .../src/main/res/layout/fragment_lazy.xml | 5 + lib/common/build.gradle | 2 +- .../common/activity/CommonActivity.java | 51 ++-- .../activity/CommonActivityDrawerView.java | 10 +- .../activity/CommonActivityItemsView.java | 8 +- .../activity/CommonActivityTitleView.java | 12 +- .../common/dialog/CommonDialogContent.java | 113 +++++++ .../common/dialog/CommonDialogLoading.java | 60 ++++ .../common/dialog/CommonLoadingDialog.java | 32 -- .../common/fragment/CommonFragment.java | 77 ++++- .../res/drawable/common_content_dialog_bg.xml | 8 + .../drawable/common_content_dialog_btn_bg.xml | 6 +- .../src/main/res/drawable/common_splash.xml | 9 + .../common_activity_title_stub_scroll.xml | 1 + .../main/res/layout/common_dialog_content.xml | 73 +++++ ...mmon_activity_item.xml => common_item.xml} | 0 .../res/layout/common_item_title_click.xml | 3 +- .../res/layout/common_item_title_seekbar.xml | 2 +- .../res/layout/common_item_title_switch.xml | 2 +- lib/common/src/main/res/values/dimens.xml | 1 + lib/common/src/main/res/values/styles.xml | 29 +- lib/subutil/build.gradle | 18 +- lib/utilcode/README-CN.md | 1 + lib/utilcode/build.gradle | 18 +- .../com/blankj/utilcode/util/AppUtils.java | 2 +- .../com/blankj/utilcode/util/BarUtils.java | 48 ++- .../com/blankj/utilcode/util/ClickUtils.java | 23 +- .../blankj/utilcode/util/EncryptUtils.java | 42 +++ .../blankj/utilcode/util/FragmentUtils.java | 4 +- .../com/blankj/utilcode/util/IntentUtils.java | 2 +- .../blankj/utilcode/util/KeyboardUtils.java | 43 ++- .../blankj/utilcode/util/PermissionUtils.java | 2 + .../com/blankj/utilcode/util/ToastUtils.java | 22 +- .../blankj/utilcode/util/UiMessageUtils.java | 1 + .../java/com/blankj/utilcode/util/Utils.java | 3 +- .../src/main/res/values-v21/styles.xml | 2 +- .../utilcode/util/EncryptUtilsTest.java | 8 + lib/utildebug/build.gradle | 12 +- plugin/api-gradle-plugin/build.gradle | 16 +- plugin/bus-gradle-plugin/build.gradle | 16 +- .../profile/profile-2019-11-20-12-52-35.html | 144 +++++++++ .../profile/profile-2019-11-20-13-40-34.html | 144 +++++++++ .../profile/profile-2019-11-20-13-41-25.html | 144 +++++++++ .../profile/profile-2019-11-22-22-09-54.html | 144 +++++++++ .../profile/profile-2019-11-23-13-46-38.html | 220 ++++++++++++++ settings.gradle | 71 ++++- 158 files changed, 3188 insertions(+), 2041 deletions(-) create mode 100644 buildSrc/src/main/groovy/TaskDurationUtils.groovy create mode 100644 config.json delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt delete mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => nav}/BarNavActivity.kt (98%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => notification}/BarNotificationActivity.kt (92%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => status}/BarStatusActivity.kt (97%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{BarStatusAlphaActivity.kt => status/BarStatusActivityAlpha.kt} (85%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{BarStatusColorActivity.kt => status/BarStatusActivityColor.kt} (90%) rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{BarStatusCustomActivity.kt => status/BarStatusActivityCustom.kt} (61%) create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt rename feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/{ => status/fragment}/BarStatusFragmentActivity.kt (82%) create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt create mode 100644 feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java rename feature/utilcode/pkg/src/main/res/anim/{slide_in_bottom_200.xml => slide_bottom_in_200.xml} (100%) rename feature/utilcode/pkg/src/main/res/anim/{slide_out_bottom_200.xml => slide_bottom_out_200.xml} (100%) rename feature/utilcode/pkg/src/main/res/anim/{slide_out_left_1000.xml => slide_left_out_1000.xml} (100%) rename feature/utilcode/pkg/src/main/res/anim/{slide_in_right_1000.xml => slide_right_in_1000.xml} (100%) create mode 100644 feature/utilcode/pkg/src/main/res/drawable/keyboard_dialog_bg.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_alpha.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_drawer.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_image_view.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_bar_status_swipe_back.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_click.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_activity_item_iv.xml => activity_item_shared_element_activity.xml} (100%) delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_keyboard.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_activity_sub.xml => activity_sub_activity.xml} (100%) delete mode 100644 feature/utilcode/pkg/src/main/res/layout/activity_util_core.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_adaptscreen_close.xml => adaptscreen_close_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{activity_adaptscreen_height.xml => adaptscreen_height_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{activity_adaptscreen_width.xml => adaptscreen_width_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{activity_bar_status_alpha1.xml => bar_status_alpha_activity.xml} (84%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_alpha_fragment.xml create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_color_fragment.xml rename feature/utilcode/pkg/src/main/res/layout/{fragment_bar_status_custom.xml => bar_status_custom_fragment.xml} (100%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_drawer_activity.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_bar_status_fragment.xml => bar_status_fragment_activity.xml} (94%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_activity.xml create mode 100644 feature/utilcode/pkg/src/main/res/layout/bar_status_image_view_fragment.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/dialog_screen.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_fragment.xml => fragment_activity.xml} (94%) delete mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_bar_status_alpha.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_bar_status_color.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_bar_status_image_view.xml rename feature/utilcode/pkg/src/main/res/layout/{dialog_fragment.xml => fragment_dialog.xml} (100%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/fragment_item_shared_element.xml delete mode 100644 feature/utilcode/pkg/src/main/res/layout/item_image.xml create mode 100644 feature/utilcode/pkg/src/main/res/layout/keyboard_activity.xml rename feature/utilcode/pkg/src/main/res/layout/{dialog_keyboard.xml => keyboard_dialog.xml} (89%) create mode 100644 feature/utilcode/pkg/src/main/res/layout/screen_dialog.xml rename feature/utilcode/pkg/src/main/res/layout/{activity_span.xml => span_activity.xml} (100%) rename feature/utilcode/pkg/src/main/res/layout/{dialog_toast.xml => toast_dialog.xml} (89%) rename feature/utilcode/pkg/src/main/res/menu/{navigation_fragment.xml => fragment_nav.xml} (100%) rename feature/utilcode/pkg/src/main/res/menu/{navigation_status_bar.xml => status_bar_nav.xml} (100%) delete mode 100644 lib/base/src/main/java/com/blankj/base/BaseLazyFragment.java create mode 100644 lib/base/src/main/java/com/blankj/base/dialog/BaseDialogFragment.java create mode 100644 lib/base/src/main/java/com/blankj/base/dialog/DialogCallback.java create mode 100644 lib/base/src/main/java/com/blankj/base/dialog/DialogLayoutCallback.java create mode 100644 lib/base/src/main/res/layout/fragment_lazy.xml create mode 100644 lib/common/src/main/java/com/blankj/common/dialog/CommonDialogContent.java create mode 100644 lib/common/src/main/java/com/blankj/common/dialog/CommonDialogLoading.java delete mode 100644 lib/common/src/main/java/com/blankj/common/dialog/CommonLoadingDialog.java create mode 100644 lib/common/src/main/res/drawable/common_content_dialog_bg.xml rename feature/utilcode/pkg/src/main/res/drawable/click_shape_round_rect.xml => lib/common/src/main/res/drawable/common_content_dialog_btn_bg.xml (53%) create mode 100644 lib/common/src/main/res/drawable/common_splash.xml create mode 100644 lib/common/src/main/res/layout/common_dialog_content.xml rename lib/common/src/main/res/layout/{common_activity_item.xml => common_item.xml} (100%) create mode 100644 reports/profile/profile-2019-11-20-12-52-35.html create mode 100644 reports/profile/profile-2019-11-20-13-40-34.html create mode 100644 reports/profile/profile-2019-11-20-13-41-25.html create mode 100644 reports/profile/profile-2019-11-22-22-09-54.html create mode 100644 reports/profile/profile-2019-11-23-13-46-38.html diff --git a/CHANGELOG.md b/CHANGELOG.md index c9fa371e30..8b68339099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `19/11/22` [fix] Adapt the project for Gradle version of 6.0. * `19/10/30` [add] Publish bus plugin v2.3. Publish api plugin v1.1. * `19/10/24` [upd] Demo's UI. * `19/10/22` [add] NotificationUtils. diff --git a/build.gradle b/build.gradle index 1a9f672d5a..04628ed39a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ConfigUtils.init(gradle) repositories { // use for debug plugin local - if (Config.depConfig.plugin.bus.useLocal || Config.depConfig.plugin.api.useLocal) { + if (Config.depConfig.plugin_bus.useLocal || Config.depConfig.plugin_api.useLocal) { maven() { url new File("maven") } diff --git a/buildApp.gradle b/buildApp.gradle index c46f1805d1..5a3dfe3f3a 100644 --- a/buildApp.gradle +++ b/buildApp.gradle @@ -2,11 +2,11 @@ apply { plugin "com.android.application" plugin "kotlin-android" plugin "kotlin-android-extensions" - if (Config.depConfig.plugin.bus.isApply) { - plugin "com.blankj.bus" + if (Config.depConfig.plugin_bus.isApply) { + plugin Config.depConfig.plugin_bus.pluginId } - if (Config.depConfig.plugin.api.isApply) { - plugin "com.blankj.api" + if (Config.depConfig.plugin_api.isApply) { + plugin Config.depConfig.plugin_api.pluginId } } @@ -62,23 +62,20 @@ android { dependencies { // LeakCanary - debugImplementation Config.depConfig.leakcanary.android.dep - debugImplementation Config.depConfig.leakcanary.support_fragment.dep - releaseImplementation Config.depConfig.leakcanary.android_no_op.dep + debugImplementation Config.depConfig.leakcanary_android.dep + debugImplementation Config.depConfig.leakcanary_support_fragment.dep + releaseImplementation Config.depConfig.leakcanary_android_no_op.dep - debugImplementation Config.depConfig.lib.utildebug.dep - releaseImplementation Config.depConfig.lib.utildebug_no_op.dep - - debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:1.1.8' - releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:1.1.8' + debugImplementation Config.depConfig.lib_utildebug.dep + releaseImplementation Config.depConfig.lib_utildebug_no_op.dep // 根据 Config.pkgConfig 来依赖所有 pkg for (def entrySet : ConfigUtils.getApplyPkgs().entrySet()) { api entrySet.value.dep } - if (Config.depConfig.feature.mock.isApply) { - api Config.depConfig.feature.mock.dep + if (Config.depConfig.feature_mock.isApply) { + api Config.depConfig.feature_mock.dep } } diff --git a/buildLib.gradle b/buildLib.gradle index f6342eea02..6dc9b18b2b 100644 --- a/buildLib.gradle +++ b/buildLib.gradle @@ -38,6 +38,6 @@ dependencies { api entrySet.value.dep } } else if (project.name == 'export') { - api Config.depConfig.lib.common.dep + api Config.depConfig.lib_common.dep } } \ No newline at end of file diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index 2116991668..311b13a1fe 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -18,100 +18,70 @@ class Config { static versionName = '1.25.10-alpha5'// E.g. 1.9.72 => 1,009,072 // lib version - static kotlin_version = '1.3.10' + static kotlin_version = '1.3.50' static support_version = '28.0.0' static leakcanary_version = '1.6.3' - // appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher - static appConfig = ['launcher'] - // pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空 - static pkgConfig = [] - static depConfig = [ - plugin : [ - gradle : new DepConfig("com.android.tools.build:gradle:3.4.2"), - kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"), - maven : new DepConfig("com.github.dcendents:android-maven-gradle-plugin:2.1"),// 上传到 maven - bintray: new DepConfig("com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4"),// 上传到 bintray - traute : new DepConfig("tech.harmonysoft:traute-gradle:1.1.10"),// 注解转非空判断 - - // 本地第一次上传插件新的版本需设置 useLocal = true, isApply = false - // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false - // 发布版本的话把 useLocal = false, isApply = false,更新版本号,发布成功后 isApply = true 即可使用远程库版本 - api : new DepConfig(false/*是否本地调试*/, "com.blankj:api-gradle-plugin:1.1", true/*是否使用插件*/), - bus : new DepConfig(false/*是否本地调试*/, "com.blankj:bus-gradle-plugin:2.3", true/*是否使用插件*/), - ], - - api_gradle_plugin: new DepConfig(":plugin:api-gradle-plugin", false), - bus_gradle_plugin: new DepConfig(":plugin:bus-gradle-plugin", false), - - feature : [ - mock : new DepConfig(":feature:mock"), - - launcher: [ - app: new DepConfig(":feature:launcher:app") - ], - - main : [ - app: new DepConfig(":feature:main:app"), - pkg: new DepConfig(":feature:main:pkg"), - ], - - subutil : [ - app : new DepConfig(":feature:subutil:app"), - pkg : new DepConfig(":feature:subutil:pkg"), - export: new DepConfig(":feature:subutil:export"), - ], - - utilcode: [ - app : new DepConfig(":feature:utilcode:app"), - pkg : new DepConfig(":feature:utilcode:pkg"), - export: new DepConfig(":feature:utilcode:export"), - ], - ], - - lib : [ - base : new DepConfig(":lib:base"), - common : new DepConfig(":lib:common"), - subutil : new DepConfig(":lib:subutil"), - utilcode : new DepConfig(true/*是否本地调试*/, ":lib:utilcode", "com.blankj:utilcode:$versionName"), - - utildebug : new DepConfig(true/*是否本地调试*/, ":lib:utildebug", "com.blankj:utildebug:$versionName"), - utildebug_no_op: new DepConfig(true/*是否本地调试*/, ":lib:utildebug-no-op", "com.blankj:utildebug-no-op:$versionName"), - ], - - support : [ - appcompat_v7: new DepConfig("com.android.support:appcompat-v7:$support_version"), - design : new DepConfig("com.android.support:design:$support_version"), - multidex : new DepConfig("com.android.support:multidex:1.0.2"), - constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"), - ], - - kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"), - - leakcanary : [ - android : new DepConfig("com.squareup.leakcanary:leakcanary-android:$leakcanary_version"), - android_no_op : new DepConfig("com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version"), - support_fragment: new DepConfig("com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version"), - ], - - free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"), - swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), - - gson : new DepConfig("com.google.code.gson:gson:2.8.6"), - glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"), - retrofit : new DepConfig("com.squareup.retrofit2:retrofit:2.4.0"), - commons_io : new DepConfig("commons-io:commons-io:2.6"), - eventbus : [ - lib : new DepConfig("org.greenrobot:eventbus:3.1.1"), - processor: new DepConfig("org.greenrobot:eventbus-annotation-processor:3.0.1") - ], - photo_view : new DepConfig("com.github.chrisbanes:PhotoView:2.0.0"), - - test : [ - junit : new DepConfig("junit:junit:4.12"), - robolectric: new DepConfig("org.robolectric:robolectric:4.2"), - ], + /*Never delete this line*/ + /*Generated by "config.json"*/ + plugin_api_gradle_plugin : new DepConfig(false, true, ":plugin:api-gradle-plugin"), + plugin_bus_gradle_plugin : new DepConfig(false, true, ":plugin:bus-gradle-plugin"), + feature_mock : new DepConfig(false, true, ":feature:mock"), + feature_launcher_app : new DepConfig(true, true, ":feature:launcher:app"), + feature_main_app : new DepConfig(false, true, ":feature:main:app"), + feature_main_pkg : new DepConfig(true, true, ":feature:main:pkg"), + feature_subutil_app : new DepConfig(false, true, ":feature:subutil:app"), + feature_subutil_pkg : new DepConfig(true, true, ":feature:subutil:pkg"), + feature_subutil_export : new DepConfig(true, true, ":feature:subutil:export"), + feature_utilcode_app : new DepConfig(false, true, ":feature:utilcode:app"), + feature_utilcode_pkg : new DepConfig(true, true, ":feature:utilcode:pkg"), + feature_utilcode_export : new DepConfig(true, true, ":feature:utilcode:export"), + lib_base : new DepConfig(true, true, ":lib:base"), + lib_common : new DepConfig(true, true, ":lib:common"), + lib_subutil : new DepConfig(true, true, ":lib:subutil"), + lib_utilcode : new DepConfig(true, true, ":lib:utilcode", "com.blankj:utilcode:1.25.10-alpha5"), + lib_utildebug : new DepConfig(true, true, ":lib:utildebug", "com.blankj:utildebug:1.25.10-alpha5"), + lib_utildebug_no_op : new DepConfig(true, true, ":lib:utildebug-no-op", "com.blankj:utildebug-no-op:1.25.10-alpha5"), + /*Never delete this line*/ + plugin_gradle : new DepConfig(pluginPath: "com.android.tools.build:gradle:3.5.2"), + plugin_kotlin : new DepConfig(pluginPath: "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"), + plugin_maven : new DepConfig(pluginPath: "com.github.dcendents:android-maven-gradle-plugin:2.1", pluginId: "com.github.dcendents.android-maven"),// 上传到 maven + plugin_bintray : new DepConfig(pluginPath: "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4", pluginId: "com.jfrog.bintray"),// 上传到 bintray + plugin_traute : new DepConfig(pluginPath: "tech.harmonysoft:traute-gradle:1.1.10", pluginId: "tech.harmonysoft.oss.traute"),// 注解转非空判断 + + // 本地第一次上传插件新的版本需设置 useLocal = true, isApply = false + // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false + // 发布版本的话把 useLocal = false, isApply = false,更新版本号,发布成功后 isApply = true 即可使用远程库版本 + plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.1", pluginId: "com.blankj.api"), + plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.3", pluginId: "com.blankj.bus"), + + support_appcompat_v7 : new DepConfig("com.android.support:appcompat-v7:$support_version"), + support_design : new DepConfig("com.android.support:design:$support_version"), + support_multidex : new DepConfig("com.android.support:multidex:1.0.2"), + support_constraint : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"), + + kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"), + + leakcanary_android : new DepConfig("com.squareup.leakcanary:leakcanary-android:$leakcanary_version"), + leakcanary_android_no_op : new DepConfig("com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version"), + leakcanary_support_fragment: new DepConfig("com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version"), + + free_proguard : new DepConfig("com.blankj:free-proguard:1.0.1"), + swipe_panel : new DepConfig("com.blankj:swipe-panel:1.2"), + + gson : new DepConfig("com.google.code.gson:gson:2.8.6"), + glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"), + retrofit : new DepConfig("com.squareup.retrofit2:retrofit:2.4.0"), + commons_io : new DepConfig("commons-io:commons-io:2.6"), + + eventbus_lib : new DepConfig("org.greenrobot:eventbus:3.1.1"), + eventbus_processor : new DepConfig("org.greenrobot:eventbus-annotation-processor:3.0.1"), + + photo_view : new DepConfig("com.github.chrisbanes:PhotoView:2.0.0"), + + test_junit : new DepConfig("junit:junit:4.12"), + test_robolectric : new DepConfig("org.robolectric:robolectric:4.2"), ] } //./gradlew clean :lib:utilcode:bintrayUpload \ No newline at end of file diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy index 78c239911e..908f9d72e3 100644 --- a/buildSrc/src/main/groovy/ConfigUtils.groovy +++ b/buildSrc/src/main/groovy/ConfigUtils.groovy @@ -1,16 +1,7 @@ -import org.apache.commons.io.FileUtils -import org.gradle.BuildListener -import org.gradle.BuildResult import org.gradle.api.Project import org.gradle.api.ProjectEvaluationListener import org.gradle.api.ProjectState -import org.gradle.api.Task -import org.gradle.api.execution.TaskExecutionListener -import org.gradle.api.initialization.Settings import org.gradle.api.invocation.Gradle -import org.gradle.api.tasks.TaskState - -import java.text.SimpleDateFormat /** *
@@ -22,235 +13,94 @@ import java.text.SimpleDateFormat
  */
 class ConfigUtils {
 
-    static getApplyPlugins() {
-        def plugins = getDepConfigByFilter(new DepConfigFilter() {
-            @Override
-            boolean accept(String name, DepConfig config) {
-                if (!name.startsWith("plugin.")) return false
-                if (!config.isApply) return false
-                return true
-            }
-        })
-        GLog.d("getApplyPlugins = ${GLog.object2String(plugins)}")
-        return plugins
+    static init(Gradle gradle) {
+        generateDep(gradle)
+        addCommonGradle(gradle)
+        TaskDurationUtils.init(gradle)
+        GitUtils.init(gradle)
     }
 
-    static getApplyPkgs() {
-        def applyPkgs = getDepConfigByFilter(new DepConfigFilter() {
-            @Override
-            boolean accept(String name, DepConfig config) {
-                if (!config.isApply) return false
-                return name.endsWith(".pkg")
+    /**
+     * 根据 depConfig 生成 dep
+     */
+    private static void generateDep(Gradle gradle) {
+        def configs = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            def (name, config) = [entry.key, entry.value]
+            if (name.startsWith("plugin_")) {
+                config.dep = config.pluginPath
+            } else {
+                if (config.useLocal) {
+                    config.dep = gradle.rootProject.findProject(config.localPath)
+                } else {
+                    config.dep = config.remotePath
+                }
             }
-        })
-        GLog.d("getApplyPkgs = ${GLog.object2String(applyPkgs)}")
-        return applyPkgs
+            configs.put(name, config)
+        }
+        GLog.l("generateDep = ${GLog.object2String(configs)}")
     }
 
-    static getApplyExports() {
-        def applyExports = getDepConfigByFilter(new DepConfigFilter() {
+    private static addCommonGradle(Gradle gradle) {
+        gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
             @Override
-            boolean accept(String name, DepConfig config) {
-                if (!config.isApply) return false
-                return name.endsWith(".export")
-            }
-        })
-        GLog.d("getApplyExports = ${GLog.object2String(applyExports)}")
-        return applyExports
-    }
-
-    static addBuildListener(Gradle gradle) {
-        gradle.addBuildListener(new ConfigBuildListener())
-        GitUtils.init(gradle)
-    }
-
-    private static class ConfigBuildListener implements BuildListener {
-
-        private List taskInfoList = []
-        private long startBuildMillis
-
-        @Override
-        void buildStarted(Gradle gradle) {}
-
-        @Override
-        void settingsEvaluated(Settings settings) {
-            startBuildMillis = System.currentTimeMillis()
-            GLog.d("settingsEvaluated")
-            includeModule(settings)
-        }
-
-        @Override
-        void projectsLoaded(Gradle gradle) {
-            GLog.d("projectsLoaded")
-            generateDep(gradle)
-
-            gradle.addProjectEvaluationListener(new ProjectEvaluationListener() {
-                @Override
-                void beforeEvaluate(Project project) {
-                    if (project.subprojects.isEmpty()) {
-                        if (project.path.contains(":plugin:")) {
-                            return
+            void beforeEvaluate(Project project) {
+                // 在 project 的 build.gradle 前 do sth.
+                if (project.subprojects.isEmpty()) {
+                    if (project.path.contains(":plugin:")) {
+                        return
+                    }
+                    if (project.name == "app") {
+                        GLog.l(project.toString() + " applies buildApp.gradle")
+                        project.apply {
+                            from "${project.rootDir.path}/buildApp.gradle"
                         }
-                        if (project.name == "app") {
-                            GLog.l(project.toString() + " applies buildApp.gradle")
-                            project.apply {
-                                from "${project.rootDir.path}/buildApp.gradle"
-                            }
-                        } else {
-                            GLog.l(project.toString() + " applies buildLib.gradle")
-                            project.apply {
-                                from "${project.rootDir.path}/buildLib.gradle"
-                            }
+                    } else {
+                        GLog.l(project.toString() + " applies buildLib.gradle")
+                        project.apply {
+                            from "${project.rootDir.path}/buildLib.gradle"
                         }
                     }
                 }
-
-                @Override
-                void afterEvaluate(Project project, ProjectState projectState) {
-                }
-            })
-        }
-
-        @Override
-        void projectsEvaluated(Gradle gradle) {
-            GLog.d("projectsEvaluated")
-
-            gradle.addListener(new TaskExecutionListener() {
-                @Override
-                void beforeExecute(Task task) {
-                    task.ext.startTime = System.currentTimeMillis()
-                }
-
-                @Override
-                void afterExecute(Task task, TaskState state) {
-                    def exeDuration = System.currentTimeMillis() - task.ext.startTime
-                    if (exeDuration >= 100) {
-                        taskInfoList.add(new TaskInfo(task, exeDuration))
-                    }
-                }
-            })
-        }
-
-        @Override
-        void buildFinished(BuildResult result) {
-            GLog.d("buildFinished")
-            if (!taskInfoList.isEmpty()) {
-                Collections.sort(taskInfoList, new Comparator() {
-                    @Override
-                    int compare(TaskInfo t, TaskInfo t1) {
-                        return t1.exeDuration - t.exeDuration
-                    }
-                })
-                StringBuilder sb = new StringBuilder()
-                int buildSec = (System.currentTimeMillis() - startBuildMillis) / 1000;
-                int m = buildSec / 60;
-                int s = buildSec % 60;
-                def timeInfo = (m == 0 ? "${s}s" : "${m}m ${s}s (${buildSec}s)")
-                sb.append("BUILD FINISHED in $timeInfo\n")
-                taskInfoList.each {
-                    sb.append(String.format("%7sms %s\n", it.exeDuration, it.task.path))
-                }
-                def content = sb.toString()
-                GLog.l(content)
-                File file = new File(result.gradle.rootProject.buildDir.getAbsolutePath(),
-                        "build_time_records_" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".txt")
-                FileUtils.write(file, content)
             }
-        }
 
-        /**
-         * 在 settings.gradle 中 根据 appConfig 和 pkgConfig 来 include 本地模块
-         */
-        private static includeModule(Settings settings) {
-            if (Config.pkgConfig.isEmpty()) {
-                Config.depConfig.feature.mock.isApply = false
+            @Override
+            void afterEvaluate(Project project, ProjectState state) {
+                // 在 project 的 build.gradle 末 do sth.
             }
-            def config = getDepConfigByFilter(new DepConfigFilter() {
-                @Override
-                boolean accept(String name, DepConfig config) {
-                    if (name.endsWith('.app')) {
-                        def appName = name.substring('feature.'.length(), name.length() - 4)
-                        if (!Config.appConfig.contains(appName)) {
-                            config.isApply = false
-                        }
-                    }
-                    if (name.endsWith('.pkg')) {
-                        if (!Config.pkgConfig.isEmpty()) {
-                            def pkgName = name.substring('feature.'.length(), name.length() - 4)
-                            if (!Config.pkgConfig.contains(pkgName)) {
-                                config.isApply = false
-                            }
-                        }
-                    }
+        })
+    }
 
-                    if (!config.isApply) return false
-                    if (!config.useLocal) return false
-                    if (config.localPath == "") return false
-                    return true
-                }
-            }).each { _, cfg ->
-                settings.include cfg.localPath
+    static getApplyPlugins() {
+        def plugins = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            if (entry.value.isApply && entry.key.startsWith("plugin_")) {
+                plugins.put(entry.key, entry.value)
             }
-            GLog.l("includeModule = ${GLog.object2String(config)}")
         }
+        GLog.d("getApplyPlugins = ${GLog.object2String(plugins)}")
+        return plugins
+    }
 
-        /**
-         * 根据 depConfig 生成 dep
-         */
-        private static generateDep(Gradle gradle) {
-            def config = getDepConfigByFilter(new DepConfigFilter() {
-                @Override
-                boolean accept(String name, DepConfig config) {
-                    if (name.startsWith("plugin.")) {
-                        config.dep = config.remotePath
-                        return true
-                    }
-                    if (config.useLocal) {
-                        config.dep = gradle.rootProject.findProject(config.localPath)
-                    } else {
-                        config.dep = config.remotePath
-                    }
-                    return true
-                }
-            })
-            GLog.l("generateDep = ${GLog.object2String(config)}")
-        }
-
-        private static class TaskInfo {
-
-            Task task
-            long exeDuration
-
-            TaskInfo(Task task, long exeDuration) {
-                this.task = task
-                this.exeDuration = exeDuration
+    static getApplyPkgs() {
+        def pkgs = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            if (entry.value.isApply && entry.key.endsWith("_pkg")) {
+                pkgs.put(entry.key, entry.value)
             }
         }
+        GLog.d("getApplyPkgs = ${GLog.object2String(pkgs)}")
+        return pkgs
     }
 
-    static Map getDepConfigByFilter(DepConfigFilter filter) {
-        return _getDepConfigByFilter("", Config.depConfig, filter)
-    }
-
-    private static _getDepConfigByFilter(String namePrefix, Map map, DepConfigFilter filter) {
-        def depConfigList = [:]
-        for (Map.Entry entry : map.entrySet()) {
-            def (name, value) = [entry.getKey(), entry.getValue()]
-            if (value instanceof Map) {
-                namePrefix += (name + '.')
-                depConfigList.putAll(_getDepConfigByFilter(namePrefix, value, filter))
-                namePrefix -= (name + '.')
-                continue
-            }
-            def config = value as DepConfig
-            if (filter == null || filter.accept(namePrefix + name, config)) {
-                depConfigList.put(namePrefix + name, config)
+    static getApplyExports() {
+        def exports = [:]
+        for (Map.Entry entry : Config.depConfig.entrySet()) {
+            if (entry.value.isApply && entry.key.endsWith("_export")) {
+                exports.put(entry.key, entry.value)
             }
         }
-        return depConfigList
-    }
-
-    interface DepConfigFilter {
-        boolean accept(String name, DepConfig config);
+        GLog.d("getApplyExports = ${GLog.object2String(exports)}")
+        return exports
     }
 }
diff --git a/buildSrc/src/main/groovy/DepConfig.groovy b/buildSrc/src/main/groovy/DepConfig.groovy
index 86e56578cf..a50596e788 100644
--- a/buildSrc/src/main/groovy/DepConfig.groovy
+++ b/buildSrc/src/main/groovy/DepConfig.groovy
@@ -7,18 +7,23 @@
  * 
*/ class DepConfig { + boolean isApply // 是否应用 boolean useLocal // 是否使用本地的 String localPath // 本地路径 String remotePath// 远程路径 - boolean isApply // 是否应用 - String path // 最后的路径 + String pluginPath// 插件路径 + String pluginId // 插件 ID def dep // 根据条件生成项目最终的依赖项 + DepConfig() { + isApply = true + } + DepConfig(String path) { - this(path, true) + this(true, path) } - DepConfig(String path, boolean isApply) { + DepConfig(boolean isApply, String path) { if (path.startsWith(":")) { this.useLocal = true this.localPath = path @@ -28,23 +33,26 @@ class DepConfig { this.remotePath = path this.isApply = isApply } - this.path = path } - DepConfig(boolean useLocal, String path, boolean isApply) { // 自定义插件的构造函数 - this(useLocal, "", path, isApply) + DepConfig(boolean useLocal, String localPath, String remotePath) { + this(true, useLocal, localPath, remotePath) } - DepConfig(boolean useLocal, String localPath, String remotePath) { - this(useLocal, localPath, remotePath, true) + DepConfig(boolean isApply, boolean useLocal, String localPath) { + this(isApply, useLocal, localPath, null) } - DepConfig(boolean useLocal, String localPath, String remotePath, boolean isApply) { + DepConfig(boolean isApply, boolean useLocal, String localPath, String remotePath) { + this.isApply = isApply this.useLocal = useLocal this.localPath = localPath this.remotePath = remotePath - this.isApply = isApply - this.path = useLocal ? localPath : remotePath + } + + String getPath() { + if (pluginPath != null) return pluginPath + return useLocal ? localPath : remotePath } String getGroupId() { @@ -62,13 +70,15 @@ class DepConfig { return splits.length == 3 ? splits[2] : null } - @Override String toString() { - return "DepConfig { " + - "useLocal = " + useLocal + + return "{ isApply = ${getFlag(isApply)}" + + ", useLocal = ${getFlag(useLocal)}" + (dep == null ? ", path = " + path : (", dep = " + dep)) + - ", isApply = " + isApply + " }" } + + static String getFlag(boolean b) { + return b ? "✅" : "❌" + } } \ No newline at end of file diff --git a/buildSrc/src/main/groovy/GLog.groovy b/buildSrc/src/main/groovy/GLog.groovy index 3a6d835540..6a5554fc46 100644 --- a/buildSrc/src/main/groovy/GLog.groovy +++ b/buildSrc/src/main/groovy/GLog.groovy @@ -1,5 +1,3 @@ -import org.gradle.internal.impldep.org.apache.http.util.EntityUtils - /** *
  *     author: blankj
@@ -93,7 +91,7 @@ class GLog {
             sb.append("[")
             list.each { v ->
                 if (v instanceof Map || v instanceof List) {
-                    sb.append(String.format("$LogConst.LINE_SEP%${deep++ * 8}s${object2String(v)},", "", k))
+                    sb.append(String.format("$LogConst.LINE_SEP%${deep++ * 8}s${object2String(v)},", ""))
                     deep--
                 } else {
                     sb.append(String.format("$LogConst.LINE_SEP%${deep * 8}s$v,", ""))
diff --git a/buildSrc/src/main/groovy/TaskDurationUtils.groovy b/buildSrc/src/main/groovy/TaskDurationUtils.groovy
new file mode 100644
index 0000000000..48b2d2b6cc
--- /dev/null
+++ b/buildSrc/src/main/groovy/TaskDurationUtils.groovy
@@ -0,0 +1,86 @@
+import org.gradle.BuildListener
+import org.gradle.BuildResult
+import org.gradle.api.Task
+import org.gradle.api.execution.TaskExecutionListener
+import org.gradle.api.initialization.Settings
+import org.gradle.api.invocation.Gradle
+import org.gradle.api.tasks.TaskState
+
+import java.text.SimpleDateFormat
+
+/**
+ * 
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/11/22
+ *     desc  :
+ * 
+ */ +class TaskDurationUtils { + + static List taskInfoList = [] + static long startMillis + + static init(Gradle grd) { + startMillis = System.currentTimeMillis() + grd.addListener(new TaskExecutionListener() { + @Override + void beforeExecute(Task task) { + task.ext.startTime = System.currentTimeMillis() + } + + @Override + void afterExecute(Task task, TaskState state) { + def exeDuration = System.currentTimeMillis() - task.ext.startTime + if (exeDuration >= 100) { + taskInfoList.add(new TaskInfo(task: task, exeDuration: exeDuration)) + } + } + }) + grd.addBuildListener(new BuildListener() { + @Override + void buildStarted(Gradle gradle) {} + + @Override + void settingsEvaluated(Settings settings) {} + + @Override + void projectsLoaded(Gradle gradle) {} + + @Override + void projectsEvaluated(Gradle gradle) {} + + @Override + void buildFinished(BuildResult buildResult) { + if (!taskInfoList.isEmpty()) { + Collections.sort(taskInfoList, new Comparator() { + @Override + int compare(TaskInfo t, TaskInfo t1) { + return t1.exeDuration - t.exeDuration + } + }) + StringBuilder sb = new StringBuilder() + int buildSec = (System.currentTimeMillis() - startMillis) / 1000; + int m = buildSec / 60; + int s = buildSec % 60; + def timeInfo = (m == 0 ? "${s}s" : "${m}m ${s}s (${buildSec}s)") + sb.append("BUILD FINISHED in $timeInfo\n") + taskInfoList.each { + sb.append(String.format("%7sms %s\n", it.exeDuration, it.task.path)) + } + def content = sb.toString() + GLog.d(content) + File file = new File(grd.rootProject.buildDir.getAbsolutePath(), + "build_time_records_" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".txt") + file.getParentFile().mkdirs() + file.write(content) + } + } + }) + } + + private static class TaskInfo { + Task task + long exeDuration + } +} diff --git a/config.json b/config.json new file mode 100644 index 0000000000..38f147e8bb --- /dev/null +++ b/config.json @@ -0,0 +1,27 @@ +{ + "appConfigDesc": "appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher", + "appConfig": ["launcher"], + "pkgConfigDesc": "pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空", + "pkgConfig": [], + "proConfigDesc": "proConfig 配置的是使用本地还是仓库,优先级低于 appConfig 和 pkgConfig", + "proConfig": [ + {"isApply": false, "useLocal": true, "localPath": ":plugin:api-gradle-plugin"}, + {"isApply": false, "useLocal": true, "localPath": ":plugin:bus-gradle-plugin"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:mock"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:launcher:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:main:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:main:pkg"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:pkg"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:subutil:export"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:app"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:pkg"}, + {"isApply": true, "useLocal": true, "localPath": ":feature:utilcode:export"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:base"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:common"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:subutil"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:utilcode", "remotePath": "com.blankj:utilcode:1.25.10-alpha5"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:utildebug", "remotePath": "com.blankj:utildebug:1.25.10-alpha5"}, + {"isApply": true, "useLocal": true, "localPath": ":lib:utildebug-no-op", "remotePath": "com.blankj:utildebug-no-op:1.25.10-alpha5"} + ] +} diff --git a/feature/launcher/app/build.gradle b/feature/launcher/app/build.gradle index 9320e2df30..408db62a67 100644 --- a/feature/launcher/app/build.gradle +++ b/feature/launcher/app/build.gradle @@ -1,5 +1,5 @@ apply plugin: 'kotlin-kapt' dependencies { - kapt Config.depConfig.eventbus.processor.dep + kapt Config.depConfig.eventbus_processor.dep } \ No newline at end of file diff --git a/feature/launcher/app/src/main/AndroidManifest.xml b/feature/launcher/app/src/main/AndroidManifest.xml index b683051e68..19f6313965 100644 --- a/feature/launcher/app/src/main/AndroidManifest.xml +++ b/feature/launcher/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:name="com.blankj.main.pkg.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="user" + android:theme="@style/SplashTheme" android:windowSoftInputMode="stateHidden"> diff --git a/feature/main/app/src/main/AndroidManifest.xml b/feature/main/app/src/main/AndroidManifest.xml index 5ccc1079c0..bb8c3398d4 100644 --- a/feature/main/app/src/main/AndroidManifest.xml +++ b/feature/main/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:name="com.blankj.main.pkg.MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="user" + android:theme="@style/SplashTheme" android:windowSoftInputMode="stateHidden"> diff --git a/feature/main/pkg/src/main/AndroidManifest.xml b/feature/main/pkg/src/main/AndroidManifest.xml index 5edb00cecb..1cfdba8f69 100644 --- a/feature/main/pkg/src/main/AndroidManifest.xml +++ b/feature/main/pkg/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="user" + android:theme="@style/SplashTheme" android:windowSoftInputMode="stateHidden" /> diff --git a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt index 815e861424..228abbf0a5 100644 --- a/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt +++ b/feature/main/pkg/src/main/java/com/blankj/main/pkg/MainActivity.kt @@ -38,6 +38,11 @@ class MainActivity : CommonActivity() { return R.layout.activity_main } + override fun onCreate(savedInstanceState: Bundle?) { + window.setBackgroundDrawable(null) + super.onCreate(savedInstanceState) + } + override fun initView(savedInstanceState: Bundle?, contentView: View?) { super.initView(savedInstanceState, contentView) setCommonItems(mainRv, CollectionUtils.newArrayList>( diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt index 31287e4ba8..648dcb295d 100644 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt +++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/feature/pinyin/PinyinActivity.kt @@ -40,7 +40,7 @@ class PinyinActivity : CommonActivity() { for (i in 0 until size) { val surname = surnames[i].toString() sb.append(String.format( - "\n%s 正确: %-6s 错误: %-6s", + "\n%s 正确: %-8s 错误: %-8s", surname, PinyinUtils.getSurnamePinyin(surname), PinyinUtils.ccs2Pinyin(surname) diff --git a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt index 45e67a4a0d..bb891aeb06 100644 --- a/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt +++ b/feature/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt @@ -1,10 +1,14 @@ package com.blankj.subutil.pkg.helper -import android.support.v7.app.AlertDialog +import android.support.v4.app.FragmentActivity +import android.util.Pair +import android.view.View +import com.blankj.common.dialog.CommonDialogContent import com.blankj.subutil.pkg.R import com.blankj.utilcode.util.ActivityUtils import com.blankj.utilcode.util.PermissionUtils import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest +import com.blankj.utilcode.util.StringUtils /** * ``` @@ -17,29 +21,29 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques object DialogHelper { fun showRationaleDialog(shouldRequest: ShouldRequest) { - val topActivity = ActivityUtils.getTopActivity() - if (topActivity == null || topActivity.isFinishing) return - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_rationale_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> shouldRequest.again(true) } - .setNegativeButton(android.R.string.cancel) { dialog, which -> shouldRequest.again(false) } - .setCancelable(false) - .create() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity?, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_rationale_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + shouldRequest.again(true) + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + shouldRequest.again(false) + })) .show() - } fun showOpenAppSettingDialog() { - val topActivity = ActivityUtils.getTopActivity() - if (topActivity == null || topActivity.isFinishing) return - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_denied_forever_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> PermissionUtils.launchAppDetailsSettings() } - .setNegativeButton(android.R.string.cancel) { dialog, which -> } - .setCancelable(false) - .create() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity?, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_denied_forever_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + PermissionUtils.launchAppDetailsSettings() + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + })) .show() } } diff --git a/feature/utilcode/pkg/src/main/AndroidManifest.xml b/feature/utilcode/pkg/src/main/AndroidManifest.xml index a96d44628c..24d52d5fb8 100644 --- a/feature/utilcode/pkg/src/main/AndroidManifest.xml +++ b/feature/utilcode/pkg/src/main/AndroidManifest.xml @@ -83,39 +83,39 @@ android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTop" /> return ActivityOptionsCompat.makeCustomAnimation(this, - R.anim.slide_in_right_1000, - R.anim.slide_out_left_1000) + R.anim.slide_right_in_1000, + R.anim.slide_left_out_1000) .toBundle() 1 -> return ActivityOptionsCompat.makeScaleUpAnimation(activityItem.element, activityItem.element.width / 2, @@ -185,12 +181,10 @@ class ActivityItem : CommonItem { lateinit var element: ImageView; - constructor() : super(R.layout.activity_activity_item_iv) + constructor() : super(R.layout.activity_item_shared_element_activity) override fun bind(holder: ItemViewHolder, position: Int) { super.bind(holder, position) - if (isViewType(R.layout.activity_activity_item_iv)) { - element = holder.findViewById(R.id.activityViewSharedElement) - } + element = holder.findViewById(R.id.activityViewSharedElement) } } \ No newline at end of file diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt index 7d5812371a..9c972d6234 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt @@ -8,7 +8,7 @@ import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.ColorUtils -import kotlinx.android.synthetic.main.activity_activity_sub.* +import kotlinx.android.synthetic.main.activity_sub_activity.* /** @@ -22,7 +22,7 @@ import kotlinx.android.synthetic.main.activity_activity_sub.* class SubActivityActivity : CommonActivity() { override fun bindLayout(): Int { - return R.layout.activity_activity_sub + return R.layout.activity_sub_activity } override fun bindTitleRes(): Int { @@ -30,6 +30,7 @@ class SubActivityActivity : CommonActivity() { } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) contentView?.setBackgroundColor(ColorUtils.getRandomColor(false)) activityViewSharedElement.setOnClickListener { val result = Intent() diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt index 3e1a92a743..007724289c 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptCloseActivity.kt @@ -20,10 +20,11 @@ class AdaptCloseActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_adaptscreen_close + return R.layout.adaptscreen_close_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt index 7e885f1c46..6f312e4cd9 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptHeightActivity.kt @@ -20,10 +20,11 @@ class AdaptHeightActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_adaptscreen_height + return R.layout.adaptscreen_height_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt index 070f2a772c..6ccd3f45a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptWidthActivity.kt @@ -10,7 +10,7 @@ import android.view.WindowManager import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.AdaptScreenUtils -import kotlinx.android.synthetic.main.activity_adaptscreen_width.* +import kotlinx.android.synthetic.main.adaptscreen_width_activity.* class AdaptWidthActivity : CommonActivity() { @@ -22,10 +22,11 @@ class AdaptWidthActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_adaptscreen_width + return R.layout.adaptscreen_width_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) adaptScreenWidthWebView.setBackgroundColor(Color.parseColor("#f0d26d")) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt index 1a188dc4fc..26801106a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarActivity.kt @@ -3,12 +3,14 @@ package com.blankj.utilcode.pkg.feature.bar import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityItemsView -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.pkg.feature.bar.nav.BarNavActivity +import com.blankj.utilcode.pkg.feature.bar.notification.BarNotificationActivity +import com.blankj.utilcode.pkg.feature.bar.status.* +import com.blankj.utilcode.pkg.feature.bar.status.fragment.BarStatusFragmentActivity import com.blankj.utilcode.util.CollectionUtils /** @@ -39,22 +41,22 @@ class BarActivity : CommonActivity() { BarStatusActivity.start(this) }, CommonItemClick(R.string.bar_status_set_color, true) { - BarStatusColorActivity.start(this) + BarStatusActivityColor.start(this) }, CommonItemClick(R.string.bar_status_set_alpha, true) { - BarStatusAlphaActivity.start(this) + BarStatusActivityAlpha.start(this) }, CommonItemClick(R.string.bar_status_set_image_view, true) { - BarStatusImageViewActivity.start(this) + BarStatusActivityImageView.start(this) }, CommonItemClick(R.string.bar_status_set_custom, true) { - BarStatusCustomActivity.start(this) + BarStatusActivityCustom.start(this) }, CommonItemClick(R.string.bar_status_set_fragment, true) { BarStatusFragmentActivity.start(this) }, CommonItemClick(R.string.bar_status_set_drawer, true) { - BarStatusDrawerActivity.start(this) + BarStatusActivityDrawer.start(this) }, CommonItemTitle(R.string.bar_about_notification_bar, true), CommonItemClick(R.string.bar_notification_about, true) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt deleted file mode 100644 index a4df4901cf..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaFragment.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.SeekBar -import com.blankj.base.BaseLazyFragment -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_alpha.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusAlphaFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusAlphaFragment { - return BarStatusAlphaFragment() - } - } - - private var mAlpha: Int = 112 - - private val translucentListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - barStatusAlphaFragmentAboutTv.text = mAlpha.toString() - updateFakeStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - override fun initData(bundle: Bundle?) {} - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_alpha - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusAlphaFragmentSetTransparentBtn) - barStatusAlphaFragmentChangeAlphaSb.setOnSeekBarChangeListener(translucentListener) - barStatusAlphaFragmentAboutTv.text = mAlpha.toString() - - updateFakeStatusBar() - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusAlphaSetTransparentBtn -> barStatusAlphaFragmentChangeAlphaSb.progress = 0 - } - } - - fun updateFakeStatusBar() { - BarUtils.setStatusBarColor(barStatusAlphaFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt deleted file mode 100644 index 756109421c..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorFragment.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.os.Bundle -import android.view.View -import com.blankj.base.BaseLazyFragment -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.ColorUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_color.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusColorFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusColorFragment { - return BarStatusColorFragment() - } - } - - private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary) - - override fun initData(bundle: Bundle?) {} - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_color - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusColorFragmentRandomColorBtn) - updateFakeStatusBar() - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusColorFragmentRandomColorBtn -> { - mColor = ColorUtils.getRandomColor() - updateFakeStatusBar() - } - } - } - - private fun updateFakeStatusBar() { - BarUtils.setStatusBarColor(barStatusColorFragmentFakeStatusBar, mColor) - barStatusColorFragmentAboutColorTv.text = String.format(ColorUtils.int2ArgbString(mColor)) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt deleted file mode 100644 index 4a3d38d099..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomFragment.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.os.Bundle -import android.view.View -import com.blankj.base.BaseLazyFragment - -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_custom.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusCustomFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusCustomFragment { - return BarStatusCustomFragment() - } - } - - override fun initData(bundle: Bundle?) {} - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_custom - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - BarUtils.setStatusBarCustom(barStatusCustomFragmentFakeStatusBar) - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) {} -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt deleted file mode 100644 index 8f2fb17bb8..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusDrawerActivity.kt +++ /dev/null @@ -1,122 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.content.Context -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.CompoundButton -import android.widget.SeekBar -import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityDrawerView -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.ColorUtils -import kotlinx.android.synthetic.main.activity_bar_status_drawer.* - - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : demo about BarUtils - * ``` - */ -class BarStatusDrawerActivity : CommonActivity() { - - companion object { - fun start(context: Context) { - val starter = Intent(context, BarStatusDrawerActivity::class.java) - context.startActivity(starter) - } - } - - override fun bindDrawer(): Boolean { - return true - } - - private var mColor: Int = 0 - private var mAlpha: Int = 0 - - private val mColorListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - updateStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - private var mAlphaCheckedChangeListener: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { _, isChecked -> - if (isChecked) { - barStatusDrawerChangeAlphaSb.visibility = View.VISIBLE - barStatusDrawerRandomColorBtn.visibility = View.GONE - barStatusDrawerSetTransparentBtn.visibility = View.VISIBLE - - drawerView.mBaseDrawerContainerView.setBackgroundResource(R.drawable.image_lena) - } else { - barStatusDrawerChangeAlphaSb.visibility = View.GONE - barStatusDrawerRandomColorBtn.visibility = View.VISIBLE - barStatusDrawerSetTransparentBtn.visibility = View.GONE - - drawerView.mBaseDrawerContainerView.setBackgroundColor(Color.WHITE) - } - updateStatusBar() - } - - private var mFrontCheckedChangeListener: CompoundButton.OnCheckedChangeListener = CompoundButton.OnCheckedChangeListener { _, _ -> updateStatusBar() } - - override fun isSwipeBack(): Boolean { - return false - } - - override fun initData(bundle: Bundle?) { - mColor = ColorUtils.getColor(R.color.colorPrimary) - mAlpha = 112 - } - - override fun bindLayout(): Int { - return R.layout.activity_bar_status_drawer - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - barStatusDrawerAlphaCb.setOnCheckedChangeListener(mAlphaCheckedChangeListener) - barStatusDrawerFrontCb.setOnCheckedChangeListener(mFrontCheckedChangeListener) - barStatusDrawerChangeAlphaSb.setOnSeekBarChangeListener(mColorListener) - applyDebouncingClickListener( - barStatusDrawerRandomColorBtn, - barStatusDrawerSetTransparentBtn - ) - - barStatusDrawerChangeAlphaSb.visibility = View.GONE - barStatusDrawerSetTransparentBtn.visibility = View.GONE - - updateStatusBar() - } - - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusDrawerRandomColorBtn -> { - mColor = ColorUtils.getRandomColor() - updateStatusBar() - } - R.id.barStatusDrawerSetTransparentBtn -> barStatusDrawerChangeAlphaSb.progress = 0 - } - } - - private fun updateStatusBar() { - if (barStatusDrawerAlphaCb.isChecked) { - BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, Color.argb(mAlpha, 0, 0, 0), barStatusDrawerFrontCb.isChecked) - barStatusDrawerAboutTv.text = mAlpha.toString() - } else { - BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, mColor, barStatusDrawerFrontCb.isChecked) - barStatusDrawerAboutTv.text = ColorUtils.int2ArgbString(mColor) - } - BarUtils.addMarginTopEqualStatusBarHeight(barStatusDrawerAlphaCb)// 其实这个只需要调用一次即可 - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt deleted file mode 100644 index 68d71341c0..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewActivity.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.content.Context -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.SeekBar -import com.blankj.common.activity.CommonActivity -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import kotlinx.android.synthetic.main.activity_bar_status_image_view.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/05/27 - * desc : demo about BarUtils - * ``` - */ -class BarStatusImageViewActivity : CommonActivity() { - - companion object { - fun start(context: Context) { - val starter = Intent(context, BarStatusImageViewActivity::class.java) - context.startActivity(starter) - } - } - - private var mAlpha: Int = 0 - - private val translucentListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - barStatusImageViewAboutTv.text = mAlpha.toString() - updateStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - override fun isSwipeBack(): Boolean { - return true - } - - override fun initData(bundle: Bundle?) { - mAlpha = 112 - } - - override fun bindLayout(): Int { - return R.layout.activity_bar_status_image_view - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusImageViewSetTransparentBtn) - barStatusImageViewChangeAlphaSb.setOnSeekBarChangeListener(translucentListener) - barStatusImageViewAboutTv.text = mAlpha.toString() - - updateStatusBar() - } - - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusImageViewSetTransparentBtn -> barStatusImageViewChangeAlphaSb.progress = 0 - } - } - - private fun updateStatusBar() { - BarUtils.setStatusBarColor(this, Color.argb(mAlpha, 0, 0, 0), true) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt deleted file mode 100644 index 95c0f75268..0000000000 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusImageViewFragment.kt +++ /dev/null @@ -1,72 +0,0 @@ -package com.blankj.utilcode.pkg.feature.bar - -import android.graphics.Color -import android.os.Bundle -import android.view.View -import android.widget.SeekBar -import com.blankj.base.BaseLazyFragment -import com.blankj.utilcode.pkg.R -import com.blankj.utilcode.util.BarUtils -import com.blankj.utilcode.util.LogUtils -import kotlinx.android.synthetic.main.fragment_bar_status_image_view.* - -/** - * ``` - * author: Blankj - * blog : http://blankj.com - * time : 2017/07/01 - * desc : demo about BarUtils - * ``` - */ -class BarStatusImageViewFragment : BaseLazyFragment() { - - companion object { - fun newInstance(): BarStatusImageViewFragment { - return BarStatusImageViewFragment() - } - } - - private var mAlpha: Int = 0 - - private val translucentListener = object : SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - mAlpha = progress - barStatusImageViewFragmentAboutTv.text = mAlpha.toString() - updateFakeStatusBar() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) {} - - override fun onStopTrackingTouch(seekBar: SeekBar) {} - } - - override fun initData(bundle: Bundle?) { - mAlpha = 112 - } - - override fun bindLayout(): Int { - return R.layout.fragment_bar_status_image_view - } - - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener(barStatusImageViewFragmentSetTransparentBtn) - barStatusImageViewFragmentChangeAlphaSb.setOnSeekBarChangeListener(translucentListener) - barStatusImageViewFragmentAboutTv.text = mAlpha.toString() - - updateFakeStatusBar() - } - - override fun doLazyBusiness() { - LogUtils.d("doLazyBusiness() called") - } - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.barStatusImageViewSetTransparentBtn -> barStatusImageViewFragmentChangeAlphaSb.progress = 0 - } - } - - fun updateFakeStatusBar() { - BarUtils.setStatusBarColor(barStatusImageViewFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) - } -} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNavActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt similarity index 98% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNavActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt index baf68b9e7c..2950c2bf5d 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNavActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/nav/BarNavActivity.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.nav import android.content.Context import android.content.Intent diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNotificationActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt similarity index 92% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNotificationActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt index 86cca16aff..5504912ee6 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarNotificationActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/notification/BarNotificationActivity.kt @@ -1,10 +1,9 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.notification import android.content.Context import android.content.Intent import android.os.Handler import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt similarity index 97% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt index 0570fb33c8..5983365f83 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivity.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt similarity index 85% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt index d9b3fa0a9b..b7464443bd 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusAlphaActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityAlpha.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent @@ -22,11 +22,11 @@ import com.blankj.utilcode.util.ColorUtils * desc : demo about BarUtils * ``` */ -class BarStatusAlphaActivity : CommonActivity() { +class BarStatusActivityAlpha : CommonActivity() { companion object { fun start(context: Context) { - val starter = Intent(context, BarStatusAlphaActivity::class.java) + val starter = Intent(context, BarStatusActivityAlpha::class.java) context.startActivity(starter) } } @@ -34,16 +34,16 @@ class BarStatusAlphaActivity : CommonActivity() { private var mAlpha: Int = 112 override fun bindLayout(): Int { - return R.layout.activity_bar_status_alpha1 + return R.layout.bar_status_alpha_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { super.initView(savedInstanceState, contentView) - setCommonItems(findViewById(R.id.commonItemRv), bindItems()) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) updateStatusBar() } - override fun bindItems(): List> { + private fun getItems(): List> { return CollectionUtils.newArrayList>( CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt similarity index 90% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt index 73e7a34363..74b6368e1b 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusColorActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityColor.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent @@ -20,11 +20,11 @@ import com.blankj.utilcode.util.ColorUtils * desc : demo about BarUtils * ``` */ -class BarStatusColorActivity : CommonActivity() { +class BarStatusActivityColor : CommonActivity() { companion object { fun start(context: Context) { - val starter = Intent(context, BarStatusColorActivity::class.java) + val starter = Intent(context, BarStatusActivityColor::class.java) context.startActivity(starter) } } @@ -34,8 +34,8 @@ class BarStatusColorActivity : CommonActivity() { override fun bindItems(): List> { return CollectionUtils.newArrayList>( CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener { - updateStatusBar() mColor = ColorUtils.getRandomColor() + updateStatusBar() return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) } ) diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt similarity index 61% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt index 72712239f3..0cea718cf9 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusCustomActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityCustom.kt @@ -1,8 +1,10 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle +import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BarUtils @@ -16,16 +18,17 @@ import com.blankj.utilcode.util.BarUtils * desc : demo about BarUtils * ``` */ -class BarStatusCustomActivity : CommonActivity() { +class BarStatusActivityCustom : CommonActivity() { companion object { fun start(context: Context) { - val starter = Intent(context, BarStatusCustomActivity::class.java) + val starter = Intent(context, BarStatusActivityCustom::class.java) context.startActivity(starter) } } - override fun doBusiness() { + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) BarUtils.setStatusBarColor(this, Color.TRANSPARENT).setBackgroundResource(R.drawable.bar_status_custom) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt new file mode 100644 index 0000000000..2ddbc3c13f --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityDrawer.kt @@ -0,0 +1,111 @@ +package com.blankj.utilcode.pkg.feature.bar.status + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.common.item.CommonItemSwitch +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ColorUtils +import com.blankj.utilcode.util.Utils +import kotlinx.android.synthetic.main.bar_status_drawer_activity.* + + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/05/27 + * desc : demo about BarUtils + * ``` + */ +class BarStatusActivityDrawer : CommonActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, BarStatusActivityDrawer::class.java) + context.startActivity(starter) + } + } + + private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary) + private var mAlpha: Int = 112 + + private var mAlphaStatus: Boolean = false + private var mFrontStatus: Boolean = false + + override fun isSwipeBack(): Boolean { + return false + } + + override fun bindDrawer(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_drawer_activity + } + + private fun getItems(): MutableList> { + val randomColorItem = CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener { + mColor = ColorUtils.getRandomColor() + updateStatusBar() + return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) + } + + val alphaItem: CommonItem<*> = CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + + return CollectionUtils.newArrayList( + CommonItemSwitch(R.string.bar_status_title_alpha, Utils.Func1 { + updateStatusBar() + return@Func1 mAlphaStatus + }, Utils.Func1 { + mAlphaStatus = it + if (mAlphaStatus) { + barStatusDrawerRootLl.setBackgroundResource(R.drawable.image_lena) + commonItemAdapter.replaceItem(2, alphaItem, true) + } else { + barStatusDrawerRootLl.setBackgroundColor(Color.TRANSPARENT) + commonItemAdapter.replaceItem(2, randomColorItem, true) + } + }), + CommonItemSwitch(R.string.bar_status_is_front, Utils.Func1 { + return@Func1 mFrontStatus + }, Utils.Func1 { + mFrontStatus = it + updateStatusBar() + }), + randomColorItem + ) + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + } + + private fun updateStatusBar() { + if (mAlphaStatus) { + BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, Color.argb(mAlpha, 0, 0, 0), mFrontStatus) + } else { + BarUtils.setStatusBarColor4Drawer(drawerView.mBaseDrawerRootLayout, barStatusDrawerFakeStatusBar, mColor, mFrontStatus) + } + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt new file mode 100644 index 0000000000..533a40d7f5 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/BarStatusActivityImageView.kt @@ -0,0 +1,63 @@ +package com.blankj.utilcode.pkg.feature.bar.status + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.activity.CommonActivity +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/05/27 + * desc : demo about BarUtils + * ``` + */ +class BarStatusActivityImageView : CommonActivity() { + + companion object { + fun start(context: Context) { + val starter = Intent(context, BarStatusActivityImageView::class.java) + context.startActivity(starter) + } + } + + private var mAlpha: Int = 112 + + override fun bindLayout(): Int { + return R.layout.bar_status_image_view_activity + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + ) + } + + private fun updateStatusBar() { + BarUtils.setStatusBarColor(this, Color.argb(mAlpha, 0, 0, 0), true) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt similarity index 82% rename from feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt rename to feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt index 3ad2ed21f1..d504987c93 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentActivity.kt @@ -1,4 +1,4 @@ -package com.blankj.utilcode.pkg.feature.bar +package com.blankj.utilcode.pkg.feature.bar.status.fragment import android.content.Context import android.content.Intent @@ -10,7 +10,7 @@ import android.support.v4.view.ViewPager import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R -import kotlinx.android.synthetic.main.activity_bar_status_fragment.* +import kotlinx.android.synthetic.main.bar_status_fragment_activity.* import java.util.* /** @@ -65,19 +65,18 @@ class BarStatusFragmentActivity : CommonActivity() { return false } - override fun initData(bundle: Bundle?) {} - override fun bindLayout(): Int { - return R.layout.activity_bar_status_fragment + return R.layout.bar_status_fragment_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { - mFragmentList.add(BarStatusColorFragment.newInstance()) - mFragmentList.add(BarStatusAlphaFragment.newInstance()) - mFragmentList.add(BarStatusImageViewFragment.newInstance()) - mFragmentList.add(BarStatusCustomFragment.newInstance()) + super.initView(savedInstanceState, contentView) + mFragmentList.add(BarStatusFragmentColor.newInstance()) + mFragmentList.add(BarStatusFragmentAlpha.newInstance()) + mFragmentList.add(BarStatusFragmentImageView.newInstance()) + mFragmentList.add(BarStatusFragmentCustom.newInstance()) - barStatusFragmentVp.offscreenPageLimit = 3 + barStatusFragmentVp.offscreenPageLimit = mFragmentList.size - 1 barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) { override fun getItem(position: Int): Fragment { return mFragmentList[position] @@ -87,7 +86,6 @@ class BarStatusFragmentActivity : CommonActivity() { return mFragmentList.size } } - barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} @@ -100,8 +98,4 @@ class BarStatusFragmentActivity : CommonActivity() { barStatusFragmentNav.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) } - - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) {} } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt new file mode 100644 index 0000000000..15797fc505 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentAlpha.kt @@ -0,0 +1,68 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ColorUtils +import kotlinx.android.synthetic.main.bar_status_alpha_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentAlpha : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentAlpha { + return BarStatusFragmentAlpha() + } + } + + override fun isLazy(): Boolean { + return true + } + + private var mAlpha: Int = 112 + + override fun bindLayout(): Int { + return R.layout.bar_status_alpha_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateFakeStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateFakeStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }).apply { + backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 0.5f) + } + ) + } + + fun updateFakeStatusBar() { + BarUtils.setStatusBarColor(barStatusAlphaFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt new file mode 100644 index 0000000000..029523e59d --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentColor.kt @@ -0,0 +1,59 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.os.Bundle +import android.view.View +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import com.blankj.utilcode.util.ColorUtils +import kotlinx.android.synthetic.main.bar_status_color_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentColor : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentColor { + return BarStatusFragmentColor() + } + } + + private var mColor: Int = ColorUtils.getColor(R.color.colorPrimary) + + override fun isLazy(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_color_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateFakeStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemClick(R.string.bar_status_random_color, ColorUtils.int2ArgbString(mColor)).setOnClickUpdateContentListener { + mColor = ColorUtils.getRandomColor() + updateFakeStatusBar() + return@setOnClickUpdateContentListener ColorUtils.int2ArgbString(mColor) + } + ) + } + + private fun updateFakeStatusBar() { + BarUtils.setStatusBarColor(barStatusColorFragmentFakeStatusBar, mColor) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt new file mode 100644 index 0000000000..e8dbcd927c --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentCustom.kt @@ -0,0 +1,38 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.os.Bundle +import android.view.View +import com.blankj.common.fragment.CommonFragment +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import kotlinx.android.synthetic.main.bar_status_custom_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentCustom : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentCustom { + return BarStatusFragmentCustom() + } + } + + override fun isLazy(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_custom_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + BarUtils.setStatusBarCustom(barStatusCustomFragmentFakeStatusBar) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt new file mode 100644 index 0000000000..54571b6ddd --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/status/fragment/BarStatusFragmentImageView.kt @@ -0,0 +1,65 @@ +package com.blankj.utilcode.pkg.feature.bar.status.fragment + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.SeekBar +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemSeekBar +import com.blankj.utilcode.pkg.R +import com.blankj.utilcode.util.BarUtils +import com.blankj.utilcode.util.CollectionUtils +import kotlinx.android.synthetic.main.bar_status_image_view_fragment.* + +/** + * ``` + * author: Blankj + * blog : http://blankj.com + * time : 2017/07/01 + * desc : demo about BarUtils + * ``` + */ +class BarStatusFragmentImageView : CommonFragment() { + + companion object { + fun newInstance(): BarStatusFragmentImageView { + return BarStatusFragmentImageView() + } + } + + private var mAlpha: Int = 112 + + override fun isLazy(): Boolean { + return true + } + + override fun bindLayout(): Int { + return R.layout.bar_status_image_view_fragment + } + + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) + setCommonItems(findViewById(R.id.commonItemRv), getItems()) + updateFakeStatusBar() + } + + private fun getItems(): List> { + return CollectionUtils.newArrayList>( + CommonItemSeekBar("Status Bar Alpha", 255, mAlpha, object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + mAlpha = progress + updateFakeStatusBar() + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + ) + } + + fun updateFakeStatusBar() { + BarUtils.setStatusBarColor(barStatusImageViewFragmentFakeStatusBar, Color.argb(mAlpha, 0, 0, 0)) + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt index 31c5f86c99..7159b3e5a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt @@ -3,7 +3,6 @@ package com.blankj.utilcode.pkg.feature.bus import android.content.Context import android.content.Intent import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView import com.blankj.common.item.CommonItem import com.blankj.common.item.CommonItemClick import com.blankj.common.item.CommonItemTitle @@ -14,6 +13,7 @@ import com.blankj.utilcode.util.ThreadUtils import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import java.util.* +import java.util.concurrent.CopyOnWriteArrayList /** @@ -66,8 +66,8 @@ class BusCompareActivity : CommonActivity() { * 注册 10000 个订阅者,共执行 10 次取平均值 */ private fun compareRegister10000Times() { - val eventBusTests = java.util.ArrayList() - val busUtilsTests = java.util.ArrayList() + val eventBusTests = CopyOnWriteArrayList() + val busUtilsTests = CopyOnWriteArrayList() compareWithEventBus("Register 10000 times.", 10, 10000, object : CompareCallback { override fun runEventBus() { @@ -203,9 +203,7 @@ class BusCompareActivity : CommonActivity() { */ private fun compareWithEventBus(name: String, sampleSize: Int, times: Int, callback: CompareCallback, onFinishCallback: OnFinishCallback) { - showLoading { - ThreadUtils.cancel(ThreadUtils.getCpuPool()) - } + showLoading() ThreadUtils.executeByCpu(object : ThreadUtils.Task() { override fun doInBackground(): String { val dur = Array(2) { LongArray(sampleSize) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt index 4855a01ff2..79d408c2a0 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/click/ClickActivity.kt @@ -2,21 +2,21 @@ package com.blankj.utilcode.pkg.feature.click import android.content.Context import android.content.Intent -import android.os.Bundle +import android.support.annotation.StringRes import android.view.View -import android.widget.Button +import android.widget.TextView +import com.blankj.base.rv.ItemViewHolder import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView +import com.blankj.common.item.CommonItem import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* -import kotlinx.android.synthetic.main.activity_click.* /** * ``` * author: Blankj * blog : http://blankj.com * time : 2016/09/29 - * desc : demo about CleanUtils + * desc : demo about ClickUtils * ``` */ class ClickActivity : CommonActivity() { @@ -32,55 +32,84 @@ class ClickActivity : CommonActivity() { return R.string.demo_click } - override fun bindLayout(): Int { - return R.layout.activity_click - } + override fun bindItems(): MutableList> { + return CollectionUtils.newArrayList( + ClickItem(R.string.click_view_scale_default, Utils.Func1 { + ClickUtils.applyPressedViewScale(it) + }), + ClickItem(R.string.click_view_scale_half, Utils.Func1 { + ClickUtils.applyPressedViewScale(it, -0.5f) + }), + ClickItem(R.string.click_view_alpha_default, Utils.Func1 { + ClickUtils.applyPressedViewAlpha(it) + }), + ClickItem(R.string.click_bg_alpha_default, Utils.Func1 { + ClickUtils.applyPressedBgAlpha(it) + }), + ClickItem(R.string.click_bg_dark_default, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + }), + ClickItem(R.string.click_single_debouncing, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + ClickUtils.applySingleDebouncing(it, 5000) { + SnackbarUtils.with(mContentView) + .setMessage(StringUtils.getString(R.string.click_single_tip)) + .setBgColor(ColorUtils.getRandomColor(false)) + .setDuration(SnackbarUtils.LENGTH_LONG) + .show() + } + }), + ClickItem(R.string.click_global_debouncing, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + ClickUtils.applySingleDebouncing(it, 5000) { + SnackbarUtils.with(mContentView) + .setMessage(StringUtils.getString(R.string.click_global_tip)) + .setBgColor(ColorUtils.getRandomColor(false)) + .setDuration(SnackbarUtils.LENGTH_LONG) + .show() + } + }), + ClickItem(R.string.click_multi, Utils.Func1 { + ClickUtils.applyPressedBgDark(it) + it.setOnClickListener(object : ClickUtils.OnMultiClickListener(5) { + override fun onTriggerClick(v: View) { + ToastUtils.showShort("onTriggerClick") + } - override fun initView(savedInstanceState: Bundle?, contentView: View?) { - applyDebouncingClickListener( - clickViewScaleDefaultBtn, - clickViewScaleCustomBtn, - clickViewAlphaDefaultBtn, - clickBgAlphaDefaultBtn, - clickBgDarkDefaultBtn + override fun onBeforeTriggerClick(v: View, count: Int) { + ToastUtils.showShort(count) + } + }) + }) ) + } - ClickUtils.applyPressedViewScale(clickViewScaleDefaultBtn) - ClickUtils.applyPressedViewScale(clickViewScaleCustomBtn, -0.5f) - ClickUtils.applyPressedViewAlpha(clickViewAlphaDefaultBtn) - ClickUtils.applyPressedBgAlpha(clickBgAlphaDefaultBtn) - ClickUtils.applyPressedBgDark(clickBgDarkDefaultBtn) + override fun onDestroy() { + super.onDestroy() + SnackbarUtils.dismiss() + } +} - ClickUtils.applySingleDebouncing(clickSingleDebouncingBtn, 5000) { - SnackbarUtils.with(mContentView) - .setMessage(StringUtils.getString(R.string.click_single_tip)) - .setBgColor(ColorUtils.getRandomColor(false)) - .setDuration(SnackbarUtils.LENGTH_LONG) - .show() - } - ClickUtils.applyGlobalDebouncing(clickGlobalDebouncingBtn, 5000) { - SnackbarUtils.with(mContentView) - .setMessage(StringUtils.getString(R.string.click_global_tip)) +class ClickItem : CommonItem { + + private val mFunc1: Utils.Func1; + private val mTitle: String + + constructor(@StringRes title: Int, func1: Utils.Func1) : super(R.layout.common_item_title_click) { + mFunc1 = func1 + mTitle = StringUtils.getString(title) + } + + override fun bind(holder: ItemViewHolder, position: Int) { + super.bind(holder, position) + holder.findViewById(R.id.commonItemTitleTv).text = mTitle + holder.itemView.setOnClickListener() { + SnackbarUtils.with(it) + .setMessage(mTitle) .setBgColor(ColorUtils.getRandomColor(false)) .setDuration(SnackbarUtils.LENGTH_LONG) .show() } - clickMultiBtn.setOnClickListener(object : ClickUtils.OnMultiClickListener(5) { - override fun onTriggerClick(v: View) { - ToastUtils.showShort("onTriggerClick") - } - - override fun onBeforeTriggerClick(v: View, count: Int) { - ToastUtils.showShort(count) - } - }) - } - - override fun onDebouncingClick(view: View) { - SnackbarUtils.with(mContentView) - .setMessage((view as Button).text) - .setBgColor(ColorUtils.getRandomColor(false)) - .setDuration(SnackbarUtils.LENGTH_LONG) - .show() + mFunc1.call(holder.itemView) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt index 1dbcfe51ee..c7c2e5fd0a 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ChildFragment.kt @@ -1,14 +1,17 @@ package com.blankj.utilcode.pkg.feature.fragment import android.os.Bundle +import android.support.v4.app.FragmentManager import android.view.View -import com.blankj.base.BaseLazyFragment +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper +import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.ColorUtils import com.blankj.utilcode.util.FragmentUtils import com.blankj.utilcode.util.SpanUtils -import kotlinx.android.synthetic.main.fragment_child.* /** * ``` @@ -18,7 +21,7 @@ import kotlinx.android.synthetic.main.fragment_child.* * desc : demo about FragmentUtils * ``` */ -class ChildFragment : BaseLazyFragment() { +class ChildFragment : CommonFragment() { companion object { fun newInstance(): ChildFragment { @@ -29,42 +32,50 @@ class ChildFragment : BaseLazyFragment() { } } - override fun initData(bundle: Bundle?) {} + private lateinit var fm: FragmentManager + private val mBgColor = ColorUtils.getRandomColor(false) override fun bindLayout(): Int { return R.layout.fragment_child } override fun initView(savedInstanceState: Bundle?, contentView: View?) { - FragmentUtils.setBackgroundColor(this, ColorUtils.getRandomColor(false)) - applyDebouncingClickListener( - fragmentChildShowStackBtn, - fragmentChildPopBtn, - fragmentChildRemoveBtn - ) + super.initView(savedInstanceState, contentView) + FragmentUtils.setBackgroundColor(this, mBgColor) + fm = fragmentManager!! + setCommonItems(findViewById(R.id.commonItemRv), getItems()) } - override fun doLazyBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.fragmentChildShowStackBtn -> DialogHelper.showFragmentDialog( - SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fragmentManager!!))) - .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fragmentManager!!))) - .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fragmentManager!!))) - .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fragmentManager!!))) - .appendLine() - .appendLine("---all of fragments---") - .appendLine(FragmentUtils.getAllFragments(fragmentManager!!).toString()) - .appendLine("----------------------") - .appendLine() - .appendLine("---stack top---") - .appendLine(FragmentUtils.getAllFragmentsInStack(fragmentManager!!).toString()) - .appendLine("---stack bottom---") - .create() - ) - R.id.fragmentChildPopBtn -> FragmentUtils.pop(fragmentManager!!); - R.id.fragmentChildRemoveBtn -> FragmentUtils.remove(this); + private fun getItems(): MutableList> { + return CollectionUtils.newArrayList>( + CommonItemClick(R.string.fragment_show_stack) { + DialogHelper.showFragmentDialog( + SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fm))) + .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fm))) + .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fm))) + .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fm))) + .appendLine() + .appendLine("---all of fragments---") + .appendLine(FragmentUtils.getAllFragments(fm).toString()) + .appendLine("----------------------") + .appendLine() + .appendLine("---stack top---") + .appendLine(FragmentUtils.getAllFragmentsInStack(fm).toString()) + .appendLine("---stack bottom---") + .create() + ) + }, + CommonItemClick(R.string.fragment_pop) { + FragmentUtils.pop(fm) + }, + CommonItemClick(R.string.fragment_remove) { + FragmentUtils.remove(this) + }, + SharedElementItem() + ).apply { + for (ci: CommonItem<*> in this) { + ci.backgroundColor = mBgColor + } } } -} +} \ No newline at end of file diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt index f474cb9f22..3e57295596 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt @@ -4,16 +4,19 @@ import android.os.Build import android.os.Bundle import android.support.annotation.RequiresApi import android.support.v4.app.Fragment +import android.support.v4.app.FragmentManager import android.transition.* import android.view.View -import com.blankj.base.BaseLazyFragment +import android.widget.ImageView +import com.blankj.base.rv.ItemViewHolder +import com.blankj.common.fragment.CommonFragment +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper -import com.blankj.utilcode.util.ColorUtils -import com.blankj.utilcode.util.FragmentUtils -import com.blankj.utilcode.util.SpanUtils -import com.blankj.utilcode.util.ToastUtils +import com.blankj.utilcode.util.* import kotlinx.android.synthetic.main.fragment_container.* +import java.util.* /** * ``` @@ -23,7 +26,7 @@ import kotlinx.android.synthetic.main.fragment_container.* * desc : demo about FragmentUtils * ``` */ -class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { +class ContainerFragment : CommonFragment(), FragmentUtils.OnBackClickListener { companion object { fun newInstance(): ContainerFragment { @@ -34,98 +37,111 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener } } - override fun initData(bundle: Bundle?) {} + private lateinit var fm: FragmentManager + private val mBgColor = ColorUtils.getRandomColor(false) override fun bindLayout(): Int { return R.layout.fragment_container } override fun initView(savedInstanceState: Bundle?, contentView: View?) { - FragmentUtils.setBackgroundColor(this, ColorUtils.getRandomColor(false)) - applyDebouncingClickListener( - fragmentRootShowStackBtn, - fragmentRootAddChildBtn, - fragmentRootAddChildStackBtn, - fragmentRootAddHideBtn, - fragmentRootAddHideStackBtn, - fragmentRootAddShowBtn, - fragmentRootPopToRootBtn, - fragmentRootHideShowBtn, - fragmentRootReplaceBtn - ) + super.initView(savedInstanceState, contentView) + mContentView.setBackgroundColor(mBgColor) + fm = fragmentManager!! + setCommonItems(findViewById(R.id.commonItemRv), getItems()) } - override fun doLazyBusiness() {} - - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.fragmentRootShowStackBtn -> DialogHelper.showFragmentDialog( - SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fragmentManager!!))) - .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fragmentManager!!))) - .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fragmentManager!!))) - .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fragmentManager!!))) - .appendLine() - .appendLine("---all of fragments---") - .appendLine(FragmentUtils.getAllFragments(fragmentManager!!).toString()) - .appendLine("----------------------") - .appendLine() - .appendLine("---stack top---") - .appendLine(FragmentUtils.getAllFragmentsInStack(fragmentManager!!).toString()) - .appendLine("---stack bottom---") - .create() - ) - R.id.fragmentRootAddChildBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id - ) - R.id.fragmentRootAddChildStackBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id, - false, - true - ) - R.id.fragmentRootAddHideBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id, - true - ) - R.id.fragmentRootAddHideStackBtn -> FragmentUtils.add( - fragmentManager!!, - ChildFragment.newInstance(), - id, - true, - true - ) - R.id.fragmentRootAddShowBtn -> FragmentUtils.add( - fragmentManager!!, - addSharedElement(ChildFragment.newInstance()), - id, - false, - false - ) - R.id.fragmentRootPopToRootBtn -> FragmentUtils.popTo( - fragmentManager!!, - ChildFragment::class.java, - true - ) - R.id.fragmentRootHideShowBtn -> { - val fragment1 = FragmentUtils.findFragment(fragmentManager!!, ChildFragment::class.java) - if (fragment1 != null) { - FragmentUtils.showHide(this, fragment1) - } else { - ToastUtils.showLong("please add demo1 first!") - } + private fun getItems(): ArrayList>? { + val item = SharedElementItem() + return CollectionUtils.newArrayList>( + CommonItemClick(R.string.fragment_show_stack) { + DialogHelper.showFragmentDialog( + SpanUtils().appendLine("top: " + FragmentUtils.getSimpleName(FragmentUtils.getTop(fm))) + .appendLine("topInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopInStack(fm))) + .appendLine("topShow: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShow(fm))) + .appendLine("topShowInStack: " + FragmentUtils.getSimpleName(FragmentUtils.getTopShowInStack(fm))) + .appendLine() + .appendLine("---all of fragments---") + .appendLine(FragmentUtils.getAllFragments(fm).toString()) + .appendLine("----------------------") + .appendLine() + .appendLine("---stack top---") + .appendLine(FragmentUtils.getAllFragmentsInStack(fm).toString()) + .appendLine("---stack bottom---") + .create() + ) + }, + CommonItemClick(R.string.fragment_add_child) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id + ) + }, + CommonItemClick(R.string.fragment_add_child_stack) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id, + false, + true + ) + }, + CommonItemClick(R.string.fragment_add_hide) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id, + true + ) + }, + CommonItemClick(R.string.fragment_add_hide_stack) { + FragmentUtils.add( + fm, + ChildFragment.newInstance(), + id, + true, + true + ) + }, + CommonItemClick(R.string.fragment_add_demo1_show) { + FragmentUtils.add( + fm, + addSharedElement(ChildFragment.newInstance()), + id, + false, + false + ) + }, + CommonItemClick(R.string.fragment_pop_to_root) { + FragmentUtils.popTo( + fm, + ChildFragment::class.java, + true + ) + }, + CommonItemClick(R.string.fragment_hide_demo0_show_demo1) { + val fragment1 = FragmentUtils.findFragment(fm, ChildFragment::class.java) + if (fragment1 != null) { + FragmentUtils.showHide(this, fragment1) + } else { + ToastUtils.showLong("please add demo1 first!") + } + }, + CommonItemClick(R.string.fragment_replace) { + FragmentUtils.replace( + fm, + addSharedElement(ChildFragment.newInstance()), + id, + true, + item.element + ) + }, + item + ).apply { + for (ci: CommonItem<*> in this) { + ci.backgroundColor = mBgColor } - R.id.fragmentRootReplaceBtn -> FragmentUtils.replace( - fragmentManager!!, - addSharedElement(ChildFragment.newInstance()), - id, - true, - fragmentRootSharedElementIv - ) } } @@ -143,10 +159,22 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener } } +class SharedElementItem : CommonItem { + + lateinit var element: ImageView; + + constructor() : super(R.layout.fragment_item_shared_element) + + override fun bind(holder: ItemViewHolder, position: Int) { + super.bind(holder, position) + element = holder.findViewById(R.id.fragmentRootSharedElementIv) + } +} + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) class DetailTransition() : TransitionSet() { init { - ordering = TransitionSet.ORDERING_TOGETHER + ordering = ORDERING_TOGETHER addTransition(ChangeBounds()).addTransition(ChangeTransform()).addTransition(ChangeImageTransform()) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt index 604501abe1..99b6355629 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt @@ -10,7 +10,7 @@ import android.view.View import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.FragmentUtils -import kotlinx.android.synthetic.main.activity_fragment.* +import kotlinx.android.synthetic.main.fragment_activity.* /** * ``` @@ -51,10 +51,11 @@ class FragmentActivity : CommonActivity() { } override fun bindLayout(): Int { - return R.layout.activity_fragment + return R.layout.fragment_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) if (savedInstanceState != null) { curIndex = savedInstanceState.getInt("curIndex") } @@ -72,10 +73,6 @@ class FragmentActivity : CommonActivity() { ) } - override fun doBusiness() {} - - override fun onDebouncingClick(view: View) {} - override fun onBackPressed() { if (!FragmentUtils.dispatchBackPress(mFragments[curIndex])) { super.onBackPressed() diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt index 4d266527bb..d2a9ac7bab 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/RootFragment.kt @@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.fragment import android.os.Bundle import android.view.View -import com.blankj.base.BaseLazyFragment +import com.blankj.common.fragment.CommonFragment import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BarUtils import com.blankj.utilcode.util.ColorUtils @@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.fragment_root.* * desc : demo about FragmentUtils * ``` */ -class RootFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { +class RootFragment : CommonFragment(), FragmentUtils.OnBackClickListener { companion object { fun newInstance(): RootFragment { @@ -28,13 +28,12 @@ class RootFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { } } - override fun initData(bundle: Bundle?) {} - override fun bindLayout(): Int { return R.layout.fragment_root } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) BarUtils.setStatusBarColor(rootFragmentFakeStatusBar, ColorUtils.getColor(R.color.colorPrimary)) FragmentUtils.add( childFragmentManager, @@ -43,10 +42,6 @@ class RootFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener { ) } - override fun doLazyBusiness() {} - - override fun onDebouncingClick(view: View) {} - override fun onBackClick(): Boolean { if (FragmentUtils.dispatchBackPress(childFragmentManager)) return true return if (childFragmentManager.backStackEntryCount == 0) { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt index 0be5c0c738..531c78b9f1 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/keyboard/KeyboardActivity.kt @@ -5,12 +5,14 @@ import android.content.Intent import android.os.Bundle import android.view.View import com.blankj.common.activity.CommonActivity -import com.blankj.common.activity.CommonActivityTitleView +import com.blankj.common.item.CommonItem +import com.blankj.common.item.CommonItemClick +import com.blankj.common.item.CommonItemTitle import com.blankj.utilcode.pkg.R import com.blankj.utilcode.pkg.helper.DialogHelper +import com.blankj.utilcode.util.CollectionUtils import com.blankj.utilcode.util.KeyboardUtils -import com.blankj.utilcode.util.SpanUtils -import kotlinx.android.synthetic.main.activity_keyboard.* +import kotlinx.android.synthetic.main.keyboard_activity.* /** * ``` @@ -29,49 +31,44 @@ class KeyboardActivity : CommonActivity() { } } + private var titleItem: CommonItemTitle = CommonItemTitle("", true) + override fun bindTitleRes(): Int { return R.string.demo_keyboard } override fun bindLayout(): Int { - return R.layout.activity_keyboard + return R.layout.keyboard_activity } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) KeyboardUtils.fixAndroidBug5497(this) - applyDebouncingClickListener( - keyboardHideSoftInputBtn, - keyboardShowSoftInputBtn, - keyboardToggleSoftInputBtn, - keyboardShowDialogBtn - ) - + setCommonItems(findViewById(R.id.commonItemRv), getItems()) KeyboardUtils.registerSoftInputChangedListener(this) { height -> - SpanUtils.with(keyboardAboutTv) - .appendLine("isSoftInputVisible: " + KeyboardUtils.isSoftInputVisible(this@KeyboardActivity)) - .append("height: $height") - .create() + titleItem.title = "isSoftInputVisible: " + KeyboardUtils.isSoftInputVisible(this@KeyboardActivity) + "\nkeyboardHeight: $height" if (height > 0) { keyboardEt.requestFocus() } } } - override fun onDebouncingClick(view: View) { - when (view.id) { - R.id.keyboardHideSoftInputBtn -> { - KeyboardUtils.hideSoftInput(this) - } - R.id.keyboardShowSoftInputBtn -> { - KeyboardUtils.showSoftInput(this) - } - R.id.keyboardToggleSoftInputBtn -> { - KeyboardUtils.toggleSoftInput() - } - R.id.keyboardShowDialogBtn -> { - keyboardEt.clearFocus() - DialogHelper.showKeyboardDialog() - } - } + private fun getItems(): MutableList> { + return CollectionUtils.newArrayList( + titleItem, + CommonItemClick(R.string.keyboard_hide_soft_input) { + KeyboardUtils.hideSoftInput(this) + }, + CommonItemClick(R.string.keyboard_show_soft_input) { + KeyboardUtils.showSoftInput(this) + }, + CommonItemClick(R.string.keyboard_toggle_soft_input) { + KeyboardUtils.toggleSoftInput() + }, + CommonItemClick(R.string.keyboard_show_dialog) { + keyboardEt.clearFocus() + DialogHelper.showKeyboardDialog() + } + ) } } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java new file mode 100644 index 0000000000..772192b999 --- /dev/null +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/mvp/MvpActivity.java @@ -0,0 +1,20 @@ +package com.blankj.utilcode.pkg.feature.mvp; + +import com.blankj.common.activity.CommonActivity; +import com.blankj.utilcode.pkg.R; + +/** + *
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/11/09
+ *     desc  :
+ * 
+ */ +public class MvpActivity extends CommonActivity { + + @Override + public int bindTitleRes() { + return R.string.demo_mvp; + } +} diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt index d4771514ce..fc9915cb53 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt @@ -88,6 +88,7 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis } override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) NetworkUtils.registerNetworkStatusChangedListener(this) updateItems() } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt index 921d85b32b..b226e4141d 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/permission/PermissionActivity.kt @@ -118,10 +118,9 @@ class PermissionActivity : CommonActivity() { permissionsDenied: List) { LogUtils.d(permissionsDeniedForever, permissionsDenied) if (permissionsDeniedForever.isNotEmpty()) { - showSnackbar(true, "Calendar is denied forever") + showSnackbar(false, "Calendar is denied forever") } else { - showSnackbar(true, "Calendar is denied") - requestCalendar() + showSnackbar(false, "Calendar is denied") } itemsView.updateItems(bindItems()) } @@ -147,7 +146,6 @@ class PermissionActivity : CommonActivity() { showSnackbar(false, "Microphone is denied forever") } else { showSnackbar(false, "Microphone is denied") - requestRecordAudio() } itemsView.updateItems(bindItems()) } @@ -174,7 +172,6 @@ class PermissionActivity : CommonActivity() { showSnackbar(false, "Calendar or Microphone is denied forever") } else { showSnackbar(false, "Calendar or Microphone is denied") - requestCalendarAndRecordAudio() } itemsView.updateItems(bindItems()) } diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt index 72ec62f98f..47ab4e2b9f 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt @@ -18,7 +18,7 @@ import com.blankj.common.activity.CommonActivity import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.SpanUtils import com.blankj.utilcode.util.ToastUtils -import kotlinx.android.synthetic.main.activity_span.* +import kotlinx.android.synthetic.main.span_activity.* /** * ``` @@ -57,7 +57,12 @@ class SpanActivity : CommonActivity() { return R.string.demo_span } + override fun bindLayout(): Int { + return R.layout.span_activity + } + override fun initView(savedInstanceState: Bundle?, contentView: View?) { + super.initView(savedInstanceState, contentView) val clickableSpan = object : ClickableSpan() { override fun onClick(widget: View) { ToastUtils.showShort("事件触发了") @@ -210,12 +215,12 @@ class SpanActivity : CommonActivity() { override fun onDebouncingClick(view: View) {} - override fun onDestroy() { - if (valueAnimator != null && valueAnimator.isRunning) { - valueAnimator.cancel() - } - super.onDestroy() - } +// override fun onDestroy() { +// if (valueAnimator.isRunning) { +// valueAnimator.cancel() +// } +// super.onDestroy() +// } } class BlurMaskFilterSpan(private var mRadius: Float) : CharacterStyle(), UpdateAppearance { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt index bec099d5cf..91d89a4864 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt @@ -1,14 +1,21 @@ package com.blankj.utilcode.pkg.helper -import android.app.Dialog +import android.content.DialogInterface import android.graphics.Bitmap import android.graphics.drawable.ColorDrawable -import android.support.v7.app.AlertDialog +import android.support.v4.app.FragmentActivity import android.text.method.ScrollingMovementMethod +import android.util.Pair import android.view.Gravity -import android.view.LayoutInflater import android.view.View -import android.widget.* +import android.view.Window +import android.widget.Button +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import com.blankj.base.dialog.BaseDialogFragment +import com.blankj.base.dialog.DialogLayoutCallback +import com.blankj.common.dialog.CommonDialogContent import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.* import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest @@ -24,94 +31,153 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques object DialogHelper { fun showRationaleDialog(shouldRequest: ShouldRequest) { - val topActivity = ActivityUtils.getTopActivity() - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_rationale_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> shouldRequest.again(true) } - .setNegativeButton(android.R.string.cancel) { dialog, which -> shouldRequest.again(false) } - .setCancelable(false) - .create() - .show() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_rationale_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + shouldRequest.again(true) + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + shouldRequest.again(false) + })).show() } fun showOpenAppSettingDialog() { - val topActivity = ActivityUtils.getTopActivity() - AlertDialog.Builder(topActivity) - .setTitle(android.R.string.dialog_alert_title) - .setMessage(R.string.permission_denied_forever_message) - .setPositiveButton(android.R.string.ok) { dialog, which -> PermissionUtils.launchAppDetailsSettings() } - .setNegativeButton(android.R.string.cancel) { dialog, which -> } - .setCancelable(false) - .create() + val topActivity = ActivityUtils.getTopActivity() ?: return + CommonDialogContent().init(topActivity as FragmentActivity, + StringUtils.getString(android.R.string.dialog_alert_title), + StringUtils.getString(R.string.permission_denied_forever_message), + Pair(StringUtils.getString(android.R.string.ok), View.OnClickListener { + PermissionUtils.launchAppDetailsSettings() + }), + Pair(StringUtils.getString(android.R.string.cancel), View.OnClickListener { + })) .show() } fun showKeyboardDialog() { - val topActivity = ActivityUtils.getTopActivity() - val dialog = Dialog(topActivity) - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_keyboard, null) - - val keyboardDialogEt = dialogView.findViewById(R.id.keyboardDialogEt) - val listener = View.OnClickListener { v -> - when (v.id) { - R.id.keyboardDialogHideSoftInputBtn -> KeyboardUtils.hideSoftInput(keyboardDialogEt) - R.id.keyboardDialogShowSoftInputBtn -> KeyboardUtils.showSoftInput(keyboardDialogEt) - R.id.keyboardDialogToggleSoftInputBtn -> KeyboardUtils.toggleSoftInput() - R.id.keyboardDialogCloseBtn -> { - KeyboardUtils.hideSoftInput(keyboardDialogEt) - dialog.dismiss() + val topActivity = ActivityUtils.getTopActivity() ?: return + BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback { + override fun bindTheme(): Int { + return View.NO_ID + } + + override fun bindLayout(): Int { + return R.layout.keyboard_dialog + } + + override fun initView(dialog: BaseDialogFragment, contentView: View) { + dialog.dialog.setCanceledOnTouchOutside(false) + + val keyboardDialogEt = contentView.findViewById(R.id.keyboardDialogEt) + val listener = View.OnClickListener { v -> + when (v.id) { + R.id.keyboardDialogHideSoftInputBtn -> KeyboardUtils.hideSoftInput(keyboardDialogEt) + R.id.keyboardDialogShowSoftInputBtn -> KeyboardUtils.showSoftInput(keyboardDialogEt) + R.id.keyboardDialogToggleSoftInputBtn -> KeyboardUtils.toggleSoftInput() + R.id.keyboardDialogCloseBtn -> { + KeyboardUtils.hideSoftInput(keyboardDialogEt) + dialog.dismiss() + } + } } + contentView.findViewById(R.id.keyboardDialogHideSoftInputBtn).setOnClickListener(listener) + contentView.findViewById(R.id.keyboardDialogShowSoftInputBtn).setOnClickListener(listener) + contentView.findViewById(R.id.keyboardDialogToggleSoftInputBtn).setOnClickListener(listener) + contentView.findViewById(R.id.keyboardDialogCloseBtn).setOnClickListener(listener) + + dialog.dialog.setOnShowListener(DialogInterface.OnShowListener { + KeyboardUtils.fixAndroidBug5497(dialog.dialog.window) + }) + } + + override fun setWindowStyle(window: Window) { + window.setBackgroundDrawable(ColorDrawable(0)) + val attributes = window.attributes + attributes.gravity = Gravity.BOTTOM + attributes.width = ScreenUtils.getAppScreenWidth() + attributes.height = ScreenUtils.getAppScreenHeight() * 2 / 5 + attributes.windowAnimations = R.style.BottomDialogAnimation + window.attributes = attributes } - } - dialogView.findViewById(R.id.keyboardDialogHideSoftInputBtn).setOnClickListener(listener) - dialogView.findViewById(R.id.keyboardDialogShowSoftInputBtn).setOnClickListener(listener) - dialogView.findViewById(R.id.keyboardDialogToggleSoftInputBtn).setOnClickListener(listener) - dialogView.findViewById(R.id.keyboardDialogCloseBtn).setOnClickListener(listener) - - dialog.setContentView(dialogView) - dialog.setCanceledOnTouchOutside(false) - - val window = dialog.window - dialog.setOnShowListener { KeyboardUtils.fixAndroidBug5497(window) } - - window.setBackgroundDrawable(ColorDrawable(0)) - val attributes = dialog.window.attributes - attributes.gravity = Gravity.BOTTOM - attributes.width = ScreenUtils.getAppScreenWidth() - attributes.height = ScreenUtils.getAppScreenHeight() * 2 / 5 - attributes.windowAnimations = R.style.BottomDialogAnimation - dialog.window.attributes = attributes - - dialog.show() + + override fun onCancel(dialog: BaseDialogFragment) {} + + override fun onDismiss(dialog: BaseDialogFragment) {} + }).show() } fun showFragmentDialog(info: CharSequence) { - val topActivity = ActivityUtils.getTopActivity() - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_fragment, null) - val aboutTv = dialogView.findViewById(R.id.fragmentDialogAboutTv) - aboutTv.movementMethod = ScrollingMovementMethod.getInstance() - aboutTv.text = info - val dialog = AlertDialog.Builder(topActivity).setView(dialogView).create() - dialog.show() + val topActivity = ActivityUtils.getTopActivity() ?: return + BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback { + override fun bindTheme(): Int { + return R.style.CommonContentDialogStyle + } + + override fun bindLayout(): Int { + return R.layout.fragment_dialog + } + + override fun initView(dialog: BaseDialogFragment, contentView: View) { + val aboutTv = contentView.findViewById(R.id.fragmentDialogAboutTv) + aboutTv.movementMethod = ScrollingMovementMethod.getInstance() + aboutTv.text = info + } + + override fun setWindowStyle(window: Window) {} + + override fun onCancel(dialog: BaseDialogFragment) {} + + override fun onDismiss(dialog: BaseDialogFragment) {} + }).show() } fun showScreenshotDialog(screenshot: Bitmap) { - val topActivity = ActivityUtils.getTopActivity() - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_screen, null) - val screenshotIv = dialogView.findViewById(R.id.screenDialogScreenshotIv) - screenshotIv.setImageBitmap(screenshot) - val dialog = AlertDialog.Builder(topActivity).setView(dialogView).create() - dialog.show() + val topActivity = ActivityUtils.getTopActivity() ?: return + BaseDialogFragment().init(topActivity as FragmentActivity, object : DialogLayoutCallback { + override fun bindTheme(): Int { + return R.style.CommonContentDialogStyle + } + + override fun bindLayout(): Int { + return R.layout.screen_dialog + } + + override fun initView(dialog: BaseDialogFragment, contentView: View) { + contentView.findViewById(R.id.screenDialogScreenshotIv) + .setImageBitmap(screenshot) + } + + override fun setWindowStyle(window: Window) {} + + override fun onCancel(dialog: BaseDialogFragment) {} + + override fun onDismiss(dialog: BaseDialogFragment) {} + }).show() } fun showToastDialog() { - val topActivity = ActivityUtils.getTopActivity() - val dialogView = LayoutInflater.from(topActivity).inflate(R.layout.dialog_toast, null) - dialogView.findViewById