提交 27cf719c 编写于 作者: B Blankj

see 11/13 log

上级 e6ec42f7
* `20/11/13` [add] Fix MessengerUtils ANR. Add NetworkUtils#getWifiScanResult, [add|remove]OnWifiChangedConsumer. Publish v1.30.5.
* `20/10/29` [add] Fix MessengerUtils startService IllegalStateException. Publish v1.30.4.
* `20/10/28` [add] Fix BusUtils ConcurrentModificationException. Publish v1.30.3.
* `20/10/27` [add] Fix AppUtils#getAppSignatures. Add DeviceUtils#isDevelopmentSettingsEnabled. Publish v1.30.2.
......
......@@ -14,8 +14,8 @@ class Config {
static compileSdkVersion = 29
static minSdkVersion = 14
static targetSdkVersion = 29
static versionCode = 1_030_004
static versionName = '1.30.4'// E.g. 1.9.72 => 1,009,072
static versionCode = 1_030_005
static versionName = '1.30.5'// E.g. 1.9.72 => 1,009,072
// lib version
static gradlePluginVersion = '3.5.0'
......@@ -53,7 +53,7 @@ class Config {
// 上传新版本插件更新 pluginPath 中的版本号,并设置 isApply = false
// 通过 mavenLocal 上传本地版本,设置 isApply = true 即可应用插件来调试,最后通过 bintrayUpload 来发布插件
plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:latest.release", pluginId: "com.blankj.api"),
plugin_api : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:api-gradle-plugin:1.5", pluginId: "com.blankj.api"),
//./gradlew clean :plugin_api-gradle-plugin:mavenLocal // 上传到本地 mavenLocal
//./gradlew clean :plugin_api-gradle-plugin:bintrayUpload // 上传到 jcenter
plugin_bus : new DepConfig(isApply: true, useLocal: false, pluginPath: "com.blankj:bus-gradle-plugin:2.6", pluginId: "com.blankj.bus"),
......
......@@ -18,6 +18,7 @@
<uses-permission android:name="android.permission.FLASHLIGHT" />
<!-- network -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
......
......@@ -2,13 +2,17 @@ package com.blankj.utilcode.pkg.feature.network
import android.content.Context
import android.content.Intent
import android.net.wifi.ScanResult
import android.net.wifi.WifiManager
import android.os.Bundle
import android.view.View
import com.blankj.common.activity.CommonActivity
import com.blankj.common.helper.PermissionHelper
import com.blankj.common.item.CommonItem
import com.blankj.common.item.CommonItemClick
import com.blankj.common.item.CommonItemSwitch
import com.blankj.common.item.CommonItemTitle
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.pkg.R
import com.blankj.utilcode.util.*
......@@ -24,12 +28,24 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
companion object {
fun start(context: Context) {
val starter = Intent(context, NetworkActivity::class.java)
context.startActivity(starter)
PermissionHelper.request(context, object : PermissionUtils.SimpleCallback {
override fun onGranted() {
val starter = Intent(context, NetworkActivity::class.java)
context.startActivity(starter)
}
override fun onDenied() {
}
}, PermissionConstants.LOCATION)
}
}
private lateinit var itemsTask: ThreadUtils.SimpleTask<List<CommonItem<*>>>
private lateinit var wifiScanResultItem: CommonItemTitle
private val consumer = Utils.Consumer<NetworkUtils.WifiScanResults> { t ->
wifiScanResultItem.setContent(scanResults2String(t.filterResults))
wifiScanResultItem.update()
}
override fun bindTitleRes(): Int {
return R.string.demo_network
......@@ -51,6 +67,7 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
override fun bindItems(): List<CommonItem<*>> {
if (ThreadUtils.isMainThread()) return arrayListOf()
wifiScanResultItem = CommonItemTitle("getWifiScanResult", scanResults2String(NetworkUtils.getWifiScanResult().filterResults))
return CollectionUtils.newArrayList(
CommonItemTitle("isConnected", NetworkUtils.isConnected().toString()),
CommonItemTitle("getMobileDataEnabled", NetworkUtils.getMobileDataEnabled().toString()),
......@@ -72,10 +89,19 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
CommonItemTitle("isWifiAvailable", NetworkUtils.isWifiAvailable().toString()),
CommonItemTitle("isAvailable", NetworkUtils.isAvailable().toString()),
CommonItemTitle("getBaiduDomainAddress", NetworkUtils.getDomainAddress("baidu.com")),
wifiScanResultItem,
CommonItemSwitch(
R.string.network_wifi_enabled,
{ NetworkUtils.getWifiEnabled() },
{
val wifiEnabled = NetworkUtils.getWifiEnabled()
if (wifiEnabled) {
NetworkUtils.addOnWifiChangedConsumer(consumer)
} else {
NetworkUtils.removeOnWifiChangedConsumer(consumer)
}
wifiEnabled
},
{
NetworkUtils.setWifiEnabled(it)
ThreadUtils.executeByIo(getItemsTask())
......@@ -112,5 +138,14 @@ class NetworkActivity : CommonActivity(), NetworkUtils.OnNetworkStatusChangedLis
super.onDestroy()
ThreadUtils.cancel(itemsTask)
NetworkUtils.unregisterNetworkStatusChangedListener(this)
NetworkUtils.removeOnWifiChangedConsumer(consumer)
}
private fun scanResults2String(results: List<ScanResult>): String {
val sb: StringBuilder = StringBuilder()
for (result in results) {
sb.append(String.format("${result.SSID}, Level: ${WifiManager.calculateSignalLevel(result.level, 4)}\n"))
}
return sb.toString()
}
}
......@@ -76,7 +76,6 @@ public final class BatteryUtils {
void registerListener(final OnBatteryStatusChangedListener listener) {
if (listener == null) return;
ThreadUtils.runOnUiThread(new Runnable() {
@SuppressLint("MissingPermission")
@Override
public void run() {
int preSize = mListeners.size();
......@@ -109,7 +108,6 @@ public final class BatteryUtils {
});
}
@SuppressLint("MissingPermission")
@Override
public void onReceive(Context context, final Intent intent) {
if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.30.4'
implementation 'com.blankj:utilcode:1.30.5'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.30.4'
implementation 'com.blankj:utilcodex:1.30.5'
```
......@@ -721,6 +721,9 @@ getServerAddressByWifi : 根据 WiFi 获取服务端 IP 地址
registerNetworkStatusChangedListener : 注册网络状态改变监听器
isRegisteredNetworkStatusChangedListener: 判断是否注册网络状态改变监听器
unregisterNetworkStatusChangedListener : 注销网络状态改变监听器
getWifiScanResult : 获取 WIFI 列表
addOnWifiChangedConsumer : 增加 WIFI 改变监听
removeOnWifiChangedConsumer : 移除 WIFI 改变监听
```
* ### 通知相关 -> [NotificationUtils.java][notification.java] -> [Demo][notification.demo]
......
......@@ -2,10 +2,10 @@
Gradle:
```groovy
implementation 'com.blankj:utilcode:1.30.4'
implementation 'com.blankj:utilcode:1.30.5'
// if u use AndroidX, use the following
implementation 'com.blankj:utilcodex:1.30.4'
implementation 'com.blankj:utilcodex:1.30.5'
```
......@@ -721,6 +721,9 @@ getServerAddressByWifi
registerNetworkStatusChangedListener
isRegisteredNetworkStatusChangedListener
unregisterNetworkStatusChangedListener
getWifiScanResult
addOnWifiChangedConsumer
removeOnWifiChangedConsumer
```
* ### About Notification -> [NotificationUtils.java][notification.java] -> [Demo][notification.demo]
......
......@@ -30,7 +30,6 @@ public final class CrashUtils {
/**
* Initialization.
*/
@SuppressLint("MissingPermission")
public static void init() {
init("");
}
......
......@@ -113,7 +113,7 @@ public final class DeviceUtils {
*
* @return the MAC address
*/
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET, CHANGE_WIFI_STATE})
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, CHANGE_WIFI_STATE})
public static String getMacAddress() {
String macAddress = getMacAddress((String[]) null);
if (!TextUtils.isEmpty(macAddress) || getWifiEnabled()) return macAddress;
......@@ -151,7 +151,7 @@ public final class DeviceUtils {
*
* @return the MAC address
*/
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET})
@RequiresPermission(allOf = {ACCESS_WIFI_STATE})
public static String getMacAddress(final String... excepts) {
String macAddress = getMacAddressByNetworkInterface();
if (isAddressNotInExcepts(macAddress, excepts)) {
......@@ -190,7 +190,7 @@ public final class DeviceUtils {
return true;
}
@SuppressLint({"MissingPermission", "HardwareIds"})
@RequiresPermission(ACCESS_WIFI_STATE)
private static String getMacAddressByWifiInfo() {
try {
final WifiManager wifi = (WifiManager) Utils.getApp()
......@@ -198,6 +198,7 @@ public final class DeviceUtils {
if (wifi != null) {
final WifiInfo info = wifi.getConnectionInfo();
if (info != null) {
@SuppressLint("HardwareIds")
String macAddress = info.getMacAddress();
if (!TextUtils.isEmpty(macAddress)) {
return macAddress;
......@@ -412,7 +413,6 @@ public final class DeviceUtils {
*
* @return the unique device id
*/
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getUniqueDeviceId() {
return getUniqueDeviceId("", true);
}
......@@ -426,7 +426,6 @@ public final class DeviceUtils {
* @param prefix The prefix of the unique device id.
* @return the unique device id
*/
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getUniqueDeviceId(String prefix) {
return getUniqueDeviceId(prefix, true);
}
......@@ -440,7 +439,6 @@ public final class DeviceUtils {
* @param useCache True to use cache, false otherwise.
* @return the unique device id
*/
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getUniqueDeviceId(boolean useCache) {
return getUniqueDeviceId("", useCache);
}
......@@ -455,7 +453,6 @@ public final class DeviceUtils {
* @param useCache True to use cache, false otherwise.
* @return the unique device id
*/
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getUniqueDeviceId(String prefix, boolean useCache) {
if (!useCache) {
return getUniqueDeviceIdReal(prefix);
......@@ -486,7 +483,7 @@ public final class DeviceUtils {
return saveUdid(prefix + 9, "");
}
@SuppressLint({"MissingPermission", "HardwareIds"})
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET, CHANGE_WIFI_STATE})
public static boolean isSameDevice(final String uniqueDeviceId) {
// {prefix}{type}{32id}
if (TextUtils.isEmpty(uniqueDeviceId) && uniqueDeviceId.length() < 33) return false;
......
......@@ -17,6 +17,7 @@ import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
......@@ -301,7 +302,7 @@ public final class FragmentUtils {
final boolean isHide,
final boolean isAddStack) {
putArgs(add, new Args(containerId, tag, isHide, isAddStack));
operateNoAnim(fm, TYPE_ADD_FRAGMENT, null, add);
operateNoAnim(TYPE_ADD_FRAGMENT, fm, null, add);
}
/**
......@@ -489,7 +490,7 @@ public final class FragmentUtils {
putArgs(adds[i], new Args(containerId, tags[i], showIndex != i, false));
}
}
operateNoAnim(fm, TYPE_ADD_FRAGMENT, null, adds);
operateNoAnim(TYPE_ADD_FRAGMENT, fm, null, adds);
}
/**
......@@ -499,7 +500,7 @@ public final class FragmentUtils {
*/
public static void show(@NonNull final Fragment show) {
putArgs(show, false);
operateNoAnim(show.getFragmentManager(), TYPE_SHOW_FRAGMENT, null, show);
operateNoAnim(TYPE_SHOW_FRAGMENT, show.getFragmentManager(), null, show);
}
/**
......@@ -512,11 +513,7 @@ public final class FragmentUtils {
for (Fragment show : fragments) {
putArgs(show, false);
}
operateNoAnim(fm,
TYPE_SHOW_FRAGMENT,
null,
fragments.toArray(new Fragment[0])
);
operateNoAnim(TYPE_SHOW_FRAGMENT, fm, null, fragments.toArray(new Fragment[0]));
}
/**
......@@ -526,7 +523,7 @@ public final class FragmentUtils {
*/
public static void hide(@NonNull final Fragment hide) {
putArgs(hide, true);
operateNoAnim(hide.getFragmentManager(), TYPE_HIDE_FRAGMENT, null, hide);
operateNoAnim(TYPE_HIDE_FRAGMENT, hide.getFragmentManager(), null, hide);
}
/**
......@@ -539,21 +536,28 @@ public final class FragmentUtils {
for (Fragment hide : fragments) {
putArgs(hide, true);
}
operateNoAnim(fm,
TYPE_HIDE_FRAGMENT,
null,
fragments.toArray(new Fragment[0])
);
operateNoAnim(TYPE_HIDE_FRAGMENT, fm, null, fragments.toArray(new Fragment[0]));
}
/**
* Show fragment then hide other fragment.
*
* @param show The fragment will be show.
* @param hide The fragment will be hide.
*/
public static void showHide(@NonNull final Fragment show,
@NonNull final Fragment hide) {
showHide(show, Collections.singletonList(hide));
}
/**
* Show fragment then hide other fragment.
*
* @param showIndex The index of fragment will be shown.
* @param fragments The fragments will be hide.
* @param fragments The fragment will be hide.
*/
public static void showHide(final int showIndex, @NonNull final List<Fragment> fragments) {
showHide(fragments.get(showIndex), fragments);
public static void showHide(final int showIndex, @NonNull final Fragment... fragments) {
showHide(fragments[showIndex], fragments);
}
/**
......@@ -562,22 +566,18 @@ public final class FragmentUtils {
* @param show The fragment will be show.
* @param hide The fragment will be hide.
*/
public static void showHide(@NonNull final Fragment show, @NonNull final List<Fragment> hide) {
for (Fragment fragment : hide) {
putArgs(fragment, fragment != show);
}
operateNoAnim(show.getFragmentManager(), TYPE_SHOW_HIDE_FRAGMENT, show,
hide.toArray(new Fragment[0]));
public static void showHide(@NonNull final Fragment show, @NonNull final Fragment... hide) {
showHide(show, Arrays.asList(hide));
}
/**
* Show fragment then hide other fragment.
*
* @param showIndex The index of fragment will be shown.
* @param fragments The fragment will be hide.
* @param fragments The fragments will be hide.
*/
public static void showHide(final int showIndex, @NonNull final Fragment... fragments) {
showHide(fragments[showIndex], fragments);
public static void showHide(final int showIndex, @NonNull final List<Fragment> fragments) {
showHide(fragments.get(showIndex), fragments);
}
/**
......@@ -586,13 +586,14 @@ public final class FragmentUtils {
* @param show The fragment will be show.
* @param hide The fragment will be hide.
*/
public static void showHide(@NonNull final Fragment show, @NonNull final Fragment... hide) {
public static void showHide(@NonNull final Fragment show, @NonNull final List<Fragment> hide) {
for (Fragment fragment : hide) {
putArgs(fragment, fragment != show);
}
operateNoAnim(show.getFragmentManager(), TYPE_SHOW_HIDE_FRAGMENT, show, hide);
operateNoAnim(TYPE_SHOW_HIDE_FRAGMENT, show.getFragmentManager(), show, hide.toArray(new Fragment[0]));
}
/**
* Show fragment then hide other fragment.
*
......@@ -600,10 +601,47 @@ public final class FragmentUtils {
* @param hide The fragment will be hide.
*/
public static void showHide(@NonNull final Fragment show,
@NonNull final Fragment hide) {
putArgs(show, false);
putArgs(hide, true);
operateNoAnim(show.getFragmentManager(), TYPE_SHOW_HIDE_FRAGMENT, show, hide);
@NonNull final Fragment hide, @AnimatorRes @AnimRes final int enterAnim,
@AnimatorRes @AnimRes final int exitAnim,
@AnimatorRes @AnimRes final int popEnterAnim,
@AnimatorRes @AnimRes final int popExitAnim) {
showHide(show, Collections.singletonList(hide), enterAnim, exitAnim, popEnterAnim, popExitAnim);
}
/**
* Show fragment then hide other fragment.
*
* @param showIndex The index of fragment will be shown.
* @param fragments The fragments will be hide.
*/
public static void showHide(final int showIndex, @NonNull final List<Fragment> fragments,
@AnimatorRes @AnimRes final int enterAnim,
@AnimatorRes @AnimRes final int exitAnim,
@AnimatorRes @AnimRes final int popEnterAnim,
@AnimatorRes @AnimRes final int popExitAnim) {
showHide(fragments.get(showIndex), fragments, enterAnim, exitAnim, popEnterAnim, popExitAnim);
}
/**
* Show fragment then hide other fragment.
*
* @param show The fragment will be show.
* @param hide The fragment will be hide.
*/
public static void showHide(@NonNull final Fragment show, @NonNull final List<Fragment> hide,
@AnimatorRes @AnimRes final int enterAnim,
@AnimatorRes @AnimRes final int exitAnim,
@AnimatorRes @AnimRes final int popEnterAnim,
@AnimatorRes @AnimRes final int popExitAnim) {
for (Fragment fragment : hide) {
putArgs(fragment, fragment != show);
}
FragmentManager fm = show.getFragmentManager();
if (fm != null) {
FragmentTransaction ft = fm.beginTransaction();
addAnim(ft, enterAnim, exitAnim, popEnterAnim, popExitAnim);
operate(TYPE_SHOW_HIDE_FRAGMENT, fm, ft, show, hide.toArray(new Fragment[0]));
}
}
/**
......@@ -1357,7 +1395,7 @@ public final class FragmentUtils {
* @param remove The fragment will be removed.
*/
public static void remove(@NonNull final Fragment remove) {
operateNoAnim(remove.getFragmentManager(), TYPE_REMOVE_FRAGMENT, null, remove);
operateNoAnim(TYPE_REMOVE_FRAGMENT, remove.getFragmentManager(), null, remove);
}
/**
......@@ -1367,8 +1405,7 @@ public final class FragmentUtils {
* @param isIncludeSelf True to include the fragment, false otherwise.
*/
public static void removeTo(@NonNull final Fragment removeTo, final boolean isIncludeSelf) {
operateNoAnim(removeTo.getFragmentManager(), TYPE_REMOVE_TO_FRAGMENT,
isIncludeSelf ? removeTo : null, removeTo);
operateNoAnim(TYPE_REMOVE_TO_FRAGMENT, removeTo.getFragmentManager(), isIncludeSelf ? removeTo : null, removeTo);
}
/**
......@@ -1378,11 +1415,7 @@ public final class FragmentUtils {
*/
public static void removeAll(@NonNull final FragmentManager fm) {
List<Fragment> fragments = getFragments(fm);
operateNoAnim(fm,
TYPE_REMOVE_FRAGMENT,
null,
fragments.toArray(new Fragment[0])
);
operateNoAnim(TYPE_REMOVE_FRAGMENT, fm, null, fragments.toArray(new Fragment[0]));
}
private static void putArgs(final Fragment fragment, final Args args) {
......@@ -1414,8 +1447,7 @@ public final class FragmentUtils {
bundle.getBoolean(ARGS_IS_ADD_STACK));
}
private static void operateNoAnim(@Nullable final FragmentManager fm,
final int type,
private static void operateNoAnim(final int type, @Nullable final FragmentManager fm,
final Fragment src,
Fragment... dest) {
if (fm == null) return;
......
package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
......@@ -296,6 +297,12 @@ public class MessengerUtils {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Notification notification = UtilsBridge.getNotification(
NotificationUtils.ChannelConfig.DEFAULT_CHANNEL_CONFIG, null
);
startForeground(1, notification);
}
if (intent != null) {
Bundle extras = intent.getExtras();
if (extras != null) {
......
......@@ -7,6 +7,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
......@@ -22,12 +23,18 @@ import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CopyOnWriteArraySet;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.ACCESS_WIFI_STATE;
import static android.Manifest.permission.CHANGE_WIFI_STATE;
......@@ -686,6 +693,7 @@ public final class NetworkUtils {
*
* @param listener The status of network changed listener
*/
@RequiresPermission(ACCESS_NETWORK_STATE)
public static void registerNetworkStatusChangedListener(final OnNetworkStatusChangedListener listener) {
NetworkChangedReceiver.getInstance().registerListener(listener);
}
......@@ -709,6 +717,123 @@ public final class NetworkUtils {
NetworkChangedReceiver.getInstance().unregisterListener(listener);
}
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, ACCESS_COARSE_LOCATION})
public static WifiScanResults getWifiScanResult() {
WifiScanResults result = new WifiScanResults();
if (!getWifiEnabled()) return result;
@SuppressLint("WifiManagerLeak")
WifiManager wm = (WifiManager) Utils.getApp().getSystemService(WIFI_SERVICE);
//noinspection ConstantConditions
List<ScanResult> results = wm.getScanResults();
if (results != null) {
result.setAllResults(results);
}
return result;
}
private static final long SCAN_PERIOD_MILLIS = 3000;
private static final Set<Utils.Consumer<WifiScanResults>> SCAN_RESULT_CONSUMERS = new CopyOnWriteArraySet<>();
private static Timer sScanWifiTimer;
private static WifiScanResults sPreWifiScanResults;
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, CHANGE_WIFI_STATE, ACCESS_COARSE_LOCATION})
public static void addOnWifiChangedConsumer(final Utils.Consumer<WifiScanResults> consumer) {
if (consumer == null) return;
UtilsBridge.runOnUiThread(new Runnable() {
@Override
public void run() {
if (SCAN_RESULT_CONSUMERS.isEmpty()) {
SCAN_RESULT_CONSUMERS.add(consumer);
startScanWifi();
return;
}
consumer.accept(sPreWifiScanResults);
SCAN_RESULT_CONSUMERS.add(consumer);
}
});
}
private static void startScanWifi() {
sPreWifiScanResults = new WifiScanResults();
sScanWifiTimer = new Timer();
sScanWifiTimer.schedule(new TimerTask() {
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, CHANGE_WIFI_STATE, ACCESS_COARSE_LOCATION})
@Override
public void run() {
startScanWifiIfEnabled();
WifiScanResults scanResults = getWifiScanResult();
if (isSameScanResults(sPreWifiScanResults.allResults, scanResults.allResults)) {
return;
}
sPreWifiScanResults = scanResults;
UtilsBridge.runOnUiThread(new Runnable() {
@Override
public void run() {
for (Utils.Consumer<WifiScanResults> consumer : SCAN_RESULT_CONSUMERS) {
consumer.accept(sPreWifiScanResults);
}
}
});
}
}, 0, SCAN_PERIOD_MILLIS);
}
@RequiresPermission(allOf = {ACCESS_WIFI_STATE, CHANGE_WIFI_STATE})
private static void startScanWifiIfEnabled() {
if (!getWifiEnabled()) return;
@SuppressLint("WifiManagerLeak")
WifiManager wm = (WifiManager) Utils.getApp().getSystemService(WIFI_SERVICE);
//noinspection ConstantConditions
wm.startScan();
}
public static void removeOnWifiChangedConsumer(final Utils.Consumer<WifiScanResults> consumer) {
if (consumer == null) return;
UtilsBridge.runOnUiThread(new Runnable() {
@Override
public void run() {
SCAN_RESULT_CONSUMERS.remove(consumer);
if (SCAN_RESULT_CONSUMERS.isEmpty()) {
stopScanWifi();
}
}
});
}
private static void stopScanWifi() {
if (sScanWifiTimer != null) {
sScanWifiTimer.cancel();
sScanWifiTimer = null;
}
}
private static boolean isSameScanResults(List<ScanResult> l1, List<ScanResult> l2) {
if (l1 == null && l2 == null) {
return true;
}
if (l1 == null || l2 == null) {
return false;
}
if (l1.size() != l2.size()) {
return false;
}
for (int i = 0; i < l1.size(); i++) {
ScanResult r1 = l1.get(i);
ScanResult r2 = l2.get(i);
if (!isSameScanResultContent(r1, r2)) {
return false;
}
}
return true;
}
private static boolean isSameScanResultContent(ScanResult r1, ScanResult r2) {
return r1 != null && r2 != null && UtilsBridge.equals(r1.BSSID, r2.BSSID)
&& UtilsBridge.equals(r1.SSID, r2.SSID)
&& UtilsBridge.equals(r1.capabilities, r2.capabilities)
&& r1.level == r2.level;
}
public static final class NetworkChangedReceiver extends BroadcastReceiver {
private static NetworkChangedReceiver getInstance() {
......@@ -718,11 +843,12 @@ public final class NetworkUtils {
private NetworkType mType;
private Set<OnNetworkStatusChangedListener> mListeners = new HashSet<>();
@RequiresPermission(ACCESS_NETWORK_STATE)
void registerListener(final OnNetworkStatusChangedListener listener) {
if (listener == null) return;
UtilsBridge.runOnUiThread(new Runnable() {
@SuppressLint("MissingPermission")
@Override
@RequiresPermission(ACCESS_NETWORK_STATE)
public void run() {
int preSize = mListeners.size();
mListeners.add(listener);
......@@ -754,13 +880,13 @@ public final class NetworkUtils {
});
}
@SuppressLint("MissingPermission")
@Override
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
// debouncing
UtilsBridge.runOnUiThreadDelayed(new Runnable() {
@Override
@RequiresPermission(ACCESS_NETWORK_STATE)
public void run() {
NetworkType networkType = NetworkUtils.getNetworkType();
if (mType == networkType) return;
......@@ -863,4 +989,45 @@ public final class NetworkUtils {
void onConnected(NetworkType networkType);
}
public static final class WifiScanResults {
private List<ScanResult> allResults = new ArrayList<>();
private List<ScanResult> filterResults = new ArrayList<>();
public WifiScanResults() {
}
public List<ScanResult> getAllResults() {
return allResults;
}
public List<ScanResult> getFilterResults() {
return filterResults;
}
public void setAllResults(List<ScanResult> allResults) {
this.allResults = allResults;
filterResults = filterScanResult(allResults);
}
private static List<ScanResult> filterScanResult(final List<ScanResult> results) {
if (results == null || results.isEmpty()) {
return new ArrayList<>();
}
LinkedHashMap<String, ScanResult> map = new LinkedHashMap<>(results.size());
for (ScanResult result : results) {
if (TextUtils.isEmpty(result.SSID)) {
continue;
}
ScanResult resultInMap = map.get(result.SSID);
if (resultInMap != null && resultInMap.level >= result.level) {
continue;
}
map.put(result.SSID, result);
}
return new ArrayList<>(map.values());
}
}
}
......@@ -91,21 +91,26 @@ public class NotificationUtils {
* @param consumer The consumer of create the builder of notification.
*/
public static void notify(String tag, int id, ChannelConfig channelConfig, Utils.Consumer<NotificationCompat.Builder> consumer) {
NotificationManagerCompat.from(Utils.getApp()).notify(tag, id, getNotification(channelConfig, consumer));
}
public static Notification getNotification(ChannelConfig channelConfig, Utils.Consumer<NotificationCompat.Builder> consumer) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager nm = (NotificationManager) Utils.getApp().getSystemService(Context.NOTIFICATION_SERVICE);
//noinspection ConstantConditions
nm.createNotificationChannel(channelConfig.getNotificationChannel());
}
NotificationManagerCompat nmc = NotificationManagerCompat.from(Utils.getApp());
NotificationCompat.Builder builder = new NotificationCompat.Builder(Utils.getApp());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(channelConfig.mNotificationChannel.getId());
}
consumer.accept(builder);
if (consumer != null) {
consumer.accept(builder);
}
nmc.notify(tag, id, builder.build());
return builder.build();
}
/**
......
......@@ -1525,7 +1525,7 @@ public final class TimeUtils {
private static final int[] ZODIAC_FLAGS = {20, 19, 21, 21, 21, 22, 23, 23, 23, 24, 23, 22};
private static final String[] ZODIAC = {
"水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座",
"狮子座", "处女座", "天秤座", "天蝎座", "射手座", "羯座"
"狮子座", "处女座", "天秤座", "天蝎座", "射手座", "羯座"
};
/**
......
......@@ -7,6 +7,7 @@ import android.arch.lifecycle.Lifecycle;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
......@@ -195,6 +196,9 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
///////////////////////////////////////////////////////////////////////////
// lifecycle start
///////////////////////////////////////////////////////////////////////////
@Override
public void onActivityPreCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {/**/}
@Override
public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {
LanguageUtils.applyLanguage(activity);
......@@ -203,6 +207,12 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
consumeActivityLifecycleCallbacks(activity, Lifecycle.Event.ON_CREATE);
}
@Override
public void onActivityPostCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {/**/}
@Override
public void onActivityPreStarted(@NonNull Activity activity) {/**/}
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (!mIsBackground) {
......@@ -216,6 +226,12 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
consumeActivityLifecycleCallbacks(activity, Lifecycle.Event.ON_START);
}
@Override
public void onActivityPostStarted(@NonNull Activity activity) {/**/}
@Override
public void onActivityPreResumed(@NonNull Activity activity) {/**/}
@Override
public void onActivityResumed(@NonNull final Activity activity) {
setTopActivity(activity);
......@@ -227,11 +243,23 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
consumeActivityLifecycleCallbacks(activity, Lifecycle.Event.ON_RESUME);
}
@Override
public void onActivityPostResumed(@NonNull Activity activity) {/**/}
@Override
public void onActivityPrePaused(@NonNull Activity activity) {/**/}
@Override
public void onActivityPaused(@NonNull Activity activity) {
consumeActivityLifecycleCallbacks(activity, Lifecycle.Event.ON_PAUSE);
}
@Override
public void onActivityPostPaused(@NonNull Activity activity) {/**/}
@Override
public void onActivityPreStopped(@NonNull Activity activity) {/**/}
@Override
public void onActivityStopped(Activity activity) {
if (activity.isChangingConfigurations()) {
......@@ -248,7 +276,19 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, Bundle outState) {/**/}
public void onActivityPostStopped(@NonNull Activity activity) {/**/}
@Override
public void onActivityPreSaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {/**/}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {/**/}
@Override
public void onActivityPostSaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {/**/}
@Override
public void onActivityPreDestroyed(@NonNull Activity activity) {/**/}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
......@@ -256,6 +296,9 @@ final class UtilsActivityLifecycleImpl implements Application.ActivityLifecycleC
UtilsBridge.fixSoftInputLeaks(activity);
consumeActivityLifecycleCallbacks(activity, Lifecycle.Event.ON_DESTROY);
}
@Override
public void onActivityPostDestroyed(@NonNull Activity activity) {/**/}
///////////////////////////////////////////////////////////////////////////
// lifecycle end
///////////////////////////////////////////////////////////////////////////
......
......@@ -2,6 +2,7 @@ package com.blankj.utilcode.util;
import android.app.Activity;
import android.app.Application;
import android.app.Notification;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
......@@ -14,6 +15,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.annotation.RequiresPermission;
import android.support.annotation.StringRes;
import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.view.View;
......@@ -418,6 +420,14 @@ class UtilsBridge {
KeyboardUtils.fixSoftInputLeaks(activity);
}
///////////////////////////////////////////////////////////////////////////
// NotificationUtils
///////////////////////////////////////////////////////////////////////////
static Notification getNotification(NotificationUtils.ChannelConfig channelConfig,
Utils.Consumer<NotificationCompat.Builder> consumer) {
return NotificationUtils.getNotification(channelConfig, consumer);
}
///////////////////////////////////////////////////////////////////////////
// PermissionUtils
///////////////////////////////////////////////////////////////////////////
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册