提交 46052774 编写于 作者: B Blankj

see 04/08 log

上级 35de0c4d
* `20/04/08` [fix] CrashUtils DefaultUncaughtExceptionHandler is wrong; LogUtils write file failed. Publish v1.27.3.
* `20/04/07` [mdf] GsonUtils#getGson() method public.
* `20/04/04` [fix] ShadowUtils bug running on lower version devices. Publish v1.27.2.
* `20/04/03` [fix] UtilsActivityLifecycleImpl#HashMap#remove IllegalStateException bug.
* `20/04/02` [fix] PathUtils sdcard enable state is wrong; ActivityUtils finish activity wrong; Publish v1.27.1.
......
......@@ -15,7 +15,7 @@ class Config {
static minSdkVersion = 14
static targetSdkVersion = 29
static versionCode = 1_026_001
static versionName = '1.27.2'// E.g. 1.9.72 => 1,009,072
static versionName = '1.27.3'// E.g. 1.9.72 => 1,009,072
// lib version
static gradlePluginVersion = '3.5.0'
......
......@@ -30,8 +30,12 @@ class ReadmeCorePlugin implements Plugin<Project> {
def sb = new StringBuilder()
readmeCN.eachLine { line ->
if (line.contains("* ###")) {
String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils"))
sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> ")))
if (line.contains("UtilsTransActivity")) {
sb.append(line)
} else {
String utilsName = line.substring(line.indexOf("[") + 1, line.indexOf("Utils"))
sb.append("* ### About ").append(utilsName).append(line.substring(line.indexOf(" -> ")))
}
} else if (line.contains(": ") && !line.contains("[")) {
sb.append(line.substring(0, line.indexOf(':')).trim())
} else if (line.contains("打个小广告") || line.contains("知识星球") || line.contains("我的二维码")) {
......
......@@ -2,6 +2,8 @@ package com.blankj.utilcode.pkg.feature
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.TextView
import com.blankj.common.activity.CommonActivity
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
......@@ -43,6 +45,7 @@ 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.CollectionUtils
import com.blankj.utilcode.util.UtilsTransActivity
/**
* ```
......@@ -175,6 +178,15 @@ class CoreUtilActivity : CommonActivity() {
CommonItemClick(R.string.demo_toast, true) {
ToastActivity.start(this)
},
CommonItemClick(R.string.demo_trans_activity, true) {
UtilsTransActivity.start(this, object : UtilsTransActivity.TransActivityDelegate() {
override fun onCreated(activity: UtilsTransActivity, savedInstanceState: Bundle?) {
super.onCreated(activity, savedInstanceState)
activity.setContentView(R.layout.common_dialog_loading)
activity.findViewById<TextView>(R.id.utilActionLoadingMsgTv).text = "Trans Activity is showing..."
}
})
},
CommonItemClick(R.string.demo_vibrate, true) {
VibrateActivity.start(this)
}
......
......@@ -31,7 +31,7 @@ public class MvpModel extends BaseModel implements IMvp.Model {
ThreadUtils.executeByCached(addAutoDestroyTask(new ThreadUtils.SimpleTask<String>() {
@Override
public String doInBackground() throws Throwable {
Thread.sleep(1000);
Thread.sleep(2000);
return "msg: " + index++;
}
......
......@@ -37,6 +37,7 @@
<string name="demo_spStatic">SPStaticUtils Demo</string>
<string name="demo_span">SpanUtils Demo</string>
<string name="demo_toast">ToastUtils Demo</string>
<string name="demo_trans_activity">TransActivity Demo</string>
<string name="demo_vibrate">VibrateUtils Demo</string>
<!--Activity 相关-->
......
......@@ -83,7 +83,7 @@ public class BaseApplication extends Application {
@Override
public void onCrash(String crashInfo, Throwable e) {
LogUtils.e(crashInfo);
AppUtils.relaunchApp(true);
AppUtils.relaunchApp();
}
});
}
......
package com.blankj.base.mvp;
import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.Utils;
import java.util.HashMap;
import java.util.Map;
......@@ -19,7 +19,7 @@ import java.util.Map;
* desc :
* </pre>
*/
public abstract class BasePresenter<V extends BaseView> implements LifecycleObserver {
public abstract class BasePresenter<V extends BaseView> extends Utils.ActivityLifecycleCallbacks {
private V mView;
private Map<Class, BaseModel> mModelMap = new HashMap<>();
......@@ -29,6 +29,7 @@ public abstract class BasePresenter<V extends BaseView> implements LifecycleObse
void bindView(V view) {
this.mView = view;
onAttachView();
ActivityUtils.addActivityLifecycleCallbacks(mView.getActivity(), this);
}
public V getView() {
......@@ -54,9 +55,16 @@ public abstract class BasePresenter<V extends BaseView> implements LifecycleObse
return null;
}
@CallSuper
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyPresenter() {
@Override
public void onLifecycleChanged(@NonNull Activity activity, Lifecycle.Event event) {
super.onLifecycleChanged(activity, event);
if (event == Lifecycle.Event.ON_DESTROY) {
destroyPresenter();
}
LogUtils.i("onLifecycleChanged: " + event);
}
private void destroyPresenter() {
if (mView != null) {
mView.mPresenterMap.remove(this.getClass());
mView.onDestroyView();
......@@ -67,11 +75,5 @@ public abstract class BasePresenter<V extends BaseView> implements LifecycleObse
}
}
mModelMap.clear();
LogUtils.i("onDestroyPresenter");
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onLifecycleChanged(LifecycleOwner owner, Lifecycle.Event event) {
LogUtils.i(event.toString());
}
}
package com.blankj.base.mvp;
import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.Utils;
import java.util.HashMap;
import java.util.Map;
......@@ -19,20 +24,17 @@ public abstract class BaseView<V extends BaseView> {
private FragmentActivity mActivity;
private Fragment mFragment;
private Lifecycle mLifecycle;
Map<Class, BasePresenter<V>> mPresenterMap = new HashMap<>();
public abstract void onDestroyView();
public BaseView(FragmentActivity activity) {
mActivity = activity;
mLifecycle = activity.getLifecycle();
}
public BaseView(Fragment fragment) {
mFragment = fragment;
mActivity = fragment.getActivity();
mLifecycle = fragment.getLifecycle();
}
public <T extends FragmentActivity> T getActivity() {
......@@ -49,9 +51,6 @@ public abstract class BaseView<V extends BaseView> {
mPresenterMap.put(presenter.getClass(), presenter);
//noinspection unchecked
presenter.bindView((V) this);
if (mLifecycle != null) {
mLifecycle.addObserver(presenter);
}
}
public <P extends BasePresenter<V>> P getPresenter(Class<P> presenterClass) {
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.27.2'
implementation 'com.blankj:utilcode:1.27.3'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.27.2'
implementation 'com.blankj:utilcodex:1.27.3'
```
......@@ -1143,6 +1143,11 @@ file2Uri: file 转 uri
uri2File: uri 转 file
```
* ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
```
start: 启动透明 Activity
```
* ### 震动相关 -> [VibrateUtils.java][vibrate.java] -> [Demo][vibrate.demo]
```
vibrate: 震动
......@@ -1365,6 +1370,8 @@ getComments : 获取压缩文件中的注释链表
[uri.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
[trans.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.27.2'
implementation 'com.blankj:utilcode:1.27.3'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.27.2'
implementation 'com.blankj:utilcodex:1.27.3'
```
......@@ -1143,6 +1143,11 @@ file2Uri
uri2File
```
* ### UtilsTransActivity -> [UtilsTransActivity.java][trans.java]
```
start
```
* ### About Vibrate -> [VibrateUtils.java][vibrate.java] -> [Demo][vibrate.demo]
```
vibrate
......@@ -1362,6 +1367,8 @@ getComments
[uri.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UriUtils.java
[trans.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/UtilsTransActivity.java
[vibrate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
[vibrate.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/vibrate/VibrateActivity.kt
......
......@@ -40,6 +40,10 @@ dependencies {
testImplementation Config.depConfig.eventbus_lib.dep
}
afterEvaluate {
verifyReleaseResources.enabled(false)
}
apply from: "${rootDir.path}/gradle/publish.gradle"
publish {
name = "UtilCode"
......@@ -47,8 +51,4 @@ publish {
artifactId = Config.depConfig.lib_utilcode.artifactId
version = Config.depConfig.lib_utilcode.version
website = "https://github.com/Blankj/AndroidUtilCode"
}
afterEvaluate {
verifyReleaseResources.enabled(false)
}
\ No newline at end of file
......@@ -21,6 +21,8 @@ public final class CrashUtils {
private static final String FILE_SEP = System.getProperty("file.separator");
private static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER = Thread.getDefaultUncaughtExceptionHandler();
private CrashUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
......@@ -79,7 +81,12 @@ public final class CrashUtils {
public static void init(final String crashDirPath, final OnCrashListener onCrashListener) {
String dirPath;
if (UtilsBridge.isSpace(crashDirPath)) {
dirPath = Utils.getApp().getFilesDir() + FILE_SEP + "crash" + FILE_SEP;
if (UtilsBridge.isSDCardEnableByEnvironment()
&& Utils.getApp().getExternalFilesDir(null) != null)
dirPath = Utils.getApp().getExternalFilesDir(null) + FILE_SEP + "crash" + FILE_SEP;
else {
dirPath = Utils.getApp().getFilesDir() + FILE_SEP + "crash" + FILE_SEP;
}
} else {
dirPath = crashDirPath.endsWith(FILE_SEP) ? crashDirPath : crashDirPath + FILE_SEP;
}
......@@ -91,7 +98,7 @@ public final class CrashUtils {
return new UncaughtExceptionHandler() {
@Override
public void uncaughtException(@NonNull final Thread t, @NonNull final Throwable e) {
final String time = new SimpleDateFormat("MM-dd_HH-mm-ss").format(new Date());
final String time = new SimpleDateFormat("yyyy_MM_dd-HH_mm_ss").format(new Date());
final StringBuilder sb = new StringBuilder();
final String head = "************* Log Head ****************" +
"\nTime Of Crash : " + time +
......@@ -105,15 +112,14 @@ public final class CrashUtils {
sb.append(head).append(UtilsBridge.getFullStackTrace(e));
final String crashInfo = sb.toString();
final String crashFile = dirPath + time + ".txt";
UtilsBridge.writeFileFromString(crashFile, crashInfo);
UtilsBridge.writeFileFromString(crashFile, crashInfo, true);
if (onCrashListener != null) {
onCrashListener.onCrash(crashInfo, e);
}
UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler();
if (handler != null) {
handler.uncaughtException(t, e);
if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null) {
DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(t, e);
}
}
};
......
......@@ -593,7 +593,7 @@ public final class LogUtils {
private static void input2File(final String filePath, final String input) {
if (CONFIG.mFileWriter == null) {
UtilsBridge.writeFileFromString(filePath, input);
UtilsBridge.writeFileFromString(filePath, input, true);
} else {
CONFIG.mFileWriter.write(filePath, input);
}
......@@ -621,13 +621,12 @@ public final class LogUtils {
private IFileWriter mFileWriter;
private Config() {
mDefaultDir = Utils.getApp().getFilesDir() + FILE_SEP + "log" + FILE_SEP;
mFileWriter = new IFileWriter() {
@Override
public void write(String file, String content) {
}
};
if (UtilsBridge.isSDCardEnableByEnvironment()
&& Utils.getApp().getExternalFilesDir(null) != null)
mDefaultDir = Utils.getApp().getExternalFilesDir(null) + FILE_SEP + "log" + FILE_SEP;
else {
mDefaultDir = Utils.getApp().getFilesDir() + FILE_SEP + "log" + FILE_SEP;
}
}
public final Config setLogSwitch(final boolean logSwitch) {
......@@ -863,7 +862,8 @@ public final class LogUtils {
static String object2String(Object object, int type) {
if (object.getClass().isArray()) return array2String(object);
if (object instanceof Throwable) return UtilsBridge.getFullStackTrace((Throwable) object);
if (object instanceof Throwable)
return UtilsBridge.getFullStackTrace((Throwable) object);
if (object instanceof Bundle) return bundle2String((Bundle) object);
if (object instanceof Intent) return intent2String((Intent) object);
if (type == JSON) {
......
......@@ -53,14 +53,16 @@ public final class Utils {
*/
public static Application getApp() {
if (sApp != null) return sApp;
throw new NullPointerException("UtilsFileProvider load failed.");
sApp = UtilsBridge.getApplicationByReflect();
if (sApp != null) return sApp;
throw new NullPointerException("UtilsFileProvider load failed && reflect failed.");
}
///////////////////////////////////////////////////////////////////////////
// interface
///////////////////////////////////////////////////////////////////////////
public abstract static class Task<Result> extends UtilsBridge.Task<Result> {
public abstract static class Task<Result> extends ThreadUtils.SimpleTask<Result> {
private Consumer<Result> mConsumer;
......@@ -99,10 +101,6 @@ public final class Utils {
public void onLifecycleChanged(@NonNull Activity activity, Lifecycle.Event event) {/**/}
}
public interface OnActivityDestroyedListener {
void onActivityDestroyed(Activity activity);
}
public interface Consumer<T> {
void accept(T t);
}
......
......@@ -12,6 +12,7 @@ import android.view.Window;
import android.view.WindowManager;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
......@@ -83,6 +84,27 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
});
}
Application getApplicationByReflect() {
try {
Class activityThreadClass = Class.forName("android.app.ActivityThread");
Object thread = getActivityThread();
Object app = activityThreadClass.getMethod("getApplication").invoke(thread);
if (app == null) {
return null;
}
return (Application) app;
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
private void addActivityLifecycleCallbacksInner(final Activity activity,
final Utils.ActivityLifecycleCallbacks lifecycleCallbacks) {
List<Utils.ActivityLifecycleCallbacks> callbacks = mActivityLifecycleCallbacksMap.get(activity);
......@@ -265,6 +287,9 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
}
}
/**
* @return the activities which topActivity is first position
*/
private List<Activity> getActivitiesByReflect() {
LinkedList<Activity> list = new LinkedList<>();
Activity topActivity = null;
......
package com.blankj.utilcode.util;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
......@@ -72,6 +73,10 @@ class UtilsBridge {
return UtilsActivityLifecycleImpl.INSTANCE.getActivityList();
}
static Application getApplicationByReflect() {
return UtilsActivityLifecycleImpl.INSTANCE.getApplicationByReflect();
}
///////////////////////////////////////////////////////////////////////////
// ActivityUtils
///////////////////////////////////////////////////////////////////////////
......@@ -236,8 +241,8 @@ class UtilsBridge {
return FileIOUtils.readFile2BytesByChannel(file);
}
static boolean writeFileFromString(final String filePath, final String content) {
return FileIOUtils.writeFileFromString(filePath, content);
static boolean writeFileFromString(final String filePath, final String content, final boolean append) {
return FileIOUtils.writeFileFromString(filePath, content, append);
}
static boolean writeFileFromIS(final String filePath, final InputStream is) {
......@@ -506,10 +511,4 @@ class UtilsBridge {
static Uri file2Uri(final File file) {
return UriUtils.file2Uri(file);
}
///////////////////////////////////////////////////////////////////////////
// class
///////////////////////////////////////////////////////////////////////////
static abstract class Task<T> extends ThreadUtils.SimpleTask<T> {
}
}
package com.blankj.utilcode.util;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
......@@ -23,18 +25,33 @@ public class UtilsTransActivity extends AppCompatActivity {
private static TransActivityDelegate sDelegate;
public static void start(final TransActivityDelegate delegate) {
start(null, delegate);
start(null, null, delegate);
}
public static void start(final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate) {
start(null, consumer, delegate);
}
public static void start(final Activity activity,
final TransActivityDelegate delegate) {
start(activity, null, delegate);
}
public static void start(final Activity activity,
final Utils.Consumer<Intent> consumer,
final TransActivityDelegate delegate) {
if (delegate == null) return;
Intent starter = new Intent(Utils.getApp(), UtilsTransActivity.class);
starter.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (consumer != null) {
consumer.accept(starter);
}
Utils.getApp().startActivity(starter);
if (activity == null) {
starter.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Utils.getApp().startActivity(starter);
} else {
activity.startActivity(starter);
}
sDelegate = delegate;
}
......@@ -130,27 +147,27 @@ public class UtilsTransActivity extends AppCompatActivity {
}
public abstract static class TransActivityDelegate {
public void onCreateBefore(UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {/**/}
public void onCreateBefore(@NonNull UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {/**/}
public void onCreated(UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {/**/}
public void onCreated(@NonNull UtilsTransActivity activity, @Nullable Bundle savedInstanceState) {/**/}
public void onStarted(UtilsTransActivity activity) {/**/}
public void onStarted(@NonNull UtilsTransActivity activity) {/**/}
public void onDestroy(UtilsTransActivity activity) {/**/}
public void onDestroy(@NonNull UtilsTransActivity activity) {/**/}
public void onResumed(UtilsTransActivity activity) {/**/}
public void onResumed(@NonNull UtilsTransActivity activity) {/**/}
public void onPaused(UtilsTransActivity activity) {/**/}
public void onPaused(@NonNull UtilsTransActivity activity) {/**/}
public void onStopped(UtilsTransActivity activity) {/**/}
public void onStopped(@NonNull UtilsTransActivity activity) {/**/}
public void onSaveInstanceState(UtilsTransActivity activity, Bundle outState) {/**/}
public void onSaveInstanceState(@NonNull UtilsTransActivity activity, Bundle outState) {/**/}
public void onRequestPermissionsResult(UtilsTransActivity activity, int requestCode, String[] permissions, int[] grantResults) {/**/}
public void onRequestPermissionsResult(@NonNull UtilsTransActivity activity, int requestCode, String[] permissions, int[] grantResults) {/**/}
public void onActivityResult(UtilsTransActivity activity, int requestCode, int resultCode, Intent data) {/**/}
public void onActivityResult(@NonNull UtilsTransActivity activity, int requestCode, int resultCode, Intent data) {/**/}
public boolean dispatchTouchEvent(UtilsTransActivity activity, MotionEvent ev) {
public boolean dispatchTouchEvent(@NonNull UtilsTransActivity activity, MotionEvent ev) {
return false;
}
}
......
......@@ -8,4 +8,8 @@ dependencies {
testImplementation Config.depConfig.test_junit.dep
testImplementation Config.depConfig.test_robolectric.dep
testImplementation Config.depConfig.support_appcompat_v7.dep
}
afterEvaluate {
verifyReleaseResources.enabled(false)
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册