提交 08ddfce5 编写于 作者: B Blankj

see 06/03 log

上级 fdad02a3
* `19/06/03` [fix] Refactoring framework. Publish v1.24.0.
* `19/04/25` [fix] LogUtils delete due log.
* `19/04/24` [upd] The swipe panel.
* `19/03/17` [fix] The ugly UI.
......
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
if (!gradle.ext.bus.isPublish) {
if (gradle.ext.bus.isDebug) {
maven() {
url uri(new File(project.rootDir, "maven"))
}
if (gradle.ext.depConfig.plugin_bus.useLocal) {
maven() {
// use for debug plugin local
url new File("busMaven")
}
}
google()
......@@ -13,14 +12,15 @@ buildscript {
}
dependencies {
for (plugin in gradle.ext.dep.plugin) {
if (gradle.ext.bus.isPublish && plugin.contains("com.blankj:bus-gradle-plugin:")) {
continue
// 根据 config 来 configClasspath 各 plugin
gradle.ext.depConfig.each { name, config ->
if (name.startsWith("plugin_") && config.isApply) {
classpath config.remotePath
}
classpath plugin
}
}
}
allprojects {
repositories {
google()
......
# Change Log
## v1.8
兼容最新工程组件化
## v1.7
兼容 utilcodex
......
......@@ -6,9 +6,8 @@ apply {
plugin "groovy"
plugin "java-gradle-plugin"
from "${rootDir.path}/gradle/upload/pluginPublish.gradle"
if (gradle.ext.bus.isDebug) {
if (gradle.ext.depConfig.plugin_bus.useLocal) {
plugin "maven"
from "${rootDir.path}/gradle/upload/localMavenUpload.gradle"
} else {
plugin "com.github.dcendents.android-maven"
plugin "com.jfrog.bintray"
......@@ -51,8 +50,18 @@ sourceSets {
}
}
group = gradle.ext.bus.group
version = gradle.ext.bus.version
group = gradle.ext.depConfig.plugin_bus.groupId
version = gradle.ext.depConfig.plugin_bus.version
if (gradle.ext.depConfig.plugin_bus.useLocal) {
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri(new File(project.rootDir, "busMaven")))
}
}
}
}
//./gradlew bus-gradle-plugin:bintrayUpload
//./gradlew publishPlugins
......@@ -84,7 +84,9 @@ class BusTransform extends Transform {
)
FileUtils.copyFile(jar, dest)
if (jarName.contains("utilcode")) {
if (jarName.startsWith("com.blankj:utilcode:")
|| jarName.startsWith("com.blankj:utilcodex:")
|| jarName.equals(":utilcode:lib")) {
busScan.busJar = dest
LogUtils.l("bus jar: $jarName [$dest]")
return
......
......@@ -114,7 +114,9 @@ class BusTransformAsm extends Transform {
)
FileUtils.copyFile(jar, dest)
if (jarName.contains("utilcode")) {
if (jarName.startsWith("com.blankj:utilcode:")
|| jarName.startsWith("com.blankj:utilcodex:")
|| jarName.equals(":utilcode:lib")) {
busScan.busJar = dest
LogUtils.l("bus jar: $jarName [$dest]")
return
......
f066bbc77d59ce6c1379873e5a89715e
\ No newline at end of file
27634ae190af35cf8cdd4acb5a0450a5f76d85e9
\ No newline at end of file
d1f3a078f25631446d7f61a2b3f13b87
\ No newline at end of file
46debaa90519ccdb6aabb7034d5ac1a43c466c47
\ No newline at end of file
704f0fc2f320ad82e43447dcac14050d
\ No newline at end of file
456c915220fe181bed8c67bef1568f70e7b0f1d1
\ No newline at end of file
55bd3f4ad26b78c15c747c22a0633f4d
\ No newline at end of file
1b448aa58fcd10792e28db88c2a6813207dbee2e
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.blankj</groupId>
<artifactId>bus-gradle-plugin</artifactId>
<version>1.7.0</version>
<dependencies>
<dependency>
<groupId>com.android.tools.build</groupId>
<artifactId>gradle</artifactId>
<version>3.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.android.tools.build</groupId>
<artifactId>gradle-api</artifactId>
<version>3.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
03dd0e6302a92e8849d59866a2b2bf85
\ No newline at end of file
ce864f19c593951f14bc93fd812fe4251cad7098
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.blankj</groupId>
<artifactId>bus-gradle-plugin</artifactId>
<versioning>
<release>1.7.0</release>
<versions>
<version>1.7.0</version>
</versions>
<lastUpdated>20190603071129</lastUpdated>
</versioning>
</metadata>
88dc3791e85eb3ccba2f1bb9d71dccbb
\ No newline at end of file
3c87365d79cf58e5eecaa328aceab560914ecd78
\ No newline at end of file
apply from: "${rootDir.path}/gradle/util/utils.gradle"
apply from: "${rootDir.path}/gradle/config/configBuild.gradle"
gradle.ext {
applicationId = 'com.blankj.androidutilcode'
......@@ -7,182 +8,140 @@ gradle.ext {
compileSdkVersion = 27
minSdkVersion = 14
targetSdkVersion = 27
versionCode = 1_023_008
versionName = '1.23.8'// E.g. 1.9.72 => 1,009,072
bus = [
isPublish: false,
isDebug : true,
version : '1.7',
group : 'com.blankj'
]
versionCode = 1_024_000
versionName = '1.24.0'// E.g. 1.9.72 => 1,009,072
// lib version
kotlin_version = '1.3.10'
support_version = '27.1.1'
leakcanary_version = '1.6.3'
dep = [
plugin : [
"com.android.tools.build:gradle:3.4.0",
"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version",
"com.github.dcendents:android-maven-gradle-plugin:2.1",// 上传到 maven
"com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4",// 上传到 bintray
"tech.harmonysoft:traute-gradle:1.1.10",// 注解转非空判断
"com.blankj:bus-gradle-plugin:$bus.version",// 组件化 Static Bus
],
// 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",
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:1.0.1",
swipe_panel : "com.blankj:swipe-panel:1.1",
gson : "com.google.code.gson:gson:2.8.2",
glide : "com.github.bumptech.glide:glide:4.7.1",
retrofit : "com.squareup.retrofit2:retrofit:2.4.0",
javassist : "org.javassist:javassist:3.24.0-GA",
commons_io : "commons-io:commons-io:2.5",
junit : "junit:junit:4.12",
robolectric : "org.robolectric:robolectric:4.2",
]
module = [
"buildSrc" : [true, ":buildSrc", ""] as ModuleConfig,
"bus-gradle-plugin": [true, ":bus-gradle-plugin", ""] as ModuleConfig,
"launcher_app" : [true, ":launcher:app", ""] as ModuleConfig,
"launcher_pkg" : [true, ":launcher:pkg", ""] as ModuleConfig,
"lib_base" : [true, ":lib:base", ""] as ModuleConfig,
"subutil_app" : [true, ":subutil:app", ""] as ModuleConfig,
"subutil_lib" : [true, ":subutil:lib", ""] as ModuleConfig,
"subutil_pkg" : [true, ":subutil:pkg", ""] as ModuleConfig,
"utilcode_app" : [true, ":utilcode:app", ""] as ModuleConfig,
"utilcode_lib" : [true, ":utilcode:lib", "com.blankj:utilcode:$versionName"] as ModuleConfig,
"utilcode_pkg" : [true, ":utilcode:pkg", ""] as ModuleConfig,
dep = [:]
depConfig = [
plugin_gradle : new DepConfig("com.android.tools.build:gradle:3.4.0"),
plugin_kotlin : new DepConfig("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"),
plugin_maven : new DepConfig("com.github.dcendents:android-maven-gradle-plugin:2.1"),// 上传到 maven
plugin_bintray : new DepConfig("com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4"),// 上传到 bintray
plugin_traute : new DepConfig("tech.harmonysoft:traute-gradle:1.1.10"),// 注解转非空判断
plugin_bus : new DepConfig(false/*是否本地调试*/, "", "com.blankj:bus-gradle-plugin:1.8", true),
buildSrc : new DepConfig(":buildSrc"),
bus_gradle_plugin : new DepConfig(":bus-gradle-plugin", false),
launcher_app : new DepConfig(":launcher:app"),
launcher_pkg : new DepConfig(":launcher:pkg"),
lib_base : new DepConfig(":lib:base"),
subutil_app : new DepConfig(":subutil:app"),
subutil_lib : new DepConfig(":subutil:lib"),
subutil_pkg : new DepConfig(":subutil:pkg"),
utilcode_app : new DepConfig(":utilcode:app"),
utilcode_lib : new DepConfig(true, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
utilcode_pkg : new DepConfig(":utilcode:pkg"),
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"),
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.1"),
gson : new DepConfig("com.google.code.gson:gson:2.8.2"),
glide : new DepConfig("com.github.bumptech.glide:glide:4.7.1"),
retrofit : new DepConfig("com.squareup.retrofit2:retrofit:2.4.0"),
javassist : new DepConfig("org.javassist:javassist:3.24.0-GA"),
commons_io : new DepConfig("commons-io:commons-io:2.5"),
junit : new DepConfig("junit:junit:4.12"),
robolectric : new DepConfig("org.robolectric:robolectric:4.2"),
]
fn = [
includeModules: this.&includeModules,
includeDep: this.&includeDep,
]
}
def log(String msg) {
println("----> ${msg} <----")
}
gradle.ext.Utils = [
log: this.&log,
]
def includeModules() {// 根据 config 来 include 各 module
gradle.ext.module.each { k, v ->
if (v.isLocal) {
include v.localPath
def includeDep() {// 根据 config 来 include 各 module
gradle.ext.Utils.log("includeDep -> depConfig = " + gradle.ext.Utils.object2String(gradle.ext.depConfig))
gradle.ext.depConfig.each { String name, DepConfig config ->
if (config.isApply) {
if (config.useLocal) {
include config.localPath
}
}
}
}
gradle.addBuildListener(new CustomListener())
class CustomListener implements BuildListener {
private timings = []
private File file
@Override
void buildStarted(Gradle gradle) {
gradle.ext.Utils.log("buildStarted")
gradle.addListener(new TaskExecutionListener() {
@Override
void beforeExecute(Task task) {
gradle.ext.Utils.log("beforeExecute")
task.ext.startTime = System.currentTimeMillis()
}
@Override
void afterExecute(Task task, TaskState state) {
gradle.ext.Utils.log("afterExecute")
def ms = System.currentTimeMillis() - task.ext.startTime
timings.add([ms, task.path])
}
})
def sdf = new java.text.SimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
file = new File(rootProject.buildDir.getAbsolutePath(),
"buildTime_" + sdf.format(new Date(System.currentTimeMillis())) + ".txt")
class DepConfig {
boolean useLocal // 是否使用本地的
String localPath // 本地路径
String remotePath// 远程路径
boolean isApply // 是否应用
String path // 最后的路径
String isDebug // 是否调试
String groupId
String artifactId
String version
DepConfig(String path) {
this(path, true)
}
@Override
void settingsEvaluated(Settings settings) {
DepConfig(String path, boolean isApply) {
if (path.startsWith(":")) {
this.useLocal = true
this.localPath = path
this.isApply = isApply
} else {
this.useLocal = false
this.remotePath = path
this.isApply = isApply
}
this.path = path
}
@Override
void projectsLoaded(Gradle gradle) {
gradle.ext.Utils.log("projectsLoaded")
gradle.ext.module.each { k, v ->// 动态把 module 添加到 dep 中
gradle.ext.dep[k] = v.isLocal ? gradle.rootProject.project(v.localPath) : v.url
}
gradle.ext.Utils.log("addModules2Dep: " + gradle.ext.dep.toString())
DepConfig(boolean useLocal, String localPath, String remotePath) {
this(useLocal, localPath, remotePath, true)
}
@Override
void projectsEvaluated(Gradle gradle) {
gradle.ext.Utils.log("projectsEvaluated")
DepConfig(boolean useLocal, String localPath, String remotePath, boolean isApply) {
this.useLocal = useLocal
this.localPath = localPath
this.remotePath = remotePath
this.isApply = isApply
this.path = useLocal ? localPath : remotePath
}
@Override
void buildFinished(BuildResult result) {
ArrayList<Long> array = new ArrayList()
for (timing in timings) {
if (timing[0] >= 100) {
array.add(timing)
}
}
if (!array.isEmpty()) {
Collections.sort(array)
StringBuilder sb = new StringBuilder()
array.reverseEach {
sb.append(String.format("%7sms %s\n", it[0], it[1]))
}
def content = sb.toString()
Utils.log(content)
com.android.utils.FileUtils.writeToFile(file, content)
}
String getGroupId() {
String[] splits = remotePath.split(":")
return splits.length == 3 ? splits[0] : null
}
}
class ModuleConfig {
boolean isLocal
String localPath
String url
String getArtifactId() {
String[] splits = remotePath.split(":")
return splits.length == 3 ? splits[1] : null
}
ModuleConfig(boolean isLocal, String localPath, String url) {
this.isLocal = isLocal
this.localPath = localPath
this.url = url
String getVersion() {
String[] splits = remotePath.split(":")
return splits.length == 3 ? splits[2] : null
}
@Override
String toString() {
return "ModuleConfig { " +
"isLocal = '" + isLocal + "', " +
"localPath = '" + localPath + "', " +
"url = '" + url + "'" +
" }\n"
return "DepConfig { " +
"useLocal = " + useLocal + ", " +
"path = " + path + ", " +
"isApply = " + isApply + "" +
" }"
}
}
//./gradlew clean :utilcode:lib:bintrayUpload
\ No newline at end of file
......@@ -2,7 +2,7 @@ apply {
plugin "com.android.application"
plugin "kotlin-android"
plugin "kotlin-android-extensions"
if (!gradle.ext.bus.isPublish) {
if (gradle.ext.depConfig.plugin_bus.isApply) {
plugin "com.blankj.bus"
}
}
......@@ -50,9 +50,9 @@ android {
dependencies {
// LeakCanary
debugImplementation gradle.ext.dep.leakcanary.android
debugImplementation gradle.ext.dep.leakcanary.support_fragment
releaseImplementation gradle.ext.dep.leakcanary.android_no_op
debugImplementation gradle.ext.dep.leakcanary_android
debugImplementation gradle.ext.dep.leakcanary_support_fragment
releaseImplementation gradle.ext.dep.leakcanary_android_no_op
}
private String getSuffix() {
......
gradle.addBuildListener(new CustomListener(gradle))
class CustomListener implements BuildListener {
private timings = []
private File file
private Gradle gradle
CustomListener(Gradle gradle) {
this.gradle = gradle
}
@Override
void settingsEvaluated(Settings settings) {
log("settingsEvaluated")
}
@Override
void projectsLoaded(Gradle gradle) {
log("projectsLoaded")
configDep()
}
@Override
void projectsEvaluated(Gradle gradle) {
log("projectsEvaluated")
}
@Override
void buildStarted(Gradle gradle) {
log("buildStarted")
gradle.addListener(new TaskExecutionListener() {
@Override
void beforeExecute(Task task) {
log("beforeExecute")
task.ext.startTime = System.currentTimeMillis()
}
@Override
void afterExecute(Task task, TaskState state) {
log("afterExecute")
def ms = System.currentTimeMillis() - task.ext.startTime
timings.add([ms, task.path])
}
})
def sdf = new java.text.SimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
file = new File(rootProject.buildDir.getAbsolutePath(),
"buildTime_" + sdf.format(new Date(System.currentTimeMillis())) + ".txt")
}
@Override
void buildFinished(BuildResult result) {
ArrayList<Long> array = new ArrayList()
for (timing in timings) {
if (timing[0] >= 100) {
array.add(timing)
}
}
if (!array.isEmpty()) {
Collections.sort(array)
StringBuilder sb = new StringBuilder()
array.reverseEach {
sb.append(String.format("%7sms %s\n", it[0], it[1]))
}
def content = sb.toString()
log(content)
com.android.utils.FileUtils.writeToFile(file, content)
}
}
/**
* 根据 depConfig 生成 dep
*/
private void configDep() {
gradle.depConfig.each { name, config ->
if (!config.isApply) return
if (config.useLocal) {
gradle.ext.dep[name] = gradle.rootProject.findProject(config.localPath)
} else {
gradle.ext.dep[name] = config.remotePath
}
}
log("dep = " + gradle.ext.Utils.object2String(gradle.ext.dep))
}
private void log(Object content) {
gradle.ext.Utils.log(content)
}
}
\ No newline at end of file
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri(new File(project.rootDir, "maven")))
}
}
}
\ No newline at end of file
def log(Object content) {
StringBuilder sb = new StringBuilder()
sb.append(Const.BORDER_TOP)
LogFormatter.object2String(content).split(Const.LINE_SEP).each { line ->
sb.append(Const.BORDER_LFT).append(line).append(Const.LINE_SEP)
}
sb.append(Const.BORDER_BTM)
print sb.toString()
}
gradle.ext.Utils = [
log : this.&log,
object2String: LogFormatter.&object2String,
]
class Const {
static final String LINE_SEP = System.getProperty("line.separator");
static final String BORDER_TOP = "┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────" + LINE_SEP
static final String BORDER_LFT = "│ ";
static final String BORDER_BTM = "└────────────────────────────────────────────────────────────────────────────────────────────────────────────────" + LINE_SEP
}
class LogFormatter {
static String object2String(Object object) {
if (object == null) return "null";
if (object.getClass().isArray()) return array2String(object);
if (object instanceof Map) return map2String(object);
if (object instanceof Throwable) return throwable2String(object);
return object.toString();
}
private static String array2String(Object object) {
if (object instanceof Object[]) {
return Arrays.deepToString((Object[]) object);
} else if (object instanceof boolean[]) {
return Arrays.toString((boolean[]) object);
} else if (object instanceof byte[]) {
return Arrays.toString((byte[]) object);
} else if (object instanceof char[]) {
return Arrays.toString((char[]) object);
} else if (object instanceof double[]) {
return Arrays.toString((double[]) object);
} else if (object instanceof float[]) {
return Arrays.toString((float[]) object);
} else if (object instanceof int[]) {
return Arrays.toString((int[]) object);
} else if (object instanceof long[]) {
return Arrays.toString((long[]) object);
} else if (object instanceof short[]) {
return Arrays.toString((short[]) object);
}
throw new IllegalArgumentException("Array has incompatible type: " + object.getClass());
}
private static map2String(Map map) {
StringBuilder sb = new StringBuilder()
sb.append("[")
map.each { k, v ->
sb.append(String.format("$Const.LINE_SEP%8s%-27s: $v,", "", k))
}
sb.deleteCharAt(sb.length() - 1)
sb.append("$Const.LINE_SEP]")
return sb.toString()
}
private static String throwable2String(Throwable throwable) {
final List<Throwable> throwableList = new ArrayList<>();
while (throwable != null && !throwableList.contains(throwable)) {
throwableList.add(throwable);
throwable = throwable.getCause();
}
final int size = throwableList.size();
final List<String> frames = new ArrayList<>();
List<String> nextTrace = getStackFrameList(throwableList.get(size - 1));
for (int i = size; --i >= 0;) {
final List<String> trace = nextTrace;
if (i != 0) {
nextTrace = getStackFrameList(throwableList.get(i - 1));
removeCommonFrames(trace, nextTrace);
}
if (i == size - 1) {
frames.add(throwableList.get(i).toString());
} else {
frames.add(" Caused by: " + throwableList.get(i).toString());
}
frames.addAll(trace);
}
StringBuilder sb = new StringBuilder();
for (final String element : frames) {
sb.append(element).append(Const.LINE_SEP);
}
return sb.toString();
}
private static List<String> getStackFrameList(final Throwable throwable) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
final String stackTrace = sw.toString();
final StringTokenizer frames = new StringTokenizer(stackTrace, Const.LINE_SEP);
final List<String> list = new ArrayList<>();
boolean traceStarted = false;
while (frames.hasMoreTokens()) {
final String token = frames.nextToken();
// Determine if the line starts with <whitespace>at
final int at = token.indexOf("at");
if (at != -1 && token.substring(0, at).trim().isEmpty()) {
traceStarted = true;
list.add(token);
} else if (traceStarted) {
break;
}
}
return list;
}
private static void removeCommonFrames(final List<String> causeFrames, final List<String> wrapperFrames) {
int causeFrameIndex = causeFrames.size() - 1;
int wrapperFrameIndex = wrapperFrames.size() - 1;
while (causeFrameIndex >= 0 && wrapperFrameIndex >= 0) {
// Remove the frame from the cause trace if it is the same
// as in the wrapper trace
final String causeFrame = causeFrames.get(causeFrameIndex);
final String wrapperFrame = wrapperFrames.get(wrapperFrameIndex);
if (causeFrame.equals(wrapperFrame)) {
causeFrames.remove(causeFrameIndex);
}
causeFrameIndex--;
wrapperFrameIndex--;
}
}
}
......@@ -7,13 +7,13 @@ dependencies {
api gradle.ext.dep.utilcode_lib
api gradle.ext.dep.subutil_lib
api gradle.ext.dep.support.appcompat_v7
api gradle.ext.dep.support.design
api gradle.ext.dep.support.multidex
api gradle.ext.dep.support_appcompat_v7
api gradle.ext.dep.support_design
api gradle.ext.dep.support_multidex
api gradle.ext.dep.constraint
api gradle.ext.dep.kotlin
api gradle.ext.dep.free_proguard
api gradle.ext.dep.swipe_panel
compileOnly gradle.ext.dep.leakcanary.android_no_op
compileOnly gradle.ext.dep.leakcanary_android_no_op
// api 'com.blankj:utilcode:1.23.7'
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:duration="200"
android:fromXDelta="-100%"
android:toXDelta="0" />
</set>
\ No newline at end of file
......@@ -26,9 +26,13 @@
</style>
<style name="AnimationActivity" parent="@android:style/Animation">
<!-- A 打开 B,B 的出现动画 -->
<item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item>
<!-- A 打开 B,A 的消失动画 -->
<item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
<!-- B 关闭到 A,A 的出现动画 *时长要小于 B 的消失动画,否则会闪烁* -->
<item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
<!-- B 关闭到 A,B 的消失动画 *时长要小于 B 的消失动画,否则会闪烁* -->
<item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
</resources>
apply from: 'gradle/config/config.gradle'
gradle.fn.includeModules()
\ No newline at end of file
gradle.fn.includeDep()
\ No newline at end of file
......@@ -13,8 +13,8 @@ readme {
}
dependencies {
compileOnly gradle.ext.dep.support.appcompat_v7
compileOnly gradle.ext.dep.support.design
compileOnly gradle.ext.dep.support_appcompat_v7
compileOnly gradle.ext.dep.support_design
api(gradle.ext.dep.glide) {
exclude group: "com.android.support"
}
......
......@@ -441,7 +441,7 @@ declare namespace moment {
// current date/time in local mode
local(keepLocalTime?: boolean): Moment;
isLocal(): boolean;
useLocal(): boolean;
// current date/time in UTC mode
utc(keepLocalTime?: boolean): Moment;
......
......@@ -20,6 +20,7 @@ startHomeActivity : 回到桌面
getActivityList : 获取 Activity 栈链表
getLauncherActivity : 获取启动项 Activity
getTopActivity : 获取栈顶 Activity
isActivityAlive : 判断 Activity 是否存活
isActivityExistsInStack : 判断 Activity 是否存在栈中
finishActivity : 结束 Activity
finishToActivity : 结束到指定 Activity
......
......@@ -13,7 +13,7 @@
buildscript {
dependencies {
...
classpath 'com.blankj:bus-gradle-plugin:1.7'
classpath 'com.blankj:bus-gradle-plugin:1.8'
}
}
```
......@@ -27,7 +27,7 @@ apply plugin: "com.blankj.bus"
给 base 模块添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
```groovy
api "com.blankj:utilcode:1.23.7"
api "com.blankj:utilcode:1.24.0"
```
比如 module0 中存在的 `Module0Activity.java`,我们通常都是在它内部写一个 `start` 函数来启动它,现在我们给它添加 `@BusUtils.Subscribe` 注解,并给注解的 `name` 赋唯一值,要注意,函数务必要 `public static` 哦:
......
......@@ -17,10 +17,10 @@ apply from: "${rootDir.path}/gradle/upload/bintrayUploadAndroid.gradle"
dependencies {
compile gradle.ext.dep.gson
compileOnly gradle.ext.dep.support.appcompat_v7
compileOnly gradle.ext.dep.support.design
compileOnly gradle.ext.dep.support_appcompat_v7
compileOnly gradle.ext.dep.support_design
testImplementation gradle.ext.dep.junit
testImplementation gradle.ext.dep.robolectric
testImplementation gradle.ext.dep.support.appcompat_v7
testImplementation gradle.ext.dep.support_appcompat_v7
}
\ No newline at end of file
......@@ -101,8 +101,6 @@ public final class LogUtils {
private static final String ARGS = "args";
private static final String PLACEHOLDER = " ";
private static final Config CONFIG = new Config();
private static final Gson GSON = new GsonBuilder()
.setPrettyPrinting().serializeNulls().create();
private static final ThreadLocal<SimpleDateFormat> SDF_THREAD_LOCAL = new ThreadLocal<>();
......@@ -333,8 +331,8 @@ public final class LogUtils {
private static String formatObject(int type, Object object) {
if (object == null) return NULL;
if (type == JSON) return LogFormatter.object2Json(object);
if (type == XML) return LogFormatter.formatXml(object.toString());
if (type == JSON) return LogFormatter.object2String(object, JSON);
if (type == XML) return LogFormatter.object2String(object, XML);
return formatObject(object);
}
......@@ -874,38 +872,23 @@ public final class LogUtils {
private final static class LogFormatter {
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().serializeNulls().create();
static String object2String(Object object) {
return object2String(object, -1);
}
static String object2String(Object object, int type) {
if (object.getClass().isArray()) return array2String(object);
if (object instanceof Throwable) return throwable2String((Throwable) object);
if (object instanceof Bundle) return bundle2String((Bundle) object);
if (object instanceof Intent) return intent2String((Intent) object);
return object.toString();
}
static String object2Json(Object object) {
if (object instanceof CharSequence) {
return formatJson(object.toString());
}
try {
return GSON.toJson(object);
} catch (Throwable t) {
return object.toString();
}
}
static String formatXml(String xml) {
try {
Source xmlInput = new StreamSource(new StringReader(xml));
StreamResult xmlOutput = new StreamResult(new StringWriter());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
xml = xmlOutput.getWriter().toString().replaceFirst(">", ">" + LINE_SEP);
} catch (Exception e) {
e.printStackTrace();
if (type == JSON) {
return object2Json(object);
} else if (type == XML) {
return formatXml(object.toString());
}
return xml;
return object.toString();
}
private static String throwable2String(final Throwable e) {
......@@ -1043,24 +1026,6 @@ public final class LogUtils {
return sb.toString();
}
private static String formatJson(String json) {
try {
for (int i = 0, len = json.length(); i < len; i++) {
char c = json.charAt(i);
if (c == '{') {
return new JSONObject(json).toString(2);
} else if (c == '[') {
return new JSONArray(json).toString(2);
} else if (!Character.isWhitespace(c)) {
return json;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return json;
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
private static void clipData2String(ClipData clipData, StringBuilder sb) {
ClipData.Item item = clipData.getItemAt(0);
......@@ -1100,6 +1065,50 @@ public final class LogUtils {
sb.append("}");
}
private static String object2Json(Object object) {
if (object instanceof CharSequence) {
return formatJson(object.toString());
}
try {
return GSON.toJson(object);
} catch (Throwable t) {
return object.toString();
}
}
private static String formatJson(String json) {
try {
for (int i = 0, len = json.length(); i < len; i++) {
char c = json.charAt(i);
if (c == '{') {
return new JSONObject(json).toString(2);
} else if (c == '[') {
return new JSONArray(json).toString(2);
} else if (!Character.isWhitespace(c)) {
return json;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return json;
}
private static String formatXml(String xml) {
try {
Source xmlInput = new StreamSource(new StringReader(xml));
StreamResult xmlOutput = new StreamResult(new StringWriter());
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlOutput);
xml = xmlOutput.getWriter().toString().replaceFirst(">", ">" + LINE_SEP);
} catch (Exception e) {
e.printStackTrace();
}
return xml;
}
private static String array2String(Object object) {
if (object instanceof Object[]) {
return Arrays.deepToString((Object[]) object);
......
......@@ -145,34 +145,8 @@ public final class PermissionUtils {
return Settings.canDrawOverlays(Utils.getApp());
}
/**
* Return whether the app can draw on top of other apps.
*
* @return {@code true}: yes<br>{@code false}: no
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public static boolean isGrantedDrawOverlays(final Utils.Callback<Boolean> callback) {
return Utils.UTIL_HANDLER.postDelayed(new Runnable() {
@Override
public void run() {
callback.onCall(isGrantedDrawOverlays());
}
}, 200);
}
@RequiresApi(api = Build.VERSION_CODES.M)
public static void requestDrawOverlays(final SimpleCallback callback) {
isGrantedDrawOverlays(new Utils.Callback<Boolean>() {
@Override
public void onCall(Boolean data) {
if (data) {
if (callback != null) callback.onGranted();
return;
}
sSimpleCallback4DrawOverlays = callback;
PermissionActivity.start(Utils.getApp(), PermissionActivity.TYPE_DRAW_OVERLAYS);
}
});
if (isGrantedDrawOverlays()) {
if (callback != null) callback.onGranted();
return;
......@@ -458,12 +432,17 @@ public final class PermissionUtils {
sSimpleCallback4WriteSettings = null;
} else if (requestCode == TYPE_DRAW_OVERLAYS) {
if (sSimpleCallback4DrawOverlays == null) return;
if (isGrantedDrawOverlays()) {
sSimpleCallback4DrawOverlays.onGranted();
} else {
sSimpleCallback4DrawOverlays.onDenied();
}
sSimpleCallback4DrawOverlays = null;
Utils.runOnUiThreadDelayed(new Runnable() {
@Override
public void run() {
if (isGrantedDrawOverlays()) {
sSimpleCallback4DrawOverlays.onGranted();
} else {
sSimpleCallback4DrawOverlays.onDenied();
}
sSimpleCallback4DrawOverlays = null;
}
}, 100);
}
finish();
}
......
......@@ -31,6 +31,46 @@ public final class ResourceUtils {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* Return the id identifier by name.
*
* @param name The name of id.
* @return the id identifier by name
*/
public static int getIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "id", Utils.getApp().getPackageName());
}
/**
* Return the string identifier by name.
*
* @param name The name of string.
* @return the string identifier by name
*/
public static int getStringIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "string", Utils.getApp().getPackageName());
}
/**
* Return the color identifier by name.
*
* @param name The name of color.
* @return the color identifier by name
*/
public static int getColorIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "color", Utils.getApp().getPackageName());
}
/**
* Return the dimen identifier by name.
*
* @param name The name of dimen.
* @return the dimen identifier by name
*/
public static int getDimenIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "dimen", Utils.getApp().getPackageName());
}
/**
* Return the drawable identifier by name.
*
......@@ -41,6 +81,56 @@ public final class ResourceUtils {
return Utils.getApp().getResources().getIdentifier(name, "drawable", Utils.getApp().getPackageName());
}
/**
* Return the mipmap identifier by name.
*
* @param name The name of mipmap.
* @return the mipmap identifier by name
*/
public static int getMipmapIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "mipmap", Utils.getApp().getPackageName());
}
/**
* Return the layout identifier by name.
*
* @param name The name of layout.
* @return the layout identifier by name
*/
public static int getLayoutIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "layout", Utils.getApp().getPackageName());
}
/**
* Return the style identifier by name.
*
* @param name The name of style.
* @return the style identifier by name
*/
public static int getStyleIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "style", Utils.getApp().getPackageName());
}
/**
* Return the anim identifier by name.
*
* @param name The name of anim.
* @return the anim identifier by name
*/
public static int getAnimIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "anim", Utils.getApp().getPackageName());
}
/**
* Return the menu identifier by name.
*
* @param name The name of menu.
* @return the menu identifier by name
*/
public static int getMenuIdByName(String name) {
return Utils.getApp().getResources().getIdentifier(name, "menu", Utils.getApp().getPackageName());
}
/**
* Copy the file from assets.
*
......
......@@ -52,6 +52,7 @@ import android.util.Log;
import android.widget.TextView;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
......@@ -132,7 +133,7 @@ public final class SpanUtils {
private int spaceSize;
private int spaceColor;
private SpannableStringBuilder mBuilder;
private SerializableSpannableStringBuilder mBuilder;
private int mType;
private final int mTypeCharSequence = 0;
......@@ -145,7 +146,7 @@ public final class SpanUtils {
}
public SpanUtils() {
mBuilder = new SpannableStringBuilder();
mBuilder = new SerializableSpannableStringBuilder();
mText = "";
mType = -1;
setDefault();
......@@ -1406,6 +1407,12 @@ public final class SpanUtils {
}
}
private static class SerializableSpannableStringBuilder extends SpannableStringBuilder
implements Serializable {
private static final long serialVersionUID = 4909567650765875771L;
}
///////////////////////////////////////////////////////////////////////////
// static
///////////////////////////////////////////////////////////////////////////
......
......@@ -3,7 +3,6 @@ package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
......@@ -437,6 +436,7 @@ public final class ToastUtils {
@Override
public void onActivityDestroyed(Activity activity) {
if (iToast == null) return;
activity.getWindow().getDecorView().setVisibility(View.GONE);
iToast.cancel();
}
};
......@@ -468,35 +468,29 @@ public final class ToastUtils {
mParams.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
Utils.getActivityLifecycle().addOnActivityDestroyedListener(topActivity, LISTENER);
}
// else {
// mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// mParams.type = WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW + 37;
// }
final Configuration config = context.getResources().getConfiguration();
final int gravity = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
? Gravity.getAbsoluteGravity(mToast.getGravity(), config.getLayoutDirection())
: mToast.getGravity();
mParams.y = mToast.getYOffset();
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.format = PixelFormat.TRANSLUCENT;
mParams.windowAnimations = android.R.style.Animation_Toast;
mParams.setTitle("ToastWithoutNotification");
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mParams.gravity = gravity;
if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
mParams.packageName = Utils.getApp().getPackageName();
mParams.gravity = mToast.getGravity();
if ((mParams.gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
mParams.horizontalWeight = 1.0f;
}
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
if ((mParams.gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
mParams.verticalWeight = 1.0f;
}
mParams.x = mToast.getXOffset();
mParams.packageName = Utils.getApp().getPackageName();
mParams.y = mToast.getYOffset();
mParams.horizontalMargin = mToast.getHorizontalMargin();
mParams.verticalMargin = mToast.getVerticalMargin();
try {
if (mWM != null) {
......
......@@ -159,7 +159,7 @@ public final class Utils {
return task;
}
static void runOnUiThread(final Runnable runnable) {
public static void runOnUiThread(final Runnable runnable) {
if (Looper.myLooper() == Looper.getMainLooper()) {
runnable.run();
} else {
......@@ -167,12 +167,8 @@ public final class Utils {
}
}
static void runOnUiThreadDelayed(final Runnable runnable, long delayMillis) {
if (Looper.myLooper() == Looper.getMainLooper()) {
runnable.run();
} else {
Utils.UTIL_HANDLER.postDelayed(runnable, delayMillis);
}
public static void runOnUiThreadDelayed(final Runnable runnable, long delayMillis) {
Utils.UTIL_HANDLER.postDelayed(runnable, delayMillis);
}
static String getCurrentProcessName() {
......@@ -321,9 +317,7 @@ public final class Utils {
}
@Override
public void onActivityPaused(Activity activity) {/**/
}
public void onActivityPaused(Activity activity) {/**/}
@Override
public void onActivityStopped(Activity activity) {
......@@ -350,9 +344,14 @@ public final class Utils {
Activity getTopActivity() {
if (!mActivityList.isEmpty()) {
final Activity topActivity = mActivityList.getLast();
if (topActivity != null) {
return topActivity;
for (int i = mActivityList.size() - 1; i >= 0; i--) {
Activity activity = mActivityList.get(i);
if (activity == null
|| activity.isFinishing()
|| (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
continue;
}
return activity;
}
}
Activity topActivityByReflect = getTopActivityByReflect();
......
......@@ -203,7 +203,7 @@
<activity
android:name=".feature.screen.ScreenActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop"></activity>
android:launchMode="singleTop" />
<activity
android:name=".feature.sdcard.SDCardActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
......
package com.blankj.utilcode.pkg.feature.adaptScreen
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import com.blankj.lib.base.BaseTitleActivity
......@@ -11,9 +12,8 @@ class AdaptScreenActivity : BaseTitleActivity() {
companion object {
fun start(context: Context) {
// val starter = Intent(context, AdaptScreenActivity::class.java)
// context.startActivity(starter)
AppStoreUtils.go2AppStoreAtLarkPage(context)
val starter = Intent(context, AdaptScreenActivity::class.java)
context.startActivity(starter)
}
}
......
package com.blankj.utilcode.pkg.feature.adaptScreen;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v4.util.ArrayMap;
import com.blankj.utilcode.util.LogUtils;
import java.util.List;
/**
* <pre>
* author: blankj
* blog : http://blankj.com
* time : 2019/05/20
* desc :
* </pre>
*/
public class AppStoreUtils {
private static final String TAG = "AppStoreUtils";
private static final String larkPkg = "com.ss.android.lark";
private static ArrayMap<String, String> 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<String> 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<String> 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();
}
}
......@@ -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()
}
}
......@@ -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<TextView>(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<ImageView>(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<Button>(R.id.toastDialogShowShortToastBtn)
.setOnClickListener { ToastUtils.showShort("Short") }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册