代码提交。

This commit is contained in:
Jay Gao 2022-08-09 10:59:33 +08:00
commit 02e9633de5
984 changed files with 80784 additions and 0 deletions

11
.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
.idea
.apk

View File

@ -0,0 +1,72 @@
apply plugin: 'com.android.library'
repositories {
flatDir {
dirs 'libs'
}
}
android {
compileSdkVersion 29
buildToolsVersion "29.0.1"
defaultConfig {
minSdkVersion 21
targetSdkVersion 26
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
sourceSets {
main.res.srcDirs = ['src/main/res',
'src/main/res/lc',
'src/main/res/lc/drawable',
'src/main/res/lc/drawable-hdpi',
'src/main/res/lc/drawable-xhdpi',
'src/main/res/lc/drawable-xxhdpi',
'src/main/res/lc/anim',
'src/main/res/lc/color',
'src/main/res/lc/values',
'src/main/res/lc/values-en',
'src/main/res/lc/layout']
}
android {
lintOptions {
abortOnError false
}
resourcePrefix "demo_"
}
}
dependencies {
provided fileTree(include: ['*.jar'], dir: 'libs')
// provided fileTree(include: ['*.aar'], dir: 'libs')
api project(':third-zxing')
api "org.greenrobot:eventbus:3.0.0"
api 'com.google.code.gson:gson:2.8.1'
api "com.android.support:recyclerview-v7:27.1.1"
api "com.android.support:support-v4:27.1.1"
api "com.android.support:appcompat-v7:27.1.1"
api "com.android.support:cardview-v7:27.1.1"
api "com.android.support:design:27.1.1"
api 'com.android.support.constraint:constraint-layout:1.1.0'
api files('libs/PullToRefreshListView-release.aar')
api files('libs/DHMobileToolset-1.1.1.aar')
api files('libs/DHScanner-1.0.7.aar')
}
configurations {
all*.exclude group: 'com.google.zxing'
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

21
DeviceAddModule/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mm.android.deviceaddmodule">
<!-- Required 一些系统要求的权限,如访问网络等 -->
<uses-permission android:name="android.permission.INTERNET" /> <!--网络访问-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--允许程序写入外部存储,如SD卡上写文件抓图、录制等-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--程序可以读取设备外部存储空间(内置SDcard和外置SDCard)的文件,我的文件等-->
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> <!--允许程序请求验证从AccountManager-->
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <!--允许改变WiFi多播状态-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!--允许程序显示系统窗口,应该已经不适用了???-->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!--允许程序录制声音通过手机或耳机的麦克,对讲、自定义报警音等-->
<uses-permission android:name="android.permission.CAMERA" /> <!--允许程序访问摄像头进行拍照,二维码扫描补光、拍照上传图片等-->
<uses-permission android:name="android.permission.FLASHLIGHT" /> <!--允许访问闪光灯,二维码扫描补光-->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!--允许程序修改声音设置信息,声波配对,自动调大音量。需求变更之后应该不需要了???-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!--允许程序获取当前WiFi接入的状态以及WLAN热点的信息设备添加何种配网流程使用-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!--允许程序改变WiFi状态配网等-->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 硬件加速对X5视频播放非常重要建议开启 -->
<uses-permission android:name="android.permission.READ_SETTINGS" /> <!--允许程序读取系统设置,声波配对获取当前系统音量等-->
<!-- Optional for location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!--允许一个程序访问CellID或 WiFi热点来获取粗略的位置登陆、设备添加等-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!--允许一个程序访问CellID或 WiFi热点来获取精确的位置登陆、设备添加等-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!--允许应用程序访问额外的位置提供命令,登陆、设备添加等???-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!--允许程序改变网络状态,如是否联网,配网???-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!--允许应用程序请求安装包。针对API大于22必须持有该许可使用ACTION_INSTALL_PACKAGE应用。应该没在用-->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:supportsRtl="true"
android:label="@string/app_name"
tools:replace="android:allowBackup,android:label,android:supportsRtl">
<service android:name=".services.TimeFilterService"/>
<receiver android:name=".receiver.SucceedClickReceiver"/>
<receiver android:name=".receiver.TimeoutClickReceiver"/>
<activity
android:name=".LcnDeviceAddActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:exported="false"
android:label="@string/mobile_common_device"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".device_wifi.DeviceWifiListActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".device_wifi.DeviceWifiPasswordActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".device_wifi.ErrorTipActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden"
android:theme="@style/AppTheme.NoActionBar"/>
<activity
android:name=".device_wifi.HiddenWifiActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan|stateHidden"
android:theme="@style/AppTheme.NoActionBar"/>
<service android:name=".SeachDeviceService"/>
<meta-data
android:name="meta-data4type"
android:value="@string/client_type"
tools:replace="android:value" />
<meta-data
android:name="meta-data4host"
android:value="@string/host" />
<meta-data
android:name="meta-ishttps"
android:value="false" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<activity
android:name=".mobilecommon.base.ProgressActivity"
android:configChanges="orientation|keyboardHidden|screenSize|locale"
android:exported="false"
android:launchMode="singleInstance"
android:screenOrientation="portrait"
android:theme="@style/translucent" />
</application>
</manifest>

View File

@ -0,0 +1,194 @@
<resources>
<string name="!QAZXSW@"></string>
<string name="0000aaaa"></string>
<string name="0123456oo"></string>
<string name="123a123a"></string>
<string name="123admin"></string>
<string name="1qaz2wsx"></string>
<string name="1qaz2wsx3edc"></string>
<string name="1qazXSW@"></string>
<string name="1qazxsw2"></string>
<string name="88809778a"></string>
<string name="ADMIN!@#"></string>
<string name="ADMIN!@#$"></string>
<string name="ROOT!@#$"></string>
<string name="TEST!@#$"></string>
<string name="TEST!@#$%"></string>
<string name="a1234567"></string>
<string name="a123456a"></string>
<string name="aa123123"></string>
<string name="admin123"></string>
<string name="admin1234"></string>
<string name="admin12345"></string>
<string name="admin123456"></string>
<string name="admin12345678"></string>
<string name="admin1314"></string>
<string name="admin222"></string>
<string name="admin234"></string>
<string name="admin333"></string>
<string name="admin444"></string>
<string name="admin456"></string>
<string name="admin555"></string>
<string name="admin888"></string>
<string name="admin@(eyou)"></string>
<string name="bs88132756"></string>
<string name="content2pub"></string>
<string name="dlr123456"></string>
<string name="eyou_admin"></string>
<string name="fujun740115"></string>
<string name="gbk88259894"></string>
<string name="gsqajj88259588"></string>
<string name="hz@123456"></string>
<string name="kqjd123456"></string>
<string name="pass123456"></string>
<string name="qq123456"></string>
<string name="qwer1234"></string>
<string name="qwer@1234"></string>
<string name="syf123456"></string>
<string name="test1314"></string>
<string name="wangda716"></string>
<string name="wood0410"></string>
<string name="xwl671118"></string>
<string name="zzb88259815"></string>
<string name="admin@123"></string>
<string name="Test@123"></string>
<string name="Test1234"></string>
<string name="p@assword"></string>
<string name="wang1234"></string>
<string name="trustno1"></string>
<string name="passw0rd"></string>
<string name="1qa2ws3ed"></string>
<string name="!QAZASDF"></string>
<string name="6t5r4e3w2q"></string>
<string name="power123"></string>
<string name="!@#qweASD0"></string>
<string name="abcd4321"></string>
<string name="abcd54321"></string>
<string name="aa12345678"></string>
<string name="1230!@#$"></string>
<string name="123!@#abc"></string>
<string name="1q2w3e4r5t6y"></string>
<string name="q1w2e3r4t5"></string>
<string name="1234!@#$"></string>
<string name="!@#123456!@#"></string>
<string name="qwe123456qwe"></string>
<string name="abc777888"></string>
<string name="abc888999"></string>
<string name="abcabcd1234"></string>
<string name="abc!@#456"></string>
<string name="qq7758520"></string>
<string name="qq5201314"></string>
<string name="qq1314520"></string>
<string name="qweqwer12345"></string>
<string name="12345qwert"></string>
<string name="1q2w3e4r"></string>
<string name="aaaaa22222"></string>
<string name="aaaaa33333"></string>
<string name="aaaaa44444"></string>
<string name="aaaaa55555"></string>
<string name="aaaaa66666"></string>
<string name="aaaaa77777"></string>
<string name="aaaaa88888"></string>
<string name="aaaaa99999"></string>
<string name="aaaaa00000"></string>
<string name="bbbbb11111"></string>
<string name="bbbbb22222"></string>
<string name="bbbbb33333"></string>
<string name="bbbbb44444"></string>
<string name="bbbbb55555"></string>
<string name="bbbbb66666"></string>
<string name="bbbbb77777"></string>
<string name="bbbbb88888"></string>
<string name="bbbbb99999"></string>
<string name="bbbbb00000"></string>
<string name="admin88888"></string>
<string name="admin66666"></string>
<string name="00EEEE9E4BA2"></string>
<string name="0027193A2F60"></string>
<string name="00EEEE9E4B"></string>
<string name="0027193A2F"></string>
<string name="a1b2c3d4e5"></string>
<string name="a123456789"></string>
<string name="b123456789"></string>
<string name="c123456789"></string>
<string name="d123456789"></string>
<string name="e123456789"></string>
<string name="f123456789"></string>
<string name="g123456789"></string>
<string name="h123456789"></string>
<string name="i123456789"></string>
<string name="j123456789"></string>
<string name="k123456789"></string>
<string name="l123456789"></string>
<string name="m123456789"></string>
<string name="n123456789"></string>
<string name="o123456789"></string>
<string name="p123456789"></string>
<string name="q123456789"></string>
<string name="r123456789"></string>
<string name="s123456789"></string>
<string name="t123456789"></string>
<string name="u123456789"></string>
<string name="v123456789"></string>
<string name="w123456789"></string>
<string name="x123456789"></string>
<string name="y123456789"></string>
<string name="z123456789"></string>
<string name="password1"></string>
<string name="password11"></string>
<string name="password12"></string>
<string name="password22"></string>
<string name="password00"></string>
<string name="password99"></string>
<string name="password66"></string>
<string name="password88"></string>
<string name="password68"></string>
<string name="alpha-wlan"></string>
<string name="link3a2f6o"></string>
<string name="LINK3A2F60"></string>
<string name="abcd123456"></string>
<string name="62696e676f"></string>
<string name="25802580ab"></string>
<string name="abcd1234"></string>
<string name="abcde12345"></string>
<string name="aaaaa11111"></string>
<string name="1A2B3C4D5E"></string>
<string name="64696E6777"></string>
<string name="113414129A"></string>
<string name="123456789a"></string>
<string name="123456789b"></string>
<string name="123456789c"></string>
<string name="123456789d"></string>
<string name="123456789e"></string>
<string name="123456789f"></string>
<string name="123456789g"></string>
<string name="123456789h"></string>
<string name="123456789i"></string>
<string name="123456789j"></string>
<string name="123456789k"></string>
<string name="123456789l"></string>
<string name="123456789m"></string>
<string name="123456789n"></string>
<string name="123456789o"></string>
<string name="123456789p"></string>
<string name="123456789q"></string>
<string name="123456789r"></string>
<string name="123456789s"></string>
<string name="123456789t"></string>
<string name="123456789u"></string>
<string name="123456789v"></string>
<string name="123456789w"></string>
<string name="123456789x"></string>
<string name="123456789y"></string>
<string name="123456789z"></string>
<string name="12345ABCDE"></string>
<string name="admin3388"></string>
<string name="admin8888"></string>
<string name="admin4488"></string>
<string name="admin4567"></string>
<string name="y888888888"></string>
<string name="%username%"></string>
<string name="!@#$%^&amp;"></string>
<string name="eeee9e4ba2"></string>
<string name="1234qwer"></string>
</resources>

View File

@ -0,0 +1,68 @@
package com.mm.android.deviceaddmodule;
import android.app.Application;
import java.io.Serializable;
public class CommonParam implements Serializable {
private Application context;
private String userId;
private String appId;
private String appSecret;
private String envirment= "";
public String getEnvirment() {
return envirment;
}
public void setEnvirment(String envirment) {
this.envirment = envirment;
}
public Application getContext() {
return context;
}
public void setContext(Application context) {
this.context = context;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getAppSecret() {
return appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void checkParam() throws Exception {
if (context == null) {
throw new Exception("context must not null");
}
if (appId == null || appId.isEmpty()) {
throw new Exception("appId must not empty");
}
if (appSecret == null || appSecret.isEmpty()) {
throw new Exception("appSecret must not empty");
}
}
}

View File

@ -0,0 +1,145 @@
package com.mm.android.deviceaddmodule;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import com.lechange.opensdk.api.InitParams;
import com.lechange.opensdk.api.LCOpenSDK_Api;
import com.lechange.opensdk.device.LCOpenSDK_DeviceInit;
import com.mm.android.deviceaddmodule.device_wifi.CurWifiInfo;
import com.mm.android.deviceaddmodule.device_wifi.DeviceWifiListActivity;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessException;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.EnvironmentConfig;
import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
import com.mm.android.deviceaddmodule.openapi.CONST;
import com.mm.android.deviceaddmodule.openapi.DeviceAddOpenApiManager;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.zxing.ContextHelper;
import static com.mm.android.deviceaddmodule.device_wifi.DeviceConstant.IntentCode.DEVICE_SETTING_WIFI_LIST;
/**
* 添加设备组件 唯一入口
*/
public class LCDeviceEngine {
private boolean sdkHasInit = false;
private volatile static LCDeviceEngine lcDeviceEngine;
public String accessToken;
private Throwable throwable;
public CommonParam commonParam;
public String userId = "";
public static LCDeviceEngine newInstance() {
if (lcDeviceEngine == null) {
synchronized (LCDeviceEngine.class) {
if (lcDeviceEngine == null) {
lcDeviceEngine = new LCDeviceEngine();
}
}
}
return lcDeviceEngine;
}
public boolean init(CommonParam commonParam, String token) throws Throwable {
this.commonParam = commonParam;
this.accessToken = token;
this.userId = "";
this.sdkHasInit = false;
if (commonParam == null) {
throw new Exception("commonParam must not null");
}
//参数校验
commonParam.checkParam();
//初始化参数
initParam(commonParam);
//获取开放平台token
// initToken(token);
if (TextUtils.isEmpty(accessToken)) {
throw throwable;
}
//组件初始化
//LCOpenSDK_Api.setHost(CONST.HOST.replace("https://", ""), accessToken);
InitParams initParams = new InitParams(commonParam.getContext(), CONST.HOST.replace("https://", ""), accessToken);
LCOpenSDK_Api.initOpenApi(initParams);
LCOpenSDK_DeviceInit.getInstance();
sdkHasInit = true;
return true;
}
public void addDevice(Activity activity) throws Exception {
if (!sdkHasInit) {
throw new Exception("not init");
}
//开启添加页面
activity.startActivity(new Intent(commonParam.getContext(), LcnDeviceAddActivity.class));
}
public boolean deviceOnlineChangeNet(Activity activity, DHDevice device, CurWifiInfo wifiInfo) {
if (!sdkHasInit) {
return false;
}
//开启设备在线配网
Intent intent = new Intent(commonParam.getContext(), DeviceWifiListActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("DHDEVICE_INFO", device);
bundle.putSerializable("DEVICE_CURRENT_WIFI_INFO", wifiInfo);
intent.putExtras(bundle);
activity.startActivityForResult(intent, DEVICE_SETTING_WIFI_LIST);
return true;
}
private String initToken(final String token) {
/*Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// accessToken = DeviceAddOpenApiManager.getToken();
accessToken = token;
} catch (BusinessException e) {
throwable = new Throwable(e.errorDescription);
}
}
});
try {
thread.start();
thread.join(4000);
} catch (InterruptedException e) {
throwable = e;
}*/
return token;
}
private void initParam(CommonParam commonParam) throws Exception {
userId = TextUtils.isEmpty(commonParam.getUserId()) ? commonParam.getAppId() : commonParam.getUserId();
//传入参数 AppId SecretKey 环境切换
CONST.makeEnv(commonParam.getEnvirment(), commonParam.getAppId(), commonParam.getAppSecret());
ContextHelper.init(commonParam.getContext());
new EnvironmentConfig.Builder().setContext(commonParam.getContext()).build();
initImageLoader(commonParam.getContext());
}
private void initImageLoader(Context context) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2).threadPoolSize(3)
.tasksProcessingOrder(QueueProcessingType.LIFO)
.memoryCache(new LruMemoryCache((int) (Runtime.getRuntime().maxMemory() / 16)))
.memoryCacheExtraOptions(600, 400)
.diskCacheExtraOptions(600, 400, null).diskCacheSize(50 * 1024 * 1024)
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.imageDownloader(new BaseImageDownloader(context))
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
}
}

View File

@ -0,0 +1,527 @@
package com.mm.android.deviceaddmodule;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.contract.DeviceAddConstract;
import com.mm.android.deviceaddmodule.event.DeviceAddEvent;
import com.mm.android.deviceaddmodule.helper.DeviceAddHelper;
import com.mm.android.deviceaddmodule.helper.PageNavigationHelper;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.base.BaseFragment;
import com.mm.android.deviceaddmodule.mobilecommon.base.BaseFragmentActivity;
import com.mm.android.deviceaddmodule.mobilecommon.base.DefaultPermissionListener;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.common.PermissionHelper;
import com.mm.android.deviceaddmodule.mobilecommon.dialog.LCAlertDialog;
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
import com.mm.android.deviceaddmodule.mobilecommon.eventbus.event.BaseEvent;
import com.mm.android.deviceaddmodule.mobilecommon.eventbus.event.CommonEvent;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import com.mm.android.deviceaddmodule.mobilecommon.widget.CommonTitle;
import com.mm.android.deviceaddmodule.model.DeviceAddModel;
import com.mm.android.deviceaddmodule.p_ap.ApBindSuccessFragment;
import com.mm.android.deviceaddmodule.p_ap.ApPairFragment;
import com.mm.android.deviceaddmodule.p_bindsuccess.BindSuccessFragment;
import com.mm.android.deviceaddmodule.p_cloudconnect.CloudConnectFragment;
import com.mm.android.deviceaddmodule.p_devlogin.DevLoginFragment;
import com.mm.android.deviceaddmodule.p_devlogin.DevSecCodeFragment;
import com.mm.android.deviceaddmodule.p_errortip.ErrorTipFragment;
import com.mm.android.deviceaddmodule.p_init.InitFragment;
import com.mm.android.deviceaddmodule.p_init.SecurityCheckFragment;
import com.mm.android.deviceaddmodule.p_softap.DevWifiListFragment;
import com.mm.android.deviceaddmodule.p_softap.oversea.SoftApResultFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.SmartConfigFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.WifiPwdFragment;
import com.mm.android.deviceaddmodule.presenter.DeviceAddPresenter;
import com.mm.android.deviceaddmodule.views.popwindow.BasePopWindow;
import com.mm.android.deviceaddmodule.views.popwindow.PopWindowFactory;
import org.greenrobot.eventbus.EventBus;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static com.mm.android.deviceaddmodule.mobilecommon.common.Constants.PERMISSION_REQUEST_ID;
/**
* 添加设备主界面各功能模块以Fragment形式依附于此类
*/
public class LcnDeviceAddActivity extends BaseFragmentActivity implements DeviceAddConstract.View, CommonTitle.OnTitleClickListener {
public static final String TAG = "LcnDeviceAddActivity";
private CommonTitle mTitle; //标题栏
DeviceAddConstract.Presenter mPresenter;
private final String STOP_ADD_DIALOG = "stop_add_dialog";
LCAlertDialog mLCAlertDialog;
PopWindowFactory mPopWindowFactory;
BasePopWindow mMoreOptionPopWindow, mLoadingPopWindow, mTypeChosePopWindow;
private DefaultPermissionListener defaultPermissionListener;
private PermissionHelper permissionHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_lcadd);
initView();
initData();
}
//接收EventBus消息
@Override
public void onMessageEvent(BaseEvent event) {
super.onMessageEvent(event);
if (event instanceof DeviceAddEvent) {
String code = event.getCode();
if (DeviceAddEvent.CONFIG_PAGE_NAVIGATION_ACTION.equals(code)) {
mPresenter.dispatchPageNavigation();
} else if (DeviceAddEvent.CHANGE_TO_WIRELESS_ACTION.equals(code)) {
mPresenter.changeToWireless();
} else if (DeviceAddEvent.CHANGE_TO_WIRED_ACTION.equals(code)) {
mPresenter.changeToWired();
} else if (DeviceAddEvent.CHANGE_TO_SOFTAP_ACTION.equals(code)) {
mPresenter.changeToSoftAp();
} else if (DeviceAddEvent.TITLE_MODE_ACTION.equals(code)) {
Bundle bundle = ((DeviceAddEvent) event).getBundle();
String titleMode = bundle.getString(DeviceAddEvent.KEY.TITLE_MODE);
mPresenter.setCurTitleMode(titleMode);
dispatchTitle(titleMode);
} else if (DeviceAddEvent.SHOW_LOADING_VIEW_ACTION.equals(code)) {
synchronized (LcnDeviceAddActivity.this) {
if (mLoadingPopWindow != null && !this.isFinishing()) {
if (!mLoadingPopWindow.isShowing()) {
mLoadingPopWindow.showAsDropDown(mTitle);
}
} else if (!this.isFinishing() && hasWindowFocus()) {
mLoadingPopWindow = mPopWindowFactory.createPopWindow(this, mTitle, PopWindowFactory.PopWindowType.LOADING);
}
}
} else if (DeviceAddEvent.DISMISS_LOADING_VIEW_ACTION.equals(code)) {
synchronized (LcnDeviceAddActivity.this) {
LogUtil.debugLog(TAG, "LoadingDismiss-->" + mLoadingPopWindow);
if (mLoadingPopWindow != null) {
mLoadingPopWindow.dismiss();
}
}
} else if (DeviceAddEvent.DESTROY_ACTION.equals(code)) {
destroy();
} else if (DeviceAddEvent.OFFLINE_CONFIG_SUCCESS_ACTION.equals(code)) {
offlineConfigSucceed();
} else if (DeviceAddEvent.SOFTAP_REFRSH_WIFI_LIST_DISABLE_ACTION.equals(code)) {
mTitle.setEnabled(false, CommonTitle.ID_RIGHT);
} else if (DeviceAddEvent.SOFTAP_REFRSH_WIFI_LIST_ENABLE_ACTION.equals(code)) {
mTitle.setEnabled(true, CommonTitle.ID_RIGHT);
} else if (DeviceAddEvent.SHOW_TYPE_CHOSE_ACTION.equals(code)) {
mTypeChosePopWindow = mPopWindowFactory.createPopWindow(this, mTitle, PopWindowFactory.PopWindowType.CHOSETYPE);
}
}
}
//初始化页面布局
private void initView() {
mPopWindowFactory = new PopWindowFactory();
initTitle();
}
private void initTitle() {
mTitle = findViewById(R.id.title);
mTitle.initView(R.drawable.mobile_common_title_back, 0, R.string.add_device_title);
mTitle.setOnTitleClickListener(this);
}
//初始化页面数据
private void initData() {
mPresenter = new DeviceAddPresenter(this);
mPresenter.dispatchIntentData(getIntent());
permissionHelper = new PermissionHelper(this);
defaultPermissionListener = new DefaultPermissionListener() {
@Override
public void onGranted() {
mPresenter.getGPSLocation();
}
@Override
public boolean onDenied() {
mPresenter.getGPSLocation();
return true;
}
};
permissionHelper.requestPermissions(new String[]{
ACCESS_COARSE_LOCATION,
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, defaultPermissionListener);
}
//动态权限申请回调
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_ID) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (defaultPermissionListener != null) {
defaultPermissionListener.onGranted();
}
} else {
if (defaultPermissionListener != null && permissionHelper != null) {
if (!defaultPermissionListener.onDenied()) { //返回false默认处理向用户说明权限的必要性并引导
permissionHelper.gotoSettingPage(permissions, defaultPermissionListener);
}
}
}
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter = null;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
if (curFragment != null) {
curFragment.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onBackPressed() {
goBack();
}
private void goBack() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
int entryCount = getSupportFragmentManager().getBackStackEntryCount();
boolean isWifiOfflineMode = DeviceAddModel.newInstance().getDeviceInfoCache().isWifiOfflineMode();
if (curFragment == null
|| entryCount <= 0
|| (isWifiOfflineMode && entryCount == 1)
|| curFragment instanceof ApBindSuccessFragment) {
if (mLoadingPopWindow != null) {
mLoadingPopWindow.dismiss();
}
if (curFragment instanceof ApBindSuccessFragment) {
if (ProviderManager.getAppProvider().getAppType() == LCConfiguration.APP_LECHANGE_OVERSEA) {
showStopDevAddDialog(true);
}
return;
}
destroy();
} else {
if (curFragment instanceof CloudConnectFragment
|| curFragment instanceof InitFragment
|| curFragment instanceof DevLoginFragment
|| curFragment instanceof DevSecCodeFragment
|| curFragment instanceof SmartConfigFragment
|| curFragment instanceof DevWifiListFragment
|| curFragment instanceof SoftApResultFragment
|| curFragment instanceof SecurityCheckFragment
|| curFragment instanceof ApPairFragment) {//以上界面退出需二次确认
showStopDevAddDialog(curFragment instanceof ApPairFragment);
} else {
if (!((BaseFragment) curFragment).onBackPressed()) {//子类未消耗返回事件
if (curFragment instanceof ErrorTipFragment) {
showStopDevAddDialog(false);
return;
} else if (curFragment instanceof BindSuccessFragment) {
destroy();
return;
}
if (mLoadingPopWindow != null) {
mLoadingPopWindow.dismiss();
}
//从输入wifi密码页面返回统一回到电源页面
if (curFragment instanceof WifiPwdFragment) {
getSupportFragmentManager().popBackStackImmediate(PageNavigationHelper.TIP_POWER_FRAGMENT_TAG, 0);
return;
}
getSupportFragmentManager().popBackStack(); //退回到上个界面
}
}
}
}
private void dispatchTitle(String titleMode) {
mTitle.setVisibleRight(View.VISIBLE);
if (DeviceAddHelper.TitleMode.MORE.name().equals(titleMode)
|| DeviceAddHelper.TitleMode.MORE2.name().equals(titleMode)
|| DeviceAddHelper.TitleMode.MORE3.name().equals(titleMode)
|| DeviceAddHelper.TitleMode.MORE4.name().equals(titleMode)) {
mTitle.setIconRight(R.drawable.common_icon_nav_more);
} else if (DeviceAddHelper.TitleMode.REFRESH.name().equals(titleMode)) {
mTitle.setIconRight(R.drawable.common_image_nav_refresh_selector);
} else if (DeviceAddHelper.TitleMode.SHARE.name().equals(titleMode)) {
mTitle.setTitleCenter(R.string.mobile_common_device);
mTitle.setIconRight(R.drawable.mobile_common_share_selector);
boolean isOversea = ProviderManager.getAppProvider().getAppType() == LCConfiguration.APP_LECHANGE_OVERSEA;
boolean canBeShare = mPresenter.canBeShare();
mTitle.setVisibleRight(isOversea && canBeShare ? View.VISIBLE : View.GONE);
} else if (DeviceAddHelper.TitleMode.FREE_CLOUD_STORAGE.name().equals(titleMode)) {
mTitle.setVisibleLeft(View.GONE);
mTitle.setVisibleRight(View.GONE);
} else if (DeviceAddHelper.TitleMode.MODIFY_DEVICE_NAME.name().equals(titleMode)) {
mTitle.setTitleCenter(R.string.mobile_common_modify_device_pwd);
mTitle.setVisibleRight(View.GONE);
} else {
mTitle.setIconRight(0);
}
}
/**
* 停止添加流程提示框
*/
private void showStopDevAddDialog(final boolean isExitApAdd) {
dismissLCAlertDialog();
LCAlertDialog.Builder builder = new LCAlertDialog.Builder(this);
builder.setTitle(R.string.add_device_confrim_to_quit);
builder.setMessage(R.string.add_device_not_complete_tip);
builder.setCancelButton(R.string.common_cancel, null);
builder.setConfirmButton(R.string.common_confirm,
new LCAlertDialog.OnClickListener() {
@Override
public void onClick(LCAlertDialog dialog, int which,
boolean isChecked) {
destroy();
}
});
mLCAlertDialog = builder.create();
mLCAlertDialog.show(getSupportFragmentManager(),
STOP_ADD_DIALOG);
}
private void dismissLCAlertDialog() {
if (mLCAlertDialog != null && mLCAlertDialog.isVisible()) {
mLCAlertDialog.dismissAllowingStateLoss();
mLCAlertDialog = null;
}
}
@Override
public void onCommonTitleClick(int id) {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
switch (id) {
case CommonTitle.ID_LEFT:
goBack();
break;
case CommonTitle.ID_RIGHT: {
if (mPresenter.getCurTitleMode().equals(DeviceAddHelper.TitleMode.MORE.name())) {
mMoreOptionPopWindow = mPopWindowFactory.createPopWindow(this, mTitle, PopWindowFactory.PopWindowType.OPTION1);
} else if (mPresenter.getCurTitleMode().equals(DeviceAddHelper.TitleMode.MORE2.name())) {
mMoreOptionPopWindow = mPopWindowFactory.createPopWindow(this, mTitle, PopWindowFactory.PopWindowType.OPTION2);
} else if (mPresenter.getCurTitleMode().equals(DeviceAddHelper.TitleMode.MORE3.name())) {
mMoreOptionPopWindow = mPopWindowFactory.createPopWindow(this, mTitle, PopWindowFactory.PopWindowType.OPTION3);
} else if (mPresenter.getCurTitleMode().equals(DeviceAddHelper.TitleMode.MORE4.name())) {
mMoreOptionPopWindow = mPopWindowFactory.createPopWindow(this, mTitle, PopWindowFactory.PopWindowType.OPTION4);
} else if (mPresenter.getCurTitleMode().equals(DeviceAddHelper.TitleMode.REFRESH.name())) {
EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.SOFTAP_REFRSH_WIFI_LIST));
} else if (mPresenter.getCurTitleMode().equals(DeviceAddHelper.TitleMode.SHARE.name())) {
mPresenter.getDeviceShareInfo();
}
}
}
}
@Override
public Context getContextInfo() {
return this;
}
@Override
public boolean isViewActive() {
return !isActivityDestory();
}
@Override
public void showToastInfo(String msg) {
toast(msg);
}
@Override
public void showToastInfo(int msgId) {
toast(msgId);
}
@Override
public void showProgressDialog() {
EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.SHOW_LOADING_VIEW_ACTION));
}
@Override
public void cancelProgressDialog() {
EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.DISMISS_LOADING_VIEW_ACTION));
}
@Override
public void setTitle(int titleId) {
mTitle.setTitleCenter(titleId);
}
@Override
public void goScanPage() {
PageNavigationHelper.gotoScanPage(this);
}
@Override
public void goDispatchPage() {
PageNavigationHelper.gotoDispatchPage(this);
}
@Override
public void goHubPairPage(String sn, String hubType) {
PageNavigationHelper.gotoHubGuide1Page(this, sn, hubType);
}
@Override
public void goApConfigPage(boolean hasSelecteGateway) {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoGatewayListPage(curFragment, hasSelecteGateway);
}
@Override
public void goTypeChoosePage() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoTypeChoosePage(curFragment);
}
@Override
public void goWiredwirelessPage(boolean isWifi) {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoPowerTipPage(curFragment, isWifi);
}
@Override
public void goWiredwirelessPageNoAnim(boolean isWifi) {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoPowerTipPageNoAnim(curFragment, isWifi);
}
@Override
public void goSoftApPage() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoSoftApTipPage(curFragment);
}
@Override
public void goSoftApPageNoAnim() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoSoftApTipPageNoAnim(curFragment);
}
@Override
public void goNBPage() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoNBTipPage(curFragment);
}
@Override
public void goIMEIInputPage() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoIMEIInputPage(curFragment);
}
@Override
public void goNotSupportBindTipPage() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoErrorTipPage(curFragment, DeviceAddHelper.ErrorCode.DEVICE_BIND_ERROR_NOT_SUPPORT_TO_BIND);
}
@Override
public void goLocationPage() {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoLocationTipPage(curFragment);
}
@Override
public void goOfflineConfigPage(String sn, String devModelName, String imei) {
PageNavigationHelper.gotoOfflineConfigPage(this, sn, devModelName, imei);
}
@Override
public void gotoDeviceSharePage(String sn) {
PageNavigationHelper.gotoDeviceSharePage(this, sn);
}
@Override
public void goInitPage(DEVICE_NET_INFO_EX device_net_info_ex) {
final Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoInitPage(curFragment, device_net_info_ex);
}
@Override
public void goCloudConnetPage() {
Fragment curFragment = getSupportFragmentManager().findFragmentById(R.id.content);
PageNavigationHelper.gotoCloudConnectPage(curFragment);
}
@Override
public void completeAction(boolean isAp) {
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
boolean isDeviceDetail = deviceAddInfo.isDeviceDetail();
String code = CommonEvent.AP_PAIR_SUCCEED_2_MAIN_ACTION;
if (isDeviceDetail) {
code = CommonEvent.AP_PAIR_SUCCEED_2_MID_ACTION;
}
if (isAp && deviceAddInfo.getGatewayInfo() != null) {
String deviceId = deviceAddInfo.getGatewayInfo().getSn();
String apId = deviceAddInfo.getDeviceSn();
Bundle bundle = new Bundle();
bundle.putString(LCConfiguration.Device_ID, deviceId);
bundle.putString(LCConfiguration.AP_ID, apId);
CommonEvent commonEvent = new CommonEvent(code);
commonEvent.setBundle(bundle);
EventBus.getDefault().post(commonEvent);
}
destroy();
if (!isDeviceDetail) {
ProviderManager.getDeviceAddCustomProvider().goHomePage(getContextInfo());
}
}
/**
* 跳转到蓝牙模块
*/
public void gotoAddBleLockPage(Bundle bundle) {
PageNavigationHelper.gotoAddBleLockPage(bundle);
destroy();
}
// 主动释放资源结束activity而不依赖于onDestroy方法来释放资源onDestroy方法时机不可控
private void destroy() {
finish();
mPresenter.uninit();
if (mLoadingPopWindow != null) {
if (mLoadingPopWindow.isShowing()) {
mLoadingPopWindow.dismiss();
}
mLoadingPopWindow = null;
}
}
// 离线配网成功返回上一级页面
private void offlineConfigSucceed() {
setResult(RESULT_OK);
finish();
mPresenter.uninit();
}
}

View File

@ -0,0 +1,182 @@
package com.mm.android.deviceaddmodule;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import com.company.NetSDK.CB_fSearchDevicesCB;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.company.NetSDK.INetSDK;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
import com.mm.android.deviceaddmodule.model.DeviceAddModel;
import java.util.concurrent.CopyOnWriteArrayList;
public class SeachDeviceService extends Service {
public static final int SEND_START = 1;
public static final String TAG = "SeachDeviceService";
private long mLRet;
private CopyOnWriteArrayList<SearchDeviceManager.ISearchDeviceListener> mListenerList;
long lastReceiveTime = 0;
private BroadcastReceiver mReceiver;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (!SearchDeviceManager.getInstance().mIsExist) return;
if (System.currentTimeMillis() - lastReceiveTime > 2000) {
handler.removeMessages(SEND_START);
handler.removeCallbacks(searchRunnable);
handler.postDelayed(searchRunnable, 500); //若2S内没有再搜索到设备则重新开始搜索
} else {
handler.removeMessages(SEND_START);
handler.sendEmptyMessageDelayed(SEND_START, 500);
}
}
};
Runnable searchRunnable = new Runnable() {
@Override
public void run() {
SearchDeviceManager.getInstance().removeInvalidDevice();
if (mLRet != 0) {
stopSearchDevices();
}
mLRet = INetSDK.StartSearchDevices(new CB_fSearchDevicesCB() {
@Override
public void invoke(DEVICE_NET_INFO_EX device_net_info_ex) {
lastReceiveTime = System.currentTimeMillis();
if (device_net_info_ex != null) {
String szSerialNo = new String(device_net_info_ex.szSerialNo).trim();
if (device_net_info_ex.iIPVersion == 4 && mListenerList != null) {
for (int i = 0; i < mListenerList.size(); i++) {
SearchDeviceManager.ISearchDeviceListener listener = mListenerList.get(i);
if (listener != null) {
listener.onDeviceSearched(szSerialNo, device_net_info_ex);
}
}
}
}
}
});
if (System.currentTimeMillis() - lastReceiveTime > 500) {
handler.removeMessages(SEND_START);
handler.removeCallbacks(searchRunnable);
handler.postDelayed(searchRunnable, 2000); //若2S内没有再搜索到设备则重新开始搜索
} else {
handler.removeMessages(SEND_START);
handler.sendEmptyMessageDelayed(SEND_START, 500);
}
if (mLRet == 0) {
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
}
}
};
@Override
public void onCreate() {
super.onCreate();
mListenerList = new CopyOnWriteArrayList<>();
// 注册广播监听器监听网络变化
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(LCConfiguration.CONNECTIVITY_CHAGET_ACTION);
mReceiver = new Broadcast();
registerReceiver(mReceiver, intentFilter);
}
@Override
public IBinder onBind(Intent intent) {
return new SearchDeviceBinder();
}
/**
* 局域网内搜索设备信息
*/
private void startSearchDevices() {
handler.removeCallbacks(searchRunnable);
handler.post(searchRunnable);
}
/**
* 停止搜索
*/
private void stopSearchDevicesAsync() {
handler.removeCallbacks(searchRunnable);
if (mLRet != 0) {
ProviderManager.getDeviceAddProvider().stopSearchDevicesAsync(mLRet, null);
}
}
private void stopSearchDevices() {
handler.removeCallbacks(searchRunnable);
if (mLRet != 0) {
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
ProviderManager.getDeviceAddProvider().stopSearchDevices(mLRet, deviceAddInfo.getRequestId());
}
}
private void registerListener(SearchDeviceManager.ISearchDeviceListener listener) {
if (mListenerList != null && !mListenerList.contains(listener)) {
mListenerList.add(listener);
}
}
private void unRegisterListener(SearchDeviceManager.ISearchDeviceListener listener) {
if (mListenerList != null && mListenerList.contains(listener)) {
mListenerList.remove(listener);
}
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
stopSearchDevicesAsync();
if (mListenerList != null) {
mListenerList.clear();
}
mListenerList = null;
}
public class SearchDeviceBinder extends Binder {
public void startSearchDevices() {
SeachDeviceService.this.startSearchDevices();
}
public void stopSearchDevicesAsync() {
SeachDeviceService.this.stopSearchDevicesAsync();
}
public void stopSearchDevices() {
SeachDeviceService.this.stopSearchDevices();
}
public void registerListener(SearchDeviceManager.ISearchDeviceListener listener) {
SeachDeviceService.this.registerListener(listener);
}
public void unRegisterListener(SearchDeviceManager.ISearchDeviceListener listener) {
SeachDeviceService.this.unRegisterListener(listener);
}
}
private class Broadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (LCConfiguration.CONNECTIVITY_CHAGET_ACTION.equals(intent.getAction())) {
SearchDeviceManager.getInstance().clearDevice();
startSearchDevices();
}
}
}
}

View File

@ -0,0 +1,224 @@
package com.mm.android.deviceaddmodule;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.text.TextUtils;
import com.company.NetSDK.CB_fSDKLogCallBack;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.entity.DeviceNetInfo;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 搜索局域网内设备信息的管理类
*/
public class SearchDeviceManager {
private static final String TAG = "SeachDeviceService";
private static volatile SearchDeviceManager sInstance;
private volatile ConcurrentHashMap<String, DeviceNetInfo> mDeviceNetInfos = new ConcurrentHashMap<>();
private SeachDeviceService.SearchDeviceBinder searchDevice;
private ISearchDeviceListener mListener;
boolean mIsConnected; //service是否已连接
private LogCallBack mLogCallBack;
private SearchDeviceManager() {
mListener = new SearchDeviceImpl();
mDeviceNetInfos = new ConcurrentHashMap<>();
mLogCallBack = new LogCallBack();
}
public static SearchDeviceManager getInstance() {
if (sInstance == null) {
synchronized (SearchDeviceManager.class) {
if (sInstance == null) {
sInstance = new SearchDeviceManager();
}
}
}
return sInstance;
}
public synchronized void connnectService() {
if(!mIsConnected){
Intent intent = new Intent(ProviderManager.getAppProvider().getAppContext(), SeachDeviceService.class);
mIsConnected = ProviderManager.getAppProvider().getAppContext().bindService(intent, mBinderPoolConnection, Context.BIND_AUTO_CREATE);
}
if(!mIsExist)mIsExist = true;
}
private ServiceConnection mBinderPoolConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
LogUtil.debugLog(TAG, "onServiceConnected");
searchDevice = (SeachDeviceService.SearchDeviceBinder) arg1;
if (searchDevice != null) {
try {
searchDevice.linkToDeath(mBinderPoolDeathRecipient, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
registerListener(mListener);
startSearch();
}
};
private IBinder.DeathRecipient mBinderPoolDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
LogUtil.debugLog(TAG, "binderDied");
if (searchDevice != null) {
searchDevice.unlinkToDeath(mBinderPoolDeathRecipient, 0);
searchDevice = null;
}
connnectService();
}
};
public void registerListener(ISearchDeviceListener listener) {
if (searchDevice != null) {
searchDevice.registerListener(listener);
}
}
public void unRegisterListener(ISearchDeviceListener listener) {
if (searchDevice != null) {
searchDevice.unRegisterListener(listener);
}
}
private void stopSearch() {
if (searchDevice != null) {
searchDevice.stopSearchDevicesAsync();
if(mIsConnected){
ProviderManager.getAppProvider().getAppContext().unbindService(mBinderPoolConnection);
mIsConnected = false;
}
}
}
public synchronized DEVICE_NET_INFO_EX getDeviceNetInfo(String snCode) {
if (TextUtils.isEmpty(snCode))
return null;
if (mDeviceNetInfos != null&&mDeviceNetInfos.get(snCode)!=null) {
return mDeviceNetInfos.get(snCode).getDevNetInfoEx();
}
return null;
}
/**
* 搜索
*/
public synchronized void startSearch() {
removeInvalidDevice();
if (searchDevice != null) {
connnectService();
searchDevice.startSearchDevices();
}
}
public synchronized void clearDevice() {
if (mDeviceNetInfos != null) {
mDeviceNetInfos.clear();
LogUtil.debugLog(TAG, "clear");
}
}
/**
* 列表中移除无效的设备信息
*/
public synchronized void removeInvalidDevice() {
if (mDeviceNetInfos != null) {
LogUtil.debugLog(TAG, "removeInvalidDevice " + mDeviceNetInfos);
for (Map.Entry<String, DeviceNetInfo> entry : mDeviceNetInfos.entrySet()) {
if (entry.getValue() != null) {
if (!entry.getValue().isValid()) {
// 移除无效的DeviceNetInfo
mDeviceNetInfos.remove(entry.getKey());
LogUtil.debugLog(TAG, "remove " + entry.getKey());
} else {
// 将标志位重置
entry.getValue().setValid(false);
}
}
}
LogUtil.debugLog(TAG, "removeInvalidDevice " + mDeviceNetInfos);
}
}
volatile boolean mIsExist = false;
/**
* 释放资源
*/
public synchronized void checkSearchDeviceServiceDestory() {
stopSearch();
unRegisterListener(mListener);
clearDevice();
mIsExist = false;
}
public synchronized boolean checkSearchDeviceServiceIsExist() {
return mIsExist;
}
private class SearchDeviceImpl implements ISearchDeviceListener {
@Override
public void onDeviceSearched(String sncode, DEVICE_NET_INFO_EX info) {
if (mDeviceNetInfos != null) {
DeviceNetInfo deviceNetInfo=new DeviceNetInfo(info);
mDeviceNetInfos.put(sncode, deviceNetInfo);
LogUtil.debugLog(TAG, "onDeviceSearched " + mDeviceNetInfos);
}
}
}
public interface ISearchDeviceListener {
void onDeviceSearched(String sncode, DEVICE_NET_INFO_EX info);
}
private class LogCallBack implements CB_fSDKLogCallBack{
@Override
public int invoke(byte[] bytes, int length) {
String netSDKLog = new String(bytes).trim();
LogUtil.debugLog(TAG, netSDKLog);
String type = "";
String content = "";
try {
JSONObject jsonObject = new JSONObject(netSDKLog);
type = jsonObject.optString("type");
content = jsonObject.optString("log");
LogUtil.debugLog(TAG, "type : " + type + " content : " + content);
} catch (JSONException e) {
e.printStackTrace();
}
return 0;
}
}
}

View File

@ -0,0 +1,53 @@
package com.mm.android.deviceaddmodule.adapter;
import android.content.Context;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.base.adapter.CommonAdapter;
import com.mm.android.deviceaddmodule.mobilecommon.common.ViewHolder;
import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
import java.util.List;
/**
* 网关设备列表适配器
*/
public class GatewayListAdapter extends CommonAdapter<DHDevice> {
private int mSelectPosition=-1;
public GatewayListAdapter(List<DHDevice> list, Context context) {
super(R.layout.gateway_list_item, list, context);
}
@Override
public void convert(ViewHolder viewHolder, final DHDevice entity,
final int position, ViewGroup parent) {
CheckBox checkBox = (CheckBox) viewHolder
.findViewById(R.id.checkbox);
TextView deviceName = (TextView) viewHolder
.findViewById(R.id.device_name);
deviceName.setText(entity.getName());
if (entity.isOnline()) {
deviceName.setTextColor(mContext.getResources().getColor(R.color.c2));
} else {
deviceName.setTextColor(mContext.getResources().getColor(R.color.c5));
}
if (mSelectPosition == position)
checkBox.setChecked(true);
else
checkBox.setChecked(false);
}
public void setSelectPosition(int selectPosition){
mSelectPosition = selectPosition;
notifyDataSetChanged();
}
public int getSelectPosition() {
return mSelectPosition;
}
}

View File

@ -0,0 +1,46 @@
package com.mm.android.deviceaddmodule.adapter;
import android.content.Context;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.entity.WlanInfo;
import com.mm.android.deviceaddmodule.mobilecommon.base.adapter.CommonAdapter;
import com.mm.android.deviceaddmodule.mobilecommon.common.ViewHolder;
import java.util.List;
public class WifiListAdapter extends CommonAdapter<WlanInfo> {
public WifiListAdapter(int layout, List<WlanInfo> list, Context mContext) {
super(layout, list, mContext);
}
@Override
public void convert(ViewHolder viewHolder, WlanInfo entity,
final int position, ViewGroup parent) {
TextView wlanName = (TextView) viewHolder.findViewById(R.id.wlan_name);
ImageView wlanStrength = (ImageView) viewHolder.findViewById(R.id.wlan_len);
ImageView wlanAuthMode = (ImageView) viewHolder.findViewById(R.id.wlan_mode);
wlanName.setText(entity.getWlanSSID()); //设置wifi名
int quality = entity.getWlanQuality(); //获取wifi信号
if (quality < 15) {
int singalDrawable=entity.getWlanAuthMode() == 0 && entity.getWlanEncrAlgr() == 0?R.drawable.devicedetail_wifi_nosingal:R.drawable.devicedetail_wifi_nosingal_lock;
wlanStrength.setImageResource(singalDrawable);
} else if (quality < 45) {
int singalDrawable=entity.getWlanAuthMode() == 0 && entity.getWlanEncrAlgr() == 0?R.drawable.devicedetail_wifi_1singal:R.drawable.devicedetail_wifi_1singal_lock;
wlanStrength.setImageResource(singalDrawable);
} else if (quality < 75) {
int singalDrawable=entity.getWlanAuthMode() == 0 && entity.getWlanEncrAlgr() == 0?R.drawable.devicedetail_wifi_2singal:R.drawable.devicedetail_wifi_2singal_lock;
wlanStrength.setImageResource(singalDrawable);
} else {
int singalDrawable=entity.getWlanAuthMode() == 0 && entity.getWlanEncrAlgr() == 0?R.drawable.devicedetail_wifi_3singal:R.drawable.devicedetail_wifi_3singal_lock;
wlanStrength.setImageResource(singalDrawable);
}
}
}

View File

@ -0,0 +1,85 @@
package com.mm.android.deviceaddmodule.base;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import com.mm.android.deviceaddmodule.event.DeviceAddEvent;
import com.mm.android.deviceaddmodule.mobilecommon.base.BaseFragment;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import org.greenrobot.eventbus.EventBus;
public abstract class BaseDevAddFragment extends BaseFragment {
protected boolean isDestoryView;
protected abstract void initView(View view);
protected abstract void initData();
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isDestoryView = false;
LogUtil.debugLog("lcxw-fragment",getClass().getSimpleName()+ "--->onViewCreated");
initView(view);
initData();
}
@Override
public void onDestroyView() {
super.onDestroyView();
isDestoryView = true;
hideSoftKeyboard();
}
public void hideSoftKeyboard() {
if (getActivity() == null) return ;
InputMethodManager im = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (im.isActive() || getActivity().getCurrentFocus() != null) {
im.hideSoftInputFromWindow(getActivity().findViewById(android.R.id.content)
.getWindowToken(), 0);
}
}
public boolean isDestoryView() {
return isDestoryView;
}
public Context getContextInfo() {
return getActivity();
}
public boolean isViewActive() {
return !isDestoryView();
}
public void showToastInfo(String msg) {
toast(msg);
}
public void showToastInfo(int msgId) {
toast(msgId);
}
public void showToastInfo(int msgId, String msg) {
if (!TextUtils.isEmpty(msg)) {
toast(msg);
} else {
toast(msgId);
}
}
public void showProgressDialog() {
EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.SHOW_LOADING_VIEW_ACTION));
}
public void cancelProgressDialog() {
EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.DISMISS_LOADING_VIEW_ACTION));
}
}

View File

@ -0,0 +1,88 @@
package com.mm.android.deviceaddmodule.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
/**
* 引导提示页基类
**/
public abstract class BaseTipFragment extends BaseDevAddFragment implements View.OnClickListener {
protected ImageView mTipImg;
protected TextView mTipTxt, mTipTxt2, mHelpTxt, mNextBtn;
protected CheckBox mConfirmCheck;
protected View mView;
protected abstract void nextAction(); //下一步操作
protected abstract void helpAction(); //帮助操作
protected abstract void init(); //初始化view及Data
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
if (mView != null) {
ViewGroup parent = (ViewGroup) mView.getParent();
if (parent != null) {
parent.removeView(mView);
}
} else {
mView = inflater.inflate(R.layout.fragment_base_tip, container, false);
init();
}
return mView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
}
@Override
protected void initView(View view) {
mTipImg = view.findViewById(R.id.tip_img);
mTipTxt = view.findViewById(R.id.tip_txt);
mTipTxt2 = view.findViewById(R.id.tip_txt2);
mHelpTxt = view.findViewById(R.id.help_tip);
mNextBtn = view.findViewById(R.id.tv_next);
mConfirmCheck = view.findViewById(R.id.cb_confirm);
mNextBtn.setOnClickListener(this);
mConfirmCheck.setOnClickListener(this);
mHelpTxt.setOnClickListener(this);
}
//提示图平铺
protected void tipImageMatch(){
RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) mTipImg.getLayoutParams();
params.height= RelativeLayout.LayoutParams.WRAP_CONTENT;
params.width=RelativeLayout.LayoutParams.MATCH_PARENT;
params.setMargins(0,0,0,0);
}
@Override
protected void initData() {
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.tv_next) {
nextAction();
} else if (id == R.id.cb_confirm) {
mNextBtn.setEnabled(mConfirmCheck.isChecked());
} else if (id == R.id.help_tip) {
helpAction();
}
}
}

View File

@ -0,0 +1,78 @@
package com.mm.android.deviceaddmodule.base;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Parcelable;
import com.dahua.mobile.utility.network.DHWifiUtil;
import com.mm.android.deviceaddmodule.helper.DeviceAddHelper;
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
import com.mm.android.deviceaddmodule.model.DeviceAddModel;
/**
* 主要用于监听wifi状态的变化变化的话就解除绑定连接上后还是我们的那个的话就重新绑定
*/
public abstract class BaseWifiListenerFragment extends BaseDevAddFragment {
protected DHWifiUtil mDHWifiUtil;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDHWifiUtil = new DHWifiUtil(getContext().getApplicationContext());
}
@Override
protected IntentFilter createBroadCast() {
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
return filter;
}
@Override
protected void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
Parcelable parcelable = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (parcelable != null) {
NetworkInfo networkInfo = (NetworkInfo) parcelable;
NetworkInfo.State state = networkInfo.getState();
if (state == NetworkInfo.State.DISCONNECTED) {
DeviceAddHelper.clearNetWork();
} else if (state == NetworkInfo.State.CONNECTED) {
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
String mSsid = deviceAddInfo.getSsid();
String mCurrentSsid = getCurrentWifiInfo();
if (mCurrentSsid!=null){
String mTempStr = mCurrentSsid.startsWith("\"") ? mCurrentSsid : "\""+mCurrentSsid+"\"";
String mTempStrCache = "\"" + mSsid + "\"";
if (mTempStr.equals(mTempStrCache)){
DeviceAddHelper.bindNetwork(null);
}
}
}
}
}
}
public String getCurrentWifiInfo(){
WifiInfo wifiInfo = mDHWifiUtil.getCurrentWifiInfo();
return wifiInfo!=null?wifiInfo.getSSID():null;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unRegisterBroadCast();
}
}

View File

@ -0,0 +1,7 @@
package com.mm.android.deviceaddmodule.base;
/**
* MVP模式P层接口
*/
public interface IBasePresenter {
}

View File

@ -0,0 +1,16 @@
package com.mm.android.deviceaddmodule.base;
import android.content.Context;
/**
* MVP模式V层接口
**/
public interface IBaseView<T extends IBasePresenter> {
Context getContextInfo();
boolean isViewActive(); //View层是否处于活动状态
//Toast
void showToastInfo(String msg);
void showToastInfo(int msgId);
void showProgressDialog();
void cancelProgressDialog();
}

View File

@ -0,0 +1,20 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
import com.mm.android.deviceaddmodule.mobilecommon.entity.AddApResult;
public interface ApBindSuccessConstract {
interface Presenter extends IBasePresenter {
void modifyApName();
void setData(AddApResult addApResult);
}
interface View extends IBaseView<Presenter> {
String getApName();
void setApName(String name);
void setApImg(String img);
void completeAction();
}
}

View File

@ -0,0 +1,18 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
import com.mm.android.deviceaddmodule.mobilecommon.entity.AddApResult;
public interface ApPairConstract {
interface Presenter extends IBasePresenter {
void pair();
void stopPair();
}
interface View extends IBaseView<Presenter> {
void goErrorTipPage();
void goApBindSuccessPage(AddApResult addApResult);
}
}

View File

@ -0,0 +1,23 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface BaseSoftApTipConstract {
interface Presenter extends IBasePresenter {
boolean isLastTipPage(); //是否为最后一页引导页
void dealWithUnknownSsid();
boolean isWifiConnect();
void verifyWifiOrLocationPermission();
}
interface View extends IBaseView<Presenter> {
void updateTipImage(String imageUrl);
void updateTipTxt(String tipInfo);
void updateResetTxt(String resetTxt);
void goErrorTipPage();
void applyLocationPermission();
void gotoSoftApTipConnectWifiPage();
}
}

View File

@ -0,0 +1,29 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface BindSuccessConstract {
interface Presenter extends IBasePresenter {
void refreshDevice(boolean isExit);
void modifyDevName();
void getDevName();
}
interface View extends IBaseView<Presenter> {
void updateDevImg(String img);
String getDevName();
void setDevName(String name);
void completeAction();
void deviceName(String name);
}
}

View File

@ -0,0 +1,49 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface CloudConnectConstract {
interface Presenter extends IBasePresenter {
void bindDevice();
void getDeviceInfo();
void recyle();
boolean isWifiOfflineConfiMode(); //是否为离线配置模式
void notifyMiddleTimeUp();
void startConnectTiming(); //开始连接云
void stopConnectTiming(); //结束连接
}
interface View extends IBaseView<DeviceAddConstract.Presenter> {
void goBindSuceesPage(); //绑定成功页
void goDevLoginPage(); //设备登录页
void goDevSecCodePage(); //设备安全码页
void goErrorTipPage(); //错误提示页
void goErrorTipPage(int errorCode); //错误提示页
void goBindDevicePage(); //绑定设备页
void completeAction(); //流程结束
void setCountDownTime(int time); //设置倒计时时间
void setMiddleTime(int time); //设置中间时间
void goOtherUserBindTipPage(); //设备被他人绑定提示页
void goNotSupportBuindTipPage(); //设备不支持被绑定
void goMainbind(String sn, String code, String encryptPwd); //返回主项目添加
}
}

View File

@ -0,0 +1,32 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface DevLoginConstract {
interface Presenter extends IBasePresenter {
void devLogin();
}
interface View extends IBaseView<Presenter> {
String getDevicePassword(); //从输入框中获取设备密码
void goSoftAPWifiListPage(); //软AP添加wifi选择页
void goDeviceBindPage(); //进入设备绑定页
void goBindSuceesPage(); //进入绑定成功页
void goOtherUserBindTipPage(); //进入其他用户绑定提示页
void goErrorTipPage(int errorCode); //错误提示页
void completeAction(); //完成退出
void goDevLoginPage(); //设备登录页
void goDevSecCodePage(); //设备安全码页
void goMainbind(String sn, String code, String encryptPwd); //返回主项目添加
}
}

View File

@ -0,0 +1,28 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface DevSecCodeConstract {
interface Presenter extends IBasePresenter {
void validate();
}
interface View extends IBaseView<Presenter> {
String getDeviceSecCode(); //从输入框中获取设备安全码
void goErrorTipPage(int errorCode); //错误提示页
void goBindSuceesPage(); //进入绑定成功页
void goOtherUserBindTipPage();
void completeAction(); //完成退出
void goDevLoginPage(); //设备登录页
void goDevSecCodePage(); //设备安全码页
void goMainbind(String sn, String code, String encryptPwd); //返回主项目添加
}
}

View File

@ -0,0 +1,23 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
import com.mm.android.deviceaddmodule.entity.WlanInfo;
import java.util.List;
public interface DevWifiListConstract {
interface Presenter extends IBasePresenter {
boolean isDevSupport5G();
void getWifiList();
}
interface View extends IBaseView<Presenter> {
void updateWifiList(List<WlanInfo> list);
void goWifiPwdPage(WlanInfo wlanInfo, boolean isNotNeedLogin);
void goHiddenWifiPwdPage(boolean isNotNeedLogin);
void goDevLoginPage();
void showListView();
void showErrorInfoView();
}
}

View File

@ -0,0 +1,75 @@
package com.mm.android.deviceaddmodule.contract;
import android.content.Intent;
import android.os.Bundle;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface DeviceAddConstract {
interface Presenter extends IBasePresenter {
String getCurTitleMode();
void setCurTitleMode(String titleMode);
void dispatchIntentData(Intent intent);
void getGPSLocation(); //获取gps信息
void dispatchPageNavigation(); //添加流程页跳转
void uninit(); //释放相关资源
void getDeviceShareInfo();
boolean canBeShare();
void changeToWireless();
void changeToWired();
void changeToSoftAp();
void changeToNB();
}
interface View extends IBaseView<Presenter> {
void setTitle(int titleId); //设置标题
void goScanPage(); //扫描页
void goDispatchPage(); //分发页
void goHubPairPage(String sn, String hubType); //hub电池相机引导页
void goApConfigPage(boolean hasSelecteGateway); //跳转至配件添加页
void goWiredwirelessPage(boolean isWifi); //跳转至有线/无线添加
void goWiredwirelessPageNoAnim(boolean isWifi); //跳转至有线/无线添加
void goSoftApPage(); //跳转至软AP添加
void goSoftApPageNoAnim(); //跳转至软AP添加
void goNBPage(); //跳转至NB添加
void goOfflineConfigPage(String sn, String devModelName, String imei); //跳转到离线配网页面
void gotoDeviceSharePage(String sn); //跳转设备分享页面
void gotoAddBleLockPage(Bundle bundle);
void goInitPage(DEVICE_NET_INFO_EX device_net_info_ex);
void goCloudConnetPage();
void goTypeChoosePage();
void completeAction(boolean isAp);
void goLocationPage(); //跳转至设备本地配网添加
void goIMEIInputPage(); //跳转至输入imei页
void goNotSupportBindTipPage(); //跳转到不支持绑定的设备页面
}
}

View File

@ -0,0 +1,25 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface DispatchContract {
interface Presenter extends IBasePresenter {
boolean isManualInputPage(); //是否为手动输入设备序列号页面
boolean isSnInValid(String sn);
boolean isScCodeInValid(String scCode);
void dispatchResult();
}
interface View extends IBaseView<ScanContract.Presenter> {
void goTypeChoosePage(); //跳转到设备类型选择页
void goNotSupportBindTipPage(); //跳转到不支持绑定的设备页面
void goOtherUserBindTipPage(); //跳转至设备被其他用户绑定提示页
void showAddBoxTip(); //盒子添加提示
void goCloudConnectPage(); //跳转至云平台连接页
void goDeviceLoginPage(); //跳转至设备登录页
void goSecCodePage(); //跳转至安全码验证页
void goDeviceBindPage(); //跳转至设备绑定页
void goIMEIInputPage(); //跳转至输入imei页
}
}

View File

@ -0,0 +1,25 @@
package com.mm.android.deviceaddmodule.contract;
import android.support.v4.app.Fragment;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface ErrorTipConstract {
interface Presenter extends IBasePresenter {
void dispatchError(int errorCode);
boolean isResetPage(); //通用错误页及没有按钮
boolean isUserBindTipPage(); //是否为设备绑定提示页
boolean isUserBindTipPageByBind();//绑定时提示设备被其他用户绑定
}
interface View extends IBaseView<Presenter> {
Fragment getParent();
void updateInfo(String info,String img,boolean isNeedMatch);
void updateInfo(int infoId,int tip2Id,String img,boolean isNeedMatch);
void updateInfo(int infoId,String img,boolean isNeedMatch);
void hideTipTxt();
void hideHelp();
}
}

View File

@ -0,0 +1,23 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
import java.util.List;
public interface GatewayListConstract {
interface Presenter extends IBasePresenter {
List<DHDevice> getGatewayData(boolean selectedGateway);
int gatewaySize();
void dispatchCurSelect(int pos);
int getSelectedpos();
}
interface View extends IBaseView<Presenter> {
void goTipPage();
void setApSn(String apSn);
void setApImg(String img);
void setSelectedPos(int pos);
}
}

View File

@ -0,0 +1,23 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface HiddenWifiPwdConstract {
interface Presenter extends IBasePresenter {
void setIsNotNeedLogin(boolean isNotNeedLogin);
String getCurWifiName();
void updateWifiCache();
void connectWifi();
boolean isDevSupport5G();
}
interface View extends IBaseView<Presenter> {
String getWifiPwd();
String getWifiSSID();
void goCloudConnectPage();
}
}

View File

@ -0,0 +1,16 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface HubApGuide1Constract {
interface Presenter extends IBasePresenter {
void checkDevIntroductionInfo(String deviceModel);
}
interface View extends IBaseView<Presenter> {
void updateTip(String tipImg, String tipTxt,String helpTxt);
void showInfoView();
}
}

View File

@ -0,0 +1,25 @@
package com.mm.android.deviceaddmodule.contract;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface InitContract {
interface Presenter extends IBasePresenter {
void setDeviceEX(DEVICE_NET_INFO_EX deviceEX);
void playTipSound(); //播放提示音频
void startDevInitByIp(); //设备单播初始化
void startDevInit(); //设备组播初始化
boolean isPwdValid(); //密码是否有效
void checkDevice();
void recyle();
}
interface View extends IBaseView<Presenter> {
int getMusicRes(); //获取音频资源
String getInitPwd(); //获取设备密码
void goSoftAPWifiListPage(); //软AP添加wifi选择页
void goConnectCloudPage(); //进入连接云平台页
void goErrorTipPage();
}
}

View File

@ -0,0 +1,4 @@
package com.mm.android.deviceaddmodule.contract;
public interface ManualInputConstract extends ScanContract {
}

View File

@ -0,0 +1,15 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface OfflineConfigConstract {
interface Presenter extends IBasePresenter {
void resetCache();
void getDeviceInfo(String deviceSn, String deviceModelName, String imeiCode); //从服务获取设备信息
}
interface View extends IBaseView<Presenter> {
void onGetDeviceInfoError();
}
}

View File

@ -0,0 +1,33 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ScanResult;
/**
* 二维码扫描契约类定义二维码扫描页面相关View层和Presenter层的接口
**/
public interface ScanContract {
interface Presenter extends IBasePresenter{
ScanResult parseScanStr(String scanStr, String sc); //解析扫描到的二维码
void getDeviceInfo(String deviceSn, String deviceCodeModel); //从服务获取设备信息
boolean isManualInputPage(); //是否为手动输入设备序列号页面
boolean isSnInValid(String sn);
void recyle();
void resetCache();
boolean isScCodeInValid(String scCode);
}
interface View extends IBaseView<Presenter>{
void goTypeChoosePage(); //跳转到设备类型选择页
void goNotSupportBindTipPage(); //跳转到不支持绑定的设备页面
void goOtherUserBindTipPage(); //跳转至设备被其他用户绑定提示页
void showAddBoxTip(); //盒子添加提示维持乐橙逻辑
void goCloudConnectPage(); //跳转至云平台连接页
void goDeviceLoginPage(); //跳转至设备登录页
void goSecCodePage(); //跳转至安全码验证页
void goDeviceBindPage(); //跳转至设备绑定页
void goIMEIInputPage(); //跳转至输入imei页
void goMainbind(String sn, String code, String encryptPwd); //返回主项目添加
}
}

View File

@ -0,0 +1,20 @@
package com.mm.android.deviceaddmodule.contract;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface SecurityCheckConstract {
interface Presenter extends IBasePresenter {
void checkDevice();
void recyle();
}
interface View extends IBaseView<Presenter> {
void goInitPage(DEVICE_NET_INFO_EX device_net_info_ex);
void goErrorTipPage();
void goDevLoginPage(); //设备登录页
void goSoftApWifiListPage(boolean isNotNeedLogin);
void goCloudConnetPage();
}
}

View File

@ -0,0 +1,38 @@
package com.mm.android.deviceaddmodule.contract;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface SmartConfigConstract {
interface Presenter extends IBasePresenter {
void startSmartConfig(); //开始smartconfig配对线程和声波配对
void recyle(); //回收资源
String getConfigMode();
void stopAudio();
void playAudio();
void pauseAudio();
void releaseAudio();
void wifiPwdErrorClick();
}
interface View extends IBaseView<Presenter> {
void goDevInitPage(DEVICE_NET_INFO_EX device_net_info_ex); //进入设备初始化页
void goConnectCloudPage(); //进入连接云平台页
void goDevLoginPage(); //P2P设备进入设备登录页
void goConfigTimeoutPage(); //配置超时页
void goWfiPwdPage();
void stopCountDown();
void updateTip2Txt(boolean isSupportSoundWave, boolean isSupportSoundWaveV2);
void hideTipWifiPwdErrorTxt(boolean isOversea);
void completeAction();
void goBindDevicePage();
}
}

View File

@ -0,0 +1,24 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
import com.mm.android.deviceaddmodule.entity.WlanInfo;
public interface SoftApWifiPwdConstract {
interface Presenter extends IBasePresenter {
void setWlanInfo(WlanInfo wlanInfo);
void setIsNotNeedLogin(boolean isNotNeedLogin);
boolean isDevSupport5G();
String getCurWifiName();
void updateWifiCache();
String getSavedWifiPwd();
void connectWifi();
boolean getSavedWifiCheckBoxStatus();
}
interface View extends IBaseView<Presenter> {
String getWifiPwd();
boolean isSavePwdChecked();
void goCloudConnectPage();
}
}

View File

@ -0,0 +1,20 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface TimeoutConstract {
interface Presenter extends IBasePresenter {
void setErrorData(int errorCode, String timeoutDevtypeModel);
void dispatchAction1();
}
interface View extends IBaseView<Presenter> {
//A类型
void showAView();
void goScanPage();
}
}

View File

@ -0,0 +1,19 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface TipSoftApConnectWifiConstract {
interface Presenter extends IBasePresenter {
void copyWifiPwd();
void connectWifiAction(boolean isFirst); //开始连接设备热点
void dispatchHotConnected(); //处理热点连接判断当前wifi是否已连接至热点
String getHotSSID(); //获取热点ssid
}
interface View extends IBaseView<Presenter> {
void updateWifiName(String wifiName);
void updateConnectFailedTipText(String wifiName, String wifiPwd, boolean isSupportAddBySc, boolean isManualInput);
void goSecurityCheckPage();
}
}

View File

@ -0,0 +1,19 @@
package com.mm.android.deviceaddmodule.contract;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface TipWifiConnectConstract {
interface Presenter extends IBasePresenter {
void searchDevice();
void stopSearchDevice();
String getConfigMode();
}
interface View extends IBaseView<Presenter> {
void goDevInitPage(DEVICE_NET_INFO_EX device_net_info_ex); //进入设备初始化页
void goWifiConfigPage(); //进入配网页
void goCloudConnectPage(); //进入云连接页
}
}

View File

@ -0,0 +1,16 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface TypeChooseConstract {
interface Presenter extends IBasePresenter {
void getDeviceInfoSync(String deviceModelName);
void checkDevIntroductionInfo(String deviceModelName);
void resetDevPwdCache(); //回到设备选择页清空设备密码缓存
}
interface View extends IBaseView<Presenter> {
void showSearchError();
}
}

View File

@ -0,0 +1,26 @@
package com.mm.android.deviceaddmodule.contract;
import com.mm.android.deviceaddmodule.base.IBasePresenter;
import com.mm.android.deviceaddmodule.base.IBaseView;
public interface WifiPwdConstract {
interface Presenter extends IBasePresenter {
boolean isDevSupport5G();
String getCurWifiName();
void updateWifiCache();
String getSavedWifiPwd();
boolean getSavedWifiCheckBoxStatus();
String getConfigMode();
}
interface View extends IBaseView<Presenter> {
String getWifiPwd();
boolean isSavePwdChecked();
}
}

View File

@ -0,0 +1,46 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Intent;
import android.os.Handler;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBasePresenter;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBaseView;
import com.mm.android.deviceaddmodule.mobilecommon.common.HandlerManager;
import java.lang.ref.WeakReference;
/**
* Presenter基类所有Presenter继承自此类
*/
public abstract class BasePresenter<T extends IBaseView> implements IBasePresenter {
protected WeakReference<T> mView;
private HandlerManager mHandlerManager;
public BasePresenter(T view) {
mView = new WeakReference<>(view);
}
protected Handler addHandler(Handler handler){
if(mHandlerManager == null){
mHandlerManager = new HandlerManager();
}
return mHandlerManager.addHandler(handler);
}
private void clearHandlers(){
if(mHandlerManager != null){
mHandlerManager.clearHandlers();
}
}
@Override
public void unInit() {
clearHandlers();
}
@Override
public void dispatchIntentData(Intent intent) {
}
}

View File

@ -0,0 +1,70 @@
package com.mm.android.deviceaddmodule.device_wifi;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.Serializable;
/**
* 当前连接Wifi状态信息
*/
public class CurWifiInfo implements Serializable {
public static class Response {
public CurWifiInfo data;
public void parseData(JsonObject json) {
Gson gson = new Gson();
this.data = gson.fromJson(json.toString(), CurWifiInfo.class);
}
}
//当前有无连接热点
private boolean linkEnable;
//若连接了热点填热点的名称若未连接填空
private String ssid;
//强度, 0最弱5最强
private int intensity;
//强度单位为dbm
private String sigStrength;
//WIFI认证模式
private String auth;
public boolean isLinkEnable() {
return linkEnable;
}
public void setLinkEnable(boolean linkEnable) {
this.linkEnable = linkEnable;
}
public String getSsid() {
return ssid;
}
public void setSsid(String ssid) {
this.ssid = ssid;
}
public int getIntensity() {
return intensity;
}
public void setIntensity(int intensity) {
this.intensity = intensity;
}
public String getSigStrength() {
return sigStrength;
}
public void setSigStrength(String sigStrength) {
this.sigStrength = sigStrength;
}
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
}

View File

@ -0,0 +1,29 @@
package com.mm.android.deviceaddmodule.device_wifi;
/**
* 设备管理常量类
*/
public class DeviceConstant {
/**
* Intent跳转的key常量或者一些常量key值
*/
public interface IntentKey {
String DEVICE_CURRENT_WIFI_INFO = "DEVICE_CURRENT_WIFI_INFO";
String DEVICE_WIFI_CONFIG_INFO = "DEVICE_WIFI_CONFIG_INFO";
String DHDEVICE_INFO = "DHDEVICE_INFO";
String DHDEVICE_UNBIND = "DHDEVICE_UNBIND";
String DHDEVICE_NEW_NAME = "DHDEVICE_NEW_NAME";
}
/**
* Intent跳转请求码返回码常量
*/
public interface IntentCode {
int DEVICE_SETTING_WIFI_OPERATE = 208;
int DEVICE_SETTING_WIFI_LIST = 209;
}
}

View File

@ -0,0 +1,213 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.BaseManagerFragmentActivity;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.widget.CommonTitle;
import java.util.ArrayList;
import java.util.List;
import static com.mm.android.deviceaddmodule.device_wifi.ErrorTipActivity.ERROR_PARAMS;
/**
* 设备wifi列表界面
*/
public class DeviceWifiListActivity<T extends DeviceWifiListConstract.Presenter> extends BaseManagerFragmentActivity<T> implements DeviceWifiListConstract.View,
CommonTitle.OnTitleClickListener, AdapterView.OnItemClickListener{
protected DeviceWifiListAdapter mAdapter;
protected ListView mList;
protected TextView mCurWifiSSIDTv;
protected ImageView mCurWifiQualityIv;
protected LinearLayout mNo5GLl;
protected TextView mNo5GTv;
protected TextView deviceWifi;
@Override
protected void initLayout() {
setContentView(R.layout.activity_device_wifi_list);
}
@Override
protected View initTitle() {
CommonTitle title = (CommonTitle) findViewById(R.id.device_wifi_list_title);
title.initView(R.drawable.mobile_common_title_back, R.drawable.common_title_refresh_selector, R.string.mobile_common_network_config);
title.setOnTitleClickListener(this);
return title;
}
@Override
protected void initView() {
super.initView();
mList = (ListView) findViewById(R.id.device_wifi_list);
mCurWifiSSIDTv = (TextView) findViewById(R.id.wifi_ssid);
mCurWifiQualityIv = (ImageView) findViewById(R.id.wifi_quality_icon);
mNo5GLl = findViewById(R.id.device_wifi_no_5g);
mNo5GTv = findViewById(R.id.tv_5g_tip);
mNo5GTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(DeviceWifiListActivity.this, ErrorTipActivity.class);
intent.putExtra(ERROR_PARAMS,1);
startActivity(intent);
}
});
deviceWifi = findViewById(R.id.device_wifi_list_text);
deviceWifi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(DeviceWifiListActivity.this, ErrorTipActivity.class);
intent.putExtra(ERROR_PARAMS,2);
startActivity(intent);
}
});
mList.setOnItemClickListener(this);
View view = LayoutInflater.from(this).inflate(R.layout.item_wifi_list_more, null);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(DeviceWifiListActivity.this, HiddenWifiActivity.class);
intent.putExtra(LCConfiguration.Device_ID,mPresenter.getDHDevice().getDeviceId());
intent.putExtra(LCConfiguration.SUPPORT_5G,mPresenter.isSupport5G(mPresenter.getDHDevice().getWifiTransferMode()));
startActivity(intent);
}
});
mList.addFooterView(view,null,true);
mAdapter = new DeviceWifiListAdapter(R.layout.include_device_wifi_list_item, new ArrayList<WifiInfo>(), this);
mList.setAdapter(mAdapter);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (!isActivityDestory()) {
mPresenter.getDeviceWifiListAsync();
}
}
}, 100);
}
@Override
public void initPresenter() {
mPresenter = (T) new DeviceWifiListPresenter(this);
}
@Override
protected void initData() {
mPresenter.dispatchIntentData(getIntent());
}
@Override
public void onCommonTitleClick(int id) {
switch (id) {
case CommonTitle.ID_LEFT:
Intent intent = new Intent();
intent.putExtra(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO, mPresenter.getCurWifiInfo());
setResult(RESULT_OK, intent);
DeviceWifiListActivity.this.finish();
break;
case CommonTitle.ID_RIGHT:
mPresenter.getDeviceWifiListAsync();
break;
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(this,DeviceWifiPasswordActivity.class);
intent.putExtra(DeviceConstant.IntentKey.DEVICE_WIFI_CONFIG_INFO,mPresenter.getWifiInfo(position));
intent.putExtra(LCConfiguration.Device_ID,mPresenter.getDHDevice().getDeviceId());
intent.putExtra(LCConfiguration.SUPPORT_5G,mPresenter.isSupport5G(mPresenter.getDHDevice().getWifiTransferMode()));
startActivityForResult(intent,DeviceConstant.IntentCode.DEVICE_SETTING_WIFI_OPERATE);
}
@Override
public void refreshListView(List<WifiInfo> wifiInfos) {
if (mAdapter != null){
mAdapter.clearData();
mAdapter.addData(wifiInfos);
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoadSucceed(boolean isEmpty,boolean isError) {
if (isEmpty) {
findViewById(R.id.device_wifi_list_empty_view).setVisibility(View.VISIBLE);
findViewById(R.id.device_wifi_list_layout).setVisibility(View.GONE);
mNo5GLl.setVisibility(View.GONE);
((TextView) findViewById(R.id.device_wifi_list_empty_view)).setText(isError?R.string.mobile_common_get_info_failed:R.string.device_manager_wifi_list_empty);
} else {
if (!mPresenter.isSupport5G(mPresenter.getDHDevice().getWifiTransferMode())) {
mNo5GLl.setVisibility(View.VISIBLE);
}
findViewById(R.id.device_wifi_list_empty_view).setVisibility(View.GONE);
findViewById(R.id.device_wifi_list_layout).setVisibility(View.VISIBLE);
}
}
@Override
public void updateCurWifiLayout(CurWifiInfo curWifiInfo) {
if (curWifiInfo == null || !curWifiInfo.isLinkEnable() || TextUtils.isEmpty(curWifiInfo.getSsid())) {
findViewById(R.id.device_wifi_list_connected).setVisibility(View.GONE);
findViewById(R.id.device_wifi_list_connected_info).setVisibility(View.GONE);
} else {
findViewById(R.id.device_wifi_list_connected).setVisibility(View.VISIBLE);
findViewById(R.id.device_wifi_list_connected_info).setVisibility(View.VISIBLE);
mCurWifiSSIDTv.setText(curWifiInfo.getSsid());
mCurWifiQualityIv.setVisibility(View.VISIBLE);
if (curWifiInfo.getIntensity() < 2) {
mCurWifiQualityIv.setImageResource("OPEN".equalsIgnoreCase(curWifiInfo.getAuth())
? R.drawable.devicedetail_wifi_nosingal : R.drawable.devicedetail_wifi_nosingal_lock);
} else if (curWifiInfo.getIntensity() < 3) {
mCurWifiQualityIv.setImageResource("OPEN".equalsIgnoreCase(curWifiInfo.getAuth())
? R.drawable.devicedetail_wifi_1singal : R.drawable.devicedetail_wifi_1singal_lock);
} else if (curWifiInfo.getIntensity() < 4) {
mCurWifiQualityIv.setImageResource("OPEN".equalsIgnoreCase(curWifiInfo.getAuth())
? R.drawable.devicedetail_wifi_2singal : R.drawable.devicedetail_wifi_2singal_lock);
} else {
mCurWifiQualityIv.setImageResource("OPEN".equalsIgnoreCase(curWifiInfo.getAuth())
? R.drawable.devicedetail_wifi_3singal : R.drawable.devicedetail_wifi_3singal_lock);
}
}
}
@Override
public void viewFinish() {
DeviceWifiListActivity.this.finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == DeviceConstant.IntentCode.DEVICE_SETTING_WIFI_OPERATE && resultCode == Activity.RESULT_OK
&& data != null) {
CurWifiInfo curWifiInfo = (CurWifiInfo) data.getSerializableExtra(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO);
Intent intent = new Intent();
intent.putExtra(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO, curWifiInfo);
setResult(RESULT_OK, intent);
DeviceWifiListActivity.this.finish();
}
}
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO, mPresenter.getCurWifiInfo());
setResult(RESULT_OK, intent);
super.onBackPressed();
}
}

View File

@ -0,0 +1,43 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Context;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.base.adapter.CommonAdapter;
import com.mm.android.deviceaddmodule.mobilecommon.common.ViewHolder;
import java.util.List;
public class DeviceWifiListAdapter extends CommonAdapter<WifiInfo> {
public DeviceWifiListAdapter(int layout, List<WifiInfo> list, Context context) {
super(layout, list, context);
}
@Override
public void convert(ViewHolder viewHolder, WifiInfo entity,
final int position, ViewGroup parent) {
TextView wifiSSID = (TextView) viewHolder.findViewById(R.id.wifi_ssid);
ImageView wifiQualityIcon = (ImageView) viewHolder.findViewById(R.id.wifi_quality_icon);
wifiSSID.setText(entity.getSsid()); //设置wifi名
int quality = entity.getIntensity(); //获取wifi信号
if (quality < 2) {
wifiQualityIcon.setImageResource("OPEN".equalsIgnoreCase(entity.getAuth())
? R.drawable.devicedetail_wifi_nosingal : R.drawable.devicedetail_wifi_nosingal_lock);
} else if (quality < 3) {
wifiQualityIcon.setImageResource("OPEN".equalsIgnoreCase(entity.getAuth())
? R.drawable.devicedetail_wifi_1singal : R.drawable.devicedetail_wifi_1singal_lock);
} else if (quality < 4) {
wifiQualityIcon.setImageResource("OPEN".equalsIgnoreCase(entity.getAuth())
? R.drawable.devicedetail_wifi_2singal : R.drawable.devicedetail_wifi_2singal_lock);
} else {
wifiQualityIcon.setImageResource("OPEN".equalsIgnoreCase(entity.getAuth())
? R.drawable.devicedetail_wifi_3singal : R.drawable.devicedetail_wifi_3singal_lock);
}
}
}

View File

@ -0,0 +1,24 @@
package com.mm.android.deviceaddmodule.device_wifi;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBasePresenter;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBaseView;
import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
import java.util.List;
public interface DeviceWifiListConstract {
interface Presenter extends IBasePresenter {
void getDeviceWifiListAsync();
WifiInfo getWifiInfo(int position);
CurWifiInfo getCurWifiInfo();
boolean isSupport5G(String wifiMode);
DHDevice getDHDevice();
}
interface View extends IBaseView {
void refreshListView(List<WifiInfo> wlanInfos);
void onLoadSucceed(boolean isEmpty, boolean isError);
void updateCurWifiLayout(CurWifiInfo curWifiInfo);
void viewFinish();
}
}

View File

@ -0,0 +1,199 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.text.TextUtils;
import com.mm.android.deviceaddmodule.LCDeviceEngine;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessException;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessRunnable;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.DHBaseHandler;
import com.mm.android.deviceaddmodule.mobilecommon.base.LCBusinessHandler;
import com.mm.android.deviceaddmodule.mobilecommon.businesstip.HandleMessageCode;
import com.mm.android.deviceaddmodule.mobilecommon.entity.device.DHDevice;
import com.mm.android.deviceaddmodule.openapi.DeviceAddOpenApiManager;
import java.util.ArrayList;
import java.util.List;
public class DeviceWifiListPresenter<T extends DeviceWifiListConstract.View>
extends BasePresenter<T> implements DeviceWifiListConstract.Presenter {
protected DHDevice mDHDevice;
protected CurWifiInfo mCurWifiInfo;
protected List<WifiInfo> mWifiInfos;
protected LCBusinessHandler mGetWifiConfigHandler;
protected boolean mIsLoading = false;
public DeviceWifiListPresenter(T view) {
super(view);
initModel();
mWifiInfos = new ArrayList<>();
}
protected void initModel() {
}
@Override
public void dispatchIntentData(Intent intent) {
if (intent != null && intent.getExtras() != null) {
Bundle bundle = intent.getExtras();
mDHDevice = (DHDevice) bundle.getSerializable(DeviceConstant.IntentKey.DHDEVICE_INFO);
if (bundle.containsKey(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO))
mCurWifiInfo = (CurWifiInfo) bundle.getSerializable(DeviceConstant.IntentKey.DEVICE_CURRENT_WIFI_INFO);
}
if (mDHDevice == null)
mView.get().viewFinish();
}
@Override
public void unInit() {
if (mGetWifiConfigHandler != null) {
mGetWifiConfigHandler.cancle();
mGetWifiConfigHandler.removeCallbacksAndMessages(null);
mGetWifiConfigHandler = null;
}
}
@Override
public void getDeviceWifiListAsync() {
if (mIsLoading)
return;
if (mGetWifiConfigHandler != null) {
mGetWifiConfigHandler.cancle();
mGetWifiConfigHandler = null;
}
mGetWifiConfigHandler = new DHBaseHandler<T>(mView) {
@Override
public void onStart() {
mView.get().showProgressDialog();
mIsLoading = true;
}
@Override
protected void onCompleted() {
mView.get().cancelProgressDialog();
mIsLoading = false;
}
@Override
public void handleBusinessFinally(Message msg) {
if (msg.what == HandleMessageCode.HMC_SUCCESS) {
WifiConfig wifiConfig = (WifiConfig) msg.obj;
if (wifiConfig != null && wifiConfig.isEnable()) {
List<WifiInfo> wifiInfos = processWifiInfos(wifiConfig.getwLan());
mWifiInfos.clear();
mWifiInfos.addAll(wifiInfos);
mView.get().refreshListView(mWifiInfos);
mView.get().onLoadSucceed(mWifiInfos.isEmpty(), false);
mView.get().updateCurWifiLayout(mCurWifiInfo);
} else {
mView.get().onLoadSucceed(true, false);
mView.get().updateCurWifiLayout(mCurWifiInfo);
mView.get().showToastInfo(mView.get().getContextInfo().getString(R.string.device_manager_wifi_disable));
}
} else {
mView.get().onLoadSucceed(true, true);
mView.get().updateCurWifiLayout(null);
mView.get().showToastInfo(mView.get().getContextInfo().getString(R.string.mobile_common_get_info_failed));
}
}
};
new BusinessRunnable(mGetWifiConfigHandler) {
@Override
public void doBusiness() throws BusinessException {
try {
WifiConfig response = DeviceAddOpenApiManager.wifiAround(LCDeviceEngine.newInstance().accessToken, mDHDevice.getDeviceId());
mGetWifiConfigHandler.obtainMessage(HandleMessageCode.HMC_SUCCESS, response).sendToTarget();
} catch (BusinessException e) {
throw e;
}
}
};
}
@Override
public WifiInfo getWifiInfo(int position) {
if (position >= mWifiInfos.size())
return null;
return mWifiInfos.get(position);
}
public boolean isSupport5G(String wifiMode) {
if (!TextUtils.isEmpty(wifiMode)) {
return wifiMode.toUpperCase().contains("5GHZ");
}
return false;
}
@Override
public CurWifiInfo getCurWifiInfo() {
return mCurWifiInfo;
}
@Override
public DHDevice getDHDevice() {
return mDHDevice;
}
/**
* 处理去掉相同的wifi,和当前已连接的wifi
*
* @param wifiInfos
* @return
*/
protected List<WifiInfo> processWifiInfos(List<WifiInfo> wifiInfos) {
List<WifiInfo> tems = new ArrayList<>();
if (mCurWifiInfo == null) {
mCurWifiInfo = new CurWifiInfo();
}
if (wifiInfos == null || wifiInfos.isEmpty())
return tems;
// 获取当前连接的wifi
for (WifiInfo wifiInfo : wifiInfos) {
if (WifiInfo.Status.connected.equalsIgnoreCase(wifiInfo.getLinkStatus())) {
mCurWifiInfo.setIntensity(wifiInfo.getIntensity());
mCurWifiInfo.setSsid(wifiInfo.getSsid());
mCurWifiInfo.setAuth(wifiInfo.getAuth());
mCurWifiInfo.setLinkEnable(true);
break;
}
}
for (WifiInfo wifiInfo : wifiInfos) {
boolean isContains = false;
for (WifiInfo tem : tems) {
if (wifiInfo.getSsid() != null && wifiInfo.getSsid().equalsIgnoreCase(tem.getSsid())) {
isContains = true;
break;
}
}
if (isContains) {
//已包含去重
continue;
}
if (mCurWifiInfo.getSsid() == null) {
//当前热点为空
tems.add(wifiInfo);
} else if (!mCurWifiInfo.getSsid().equalsIgnoreCase(wifiInfo.getSsid())) {
//当前热点不为空去除当前已连接wifi
tems.add(wifiInfo);
}
}
return tems;
}
public boolean isDevSupport5G() {
String wifiMode = "";
if (!TextUtils.isEmpty(wifiMode)) {
return wifiMode.toUpperCase().contains("5GHZ");
}
return false;
}
}

View File

@ -0,0 +1,155 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Context;
import android.content.Intent;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.BaseManagerFragmentActivity;
import com.mm.android.deviceaddmodule.mobilecommon.widget.ClearPasswordEditText;
import com.mm.android.deviceaddmodule.mobilecommon.widget.CommonTitle;
import static com.mm.android.deviceaddmodule.device_wifi.ErrorTipActivity.ERROR_PARAMS;
/**
* 设备wifi列表界面
*/
public class DeviceWifiPasswordActivity<T extends DeviceWifiPasswordConstract.Presenter>
extends BaseManagerFragmentActivity<T> implements DeviceWifiPasswordConstract.View,
CommonTitle.OnTitleClickListener, View.OnClickListener {
protected TextView mWifiSSIDTv;
protected Button mDoneBtn;
protected ClearPasswordEditText mWifiPasswordEdt;
private TextView mSaveWifiPwdCheckbox;
private ImageView mWifiImg;
private TextView m5GWifiTipTv;
private final TextWatcher mTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
mWifiPasswordEdt.removeTextChangedListener(mTextWatcher);
String str = Utils4DeviceManager.wifiPwdFilter(s.toString());
if (!str.equals(s.toString())) {
mWifiPasswordEdt.setText(str);
mWifiPasswordEdt.setSelection(str.length());
}
mWifiPasswordEdt.addTextChangedListener(mTextWatcher);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
};
@Override
protected void initLayout() {
setContentView(R.layout.activity_device_wifi_password);
}
@Override
protected View initTitle() {
CommonTitle title = (CommonTitle) findViewById(R.id.device_wifi_password_title);
title.initView(R.drawable.mobile_common_title_back, 0, R.string.mobile_common_network_config);
title.setOnTitleClickListener(this);
return title;
}
@Override
protected void initView() {
super.initView();
mWifiSSIDTv = (TextView) findViewById(R.id.device_wifi_ssid);
mDoneBtn = (Button) findViewById(R.id.device_wifi_password_done_btn);
mWifiPasswordEdt = (ClearPasswordEditText) findViewById(R.id.device_wifi_password);
mWifiSSIDTv.setText(mPresenter.getWifiSSID());
mDoneBtn.setOnClickListener(this);
mWifiPasswordEdt.addTextChangedListener(mTextWatcher);
mSaveWifiPwdCheckbox = (TextView) findViewById(R.id.wifi_pwd_check);
mSaveWifiPwdCheckbox.setOnClickListener(this);
String savePassword = mPresenter.getSavedWifiPassword();
boolean wifiCheckBoxStatus = mPresenter.getSavedWifiCheckBoxStatus();
if (!TextUtils.isEmpty(savePassword)) {
mWifiPasswordEdt.setText(savePassword);
mWifiPasswordEdt.setSelection(savePassword.length());
}
mSaveWifiPwdCheckbox.setSelected(wifiCheckBoxStatus);
mWifiImg = (ImageView) findViewById(R.id.wifi_img);
mWifiImg.setImageResource(mPresenter.getSupport5G() ? R.drawable.adddevice_icon_wifipassword_nosupport5g : R.drawable.adddevice_icon_wifipassword_nosupport5g);
m5GWifiTipTv = findViewById(R.id.tv_5g_tip);
m5GWifiTipTv.setOnClickListener(this);
m5GWifiTipTv.setVisibility(mPresenter.getSupport5G() ? View.GONE : View.VISIBLE);
}
@Override
public void initPresenter() {
mPresenter = (T) new DeviceWifiPasswordPresenter<>(this);
}
@Override
protected void initData() {
mPresenter.dispatchIntentData(getIntent());
}
@Override
public void onCommonTitleClick(int id) {
switch (id) {
case CommonTitle.ID_LEFT:
DeviceWifiPasswordActivity.this.finish();
break;
}
}
@Override
public String getWifiPassword() {
return mWifiPasswordEdt.getText().toString();
}
@Override
public boolean isSavePwdChecked() {
return mSaveWifiPwdCheckbox.isSelected();
}
@Override
public void onWifiOperateSucceed(CurWifiInfo curWifiInfo) {
DeviceWifiPasswordActivity.this.finish();
}
@Override
public void onClick(View view) {
int viewId = view.getId();
if (viewId == R.id.device_wifi_password_done_btn) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(
Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(mWifiPasswordEdt.getWindowToken(), 0);
mWifiPasswordEdt.postDelayed(new Runnable() {
@Override
public void run() {
mPresenter.updateWifiCache();
mPresenter.wifiOperate();
}
}, 100);
} else if (viewId == R.id.wifi_pwd_check) {
view.setSelected(!view.isSelected());
if (!view.isSelected()) {
mPresenter.updateWifiCache();
}
} else if (viewId == R.id.tv_5g_tip) {
Intent intent = new Intent(this, ErrorTipActivity.class);
intent.putExtra(ERROR_PARAMS, 1);
startActivity(intent);
}
}
}

View File

@ -0,0 +1,21 @@
package com.mm.android.deviceaddmodule.device_wifi;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBasePresenter;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBaseView;
public interface DeviceWifiPasswordConstract {
interface Presenter extends IBasePresenter {
void wifiOperate();
String getWifiSSID();
void updateWifiCache();
String getSavedWifiPassword();
boolean getSavedWifiCheckBoxStatus();
boolean getSupport5G();
}
interface View extends IBaseView {
String getWifiPassword();
boolean isSavePwdChecked();
void onWifiOperateSucceed(CurWifiInfo curWifiInfo);
}
}

View File

@ -0,0 +1,104 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Intent;
import android.os.Handler;
import com.mm.android.deviceaddmodule.LCDeviceEngine;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessException;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessRunnable;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.DHBaseHandler;
import com.mm.android.deviceaddmodule.mobilecommon.businesstip.HandleMessageCode;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.utils.PreferencesHelper;
import com.mm.android.deviceaddmodule.openapi.DeviceAddOpenApiManager;
public class DeviceWifiPasswordPresenter<T extends DeviceWifiPasswordConstract.View> extends BasePresenter<T> implements DeviceWifiPasswordConstract.Presenter {
public String WIFI_SAVE_PREFIX = LCDeviceEngine.newInstance().userId + "_WIFI_ADD_";
public String WIFI_CHECKBOX_SAVE_PREFIX = LCDeviceEngine.newInstance().userId + "_WIFI_CHECKBOX_ADD_";
protected String mDeviceId;
protected WifiInfo mWifiInfo;
private DHBaseHandler mWifiOperateHandler;
protected boolean support5G = false;
public DeviceWifiPasswordPresenter(T view) {
super(view);
initModel();
}
protected void initModel() {
}
@Override
public void dispatchIntentData(Intent intent) {
if (intent != null && intent.getExtras() != null) {
mDeviceId = intent.getStringExtra(LCConfiguration.Device_ID);
mWifiInfo = (WifiInfo) intent.getSerializableExtra(DeviceConstant.IntentKey.DEVICE_WIFI_CONFIG_INFO);
support5G = intent.getBooleanExtra(LCConfiguration.SUPPORT_5G, false);
}
}
@Override
public boolean getSupport5G() {
return support5G;
}
@Override
public void updateWifiCache() {
if (mView.get().isSavePwdChecked()) {
PreferencesHelper.getInstance(mView.get().getContextInfo()).set(WIFI_SAVE_PREFIX + mWifiInfo.getSsid(), mView.get().getWifiPassword());
PreferencesHelper.getInstance(mView.get().getContextInfo()).set(WIFI_CHECKBOX_SAVE_PREFIX + mWifiInfo.getSsid(), true);
} else {
PreferencesHelper.getInstance(mView.get().getContextInfo()).set(WIFI_SAVE_PREFIX + mWifiInfo.getSsid(), "");
PreferencesHelper.getInstance(mView.get().getContextInfo()).set(WIFI_CHECKBOX_SAVE_PREFIX + mWifiInfo.getSsid(), false);
}
}
@Override
public String getSavedWifiPassword() {
return PreferencesHelper.getInstance(mView.get().getContextInfo()).getString(WIFI_SAVE_PREFIX + mWifiInfo.getSsid());
}
@Override
public boolean getSavedWifiCheckBoxStatus() {
return PreferencesHelper.getInstance(mView.get().getContextInfo()).getBoolean(WIFI_CHECKBOX_SAVE_PREFIX + mWifiInfo.getSsid());
}
@Override
public void wifiOperate() {
new BusinessRunnable(mWifiOperateHandler) {
@Override
public void doBusiness() throws BusinessException {
try {
DeviceAddOpenApiManager.controlDeviceWifi(LCDeviceEngine.newInstance().accessToken, mDeviceId, mWifiInfo.getSsid(), mWifiInfo.getBSSID(), true, mView.get().getWifiPassword());
mWifiOperateHandler.obtainMessage(HandleMessageCode.HMC_SUCCESS, true).sendToTarget();
} catch (BusinessException e) {
throw e;
}
}
};
mView.get().showToastInfo(R.string.device_manager_wifi_connetting_tip);
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mView.get().onWifiOperateSucceed(null);
}
}, 3000);
}
@Override
public String getWifiSSID() {
if (mWifiInfo == null)
return "";
return mWifiInfo.getSsid();
}
@Override
public void unInit() {
}
}

View File

@ -0,0 +1,87 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.graphics.Paint;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.BaseManagerFragmentActivity;
import com.mm.android.deviceaddmodule.mobilecommon.common.PermissionHelper;
import com.mm.android.deviceaddmodule.mobilecommon.widget.CommonTitle;
/**
* 设备wifi列表界面
*/
public class ErrorTipActivity extends BaseManagerFragmentActivity implements CommonTitle.OnTitleClickListener {
public static String ERROR_PARAMS = "error_params";
private ImageView imageView;
private TextView textView;
private TextView textView1;
private TextView mHelpLinkTxt,mHelpPhoneTv;
int errorcode;
private PermissionHelper mPermissionHelper;
@Override
protected void initLayout() {
setContentView(R.layout.activity_error_tip);
}
@Override
protected View initTitle() {
CommonTitle title = (CommonTitle) findViewById(R.id.error_tip_title);
title.initView(R.drawable.mobile_common_title_back, 0, R.string.mobile_common_network_config);
title.setOnTitleClickListener(this);
return title;
}
@Override
protected void initView() {
super.initView();
imageView = findViewById(R.id.tip_img);
textView = findViewById(R.id.tip_txt);
textView1 = findViewById(R.id.tip_txt_1);
mHelpLinkTxt = findViewById(R.id.help_link);
mHelpLinkTxt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ProviderManager.getDeviceAddCustomProvider().goFAQWebview(ErrorTipActivity.this);
}
});
mHelpPhoneTv = findViewById(R.id.tv_help_phone);
mHelpPhoneTv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
mHelpPhoneTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
if (errorcode == 1) {
imageView.setBackgroundResource(R.drawable.adddevice_icon_wifiexplain);
textView1.setVisibility(View.VISIBLE);
textView.setText(R.string.add_device_tip_not_support_5g_1);
} else if (errorcode == 2) {
imageView.setBackgroundResource(R.drawable.adddevice_icon_wifiexplain_choosewifi);
textView.setText(R.string.add_device_tip_wifi_name);
}
}
@Override
protected void initData() {
errorcode = getIntent().getIntExtra(ERROR_PARAMS, 0);
}
@Override
public void onCommonTitleClick(int id) {
switch (id) {
case CommonTitle.ID_LEFT:
ErrorTipActivity.this.finish();
break;
}
}
}

View File

@ -0,0 +1,112 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Context;
import android.content.Intent;
import android.text.Editable;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.BaseManagerFragmentActivity;
import com.mm.android.deviceaddmodule.mobilecommon.widget.ClearEditText;
import com.mm.android.deviceaddmodule.mobilecommon.widget.ClearPasswordEditText;
import com.mm.android.deviceaddmodule.mobilecommon.widget.CommonTitle;
import static com.mm.android.deviceaddmodule.device_wifi.ErrorTipActivity.ERROR_PARAMS;
public class HiddenWifiActivity<T extends HiddenWifiConstract.Presenter>
extends BaseManagerFragmentActivity<T> implements HiddenWifiConstract.View {
private TextView mNext;
private ClearEditText mWifiName;
private ClearPasswordEditText mWifiPsw;
@Override
protected View initTitle() {
CommonTitle title = findViewById(R.id.device_hidden_title);
title.initView(R.drawable.mobile_common_title_back, 0, R.string.device_manager_wifi_title);
title.setOnTitleClickListener(new CommonTitle.OnTitleClickListener() {
@Override
public void onCommonTitleClick(int id) {
if (id == CommonTitle.ID_LEFT) {
HiddenWifiActivity.this.finish();
}
}
});
return title;
}
@Override
protected void initLayout() {
setContentView(R.layout.activity_device_hidden_wifi);
}
protected void initView() {
super.initView();
mWifiName = findViewById(R.id.wifi_name);
mWifiPsw = findViewById(R.id.wifi_psw);
mNext = findViewById(R.id.next);
mNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(
Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(mWifiPsw.getWindowToken(), 0);
mWifiPsw.postDelayed(new Runnable() {
@Override
public void run() {
mPresenter.wifiOperate();
}
}, 100);
}
});
findViewById(R.id.tv_5g_tip).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(HiddenWifiActivity.this, ErrorTipActivity.class);
intent.putExtra(ERROR_PARAMS, 1);
startActivity(intent);
}
});
mWifiName.addTextChangedListener(new SimpleTextChangedListener() {
@Override
public void afterTextChanged(Editable s) {
mNext.setEnabled(s.length()>0);
}
});
}
@Override
public void initPresenter() {
mPresenter = (T) new HiddenWifiPresenter<>(this);
}
@Override
protected void initData() {
mPresenter.dispatchIntentData(getIntent());
}
@Override
public String getWifiSSID() {
return mWifiName.getText().toString().trim();
}
@Override
public String getWifiPassword() {
return mWifiPsw.getText().toString().trim();
}
@Override
public void onWifiOperateSucceed(CurWifiInfo curWifiInfo) {
finish();
}
}

View File

@ -0,0 +1,16 @@
package com.mm.android.deviceaddmodule.device_wifi;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBasePresenter;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBaseView;
public interface HiddenWifiConstract {
interface Presenter extends IBasePresenter {
void wifiOperate();
}
interface View extends IBaseView {
String getWifiSSID();
String getWifiPassword();
void onWifiOperateSucceed(CurWifiInfo curWifiInfo);
}
}

View File

@ -0,0 +1,68 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.content.Intent;
import android.os.Handler;
import com.mm.android.deviceaddmodule.LCDeviceEngine;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessException;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.BusinessRunnable;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.DHBaseHandler;
import com.mm.android.deviceaddmodule.mobilecommon.businesstip.HandleMessageCode;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.openapi.DeviceAddOpenApiManager;
public class HiddenWifiPresenter<T extends HiddenWifiConstract.View> extends BasePresenter<T> implements HiddenWifiConstract.Presenter {
protected String mDeviceId;
private DHBaseHandler mWifiOperateHandler;
public HiddenWifiPresenter(T view) {
super(view);
initModel();
}
protected void initModel() {
}
@Override
public void dispatchIntentData(Intent intent) {
if (intent != null && intent.getExtras() != null) {
mDeviceId = intent.getStringExtra(LCConfiguration.Device_ID);
}
}
@Override
public void wifiOperate() {
if (mView.get().getWifiSSID().equalsIgnoreCase("")) {
return;
}
new BusinessRunnable(mWifiOperateHandler) {
@Override
public void doBusiness() throws BusinessException {
try {
DeviceAddOpenApiManager.controlDeviceWifi(LCDeviceEngine.newInstance().accessToken, mDeviceId, mView.get().getWifiSSID(),"", true, mView.get().getWifiPassword());
mWifiOperateHandler.obtainMessage(HandleMessageCode.HMC_SUCCESS, true).sendToTarget();
} catch (BusinessException e) {
throw e;
}
}
};
mView.get().showToastInfo(R.string.device_manager_wifi_connetting_tip);
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mView.get().onWifiOperateSucceed(null);
}
}, 3000);
}
@Override
public void unInit() {
}
}

View File

@ -0,0 +1,23 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.text.Editable;
import android.text.TextWatcher;
public class SimpleTextChangedListener implements TextWatcher{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
}

View File

@ -0,0 +1,95 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.text.TextUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 设备管理相关工具类
*
*/
public class Utils4DeviceManager {
public static String wifiPwdFilter(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
String chinese1 = "[\u2E80-\uA4CF]";
String chinese2 = "[\uF900-\uFAFF]";
String chinese3 = "[\uFE30-\uFE4F]";
for (int i = 0; i < str.length(); i++) {
String temp = str.substring(i, i + 1);
if (temp.matches(chinese1) || temp.matches(chinese2) || temp.matches(chinese3)) {
str = str.replace(temp, "");
return wifiPwdFilter(str);
}
}
return str;
}
public static String replaceSpecial(String source,
List<String> filterStringList) {
for (String s : filterStringList) {
if (source.contains(s)) {
return source.replaceAll(s, "");
}
}
return source;
}
// 转换从服务获取的timeInfo
public static long convertTimeInfo(String time){
// 服务时间格式"THHMMSS" 现转换时的格式"HHMM"
if(time.length() == 4){
long hour = Long.valueOf(time.substring(0, 2));
long min = Long.valueOf(time.substring(2, time.length()));
return hour * 3600 + min * 60;
}
return 0;
}
public static String getServerBeginTime(int hour, int minute) {
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.set(Calendar.SECOND, 0);
beginCalendar.set(Calendar.HOUR_OF_DAY, hour);
beginCalendar.set(Calendar.MINUTE, minute);
SimpleDateFormat format = new SimpleDateFormat("HHmmss");
Date date = beginCalendar.getTime();
String time = format.format(date);
return "T" + time;
}
public static String getServerEndTime(int hour, int minute) {
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.set(Calendar.SECOND, 59);
beginCalendar.set(Calendar.HOUR_OF_DAY, hour);
beginCalendar.set(Calendar.MINUTE, minute);
SimpleDateFormat format = new SimpleDateFormat("HHmmss");
Date date = beginCalendar.getTime();
String time = format.format(date);
return "T" + time;
}
public static Calendar resolveTime(String time){
time = time.substring(1);
SimpleDateFormat format = new SimpleDateFormat("HHmmss");
Date date = null;
try {
date = format.parse(time);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar calendar = Calendar.getInstance();
if(date != null){
calendar.setTime(date);
}
return calendar;
}
}

View File

@ -0,0 +1,42 @@
package com.mm.android.deviceaddmodule.device_wifi;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.Serializable;
import java.util.List;
/**
* Wifi配置信息
*/
public class WifiConfig implements Serializable {
public static class Response {
public WifiConfig data;
public void parseData(JsonObject json) {
Gson gson = new Gson();
this.data = gson.fromJson(json.toString(), WifiConfig.class);
}
}
//设备是否开启WIFItrue:开启false:关闭
private boolean enable;
//设备搜索到的wifi列表
private List<WifiInfo> wLan;
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
public List<WifiInfo> getwLan() {
return wLan;
}
public void setwLan(List<WifiInfo> wLan) {
this.wLan = wLan;
}
}

View File

@ -0,0 +1,79 @@
package com.mm.android.deviceaddmodule.device_wifi;
import android.support.annotation.StringDef;
import java.io.Serializable;
import java.lang.annotation.Retention;
import static com.mm.android.deviceaddmodule.device_wifi.WifiInfo.Status.connected;
import static com.mm.android.deviceaddmodule.device_wifi.WifiInfo.Status.connecting;
import static com.mm.android.deviceaddmodule.device_wifi.WifiInfo.Status.unconnected;
import static java.lang.annotation.RetentionPolicy.SOURCE;
/**
* Wifi状态信息
*/
public class WifiInfo implements Serializable {
//该WIFI的唯一标示符通常是一个MAC地址
private String bssid ;
//若连接了热点填热点的名称若未连接填空
private String ssid;
//连接状态unconnected未连接connecting连接中connected已连接
private String linkStatus;
//强度, 0最弱5最强
private int intensity;
//WIFI认证模式OPENWEPWPA/WPA2 PSKWPA/WPA2
private String auth;
@Retention(SOURCE)
@StringDef({unconnected, connecting, connected,""})
public @interface Status {
String unconnected = "unconnected"; //未连接
String connecting = "connecting"; //连接中
String connected = "connected"; //已连接
}
public String getBSSID() {
return bssid;
}
public String getBssid() {
return bssid;
}
public void setBssid(String bssid) {
this.bssid = bssid;
}
public String getSsid() {
return ssid;
}
public void setSsid(String ssid) {
this.ssid = ssid;
}
public String getLinkStatus() {
return linkStatus;
}
public void setLinkStatus(String linkStatus) {
this.linkStatus = linkStatus;
}
public int getIntensity() {
return intensity;
}
public void setIntensity(int intensity) {
this.intensity = intensity;
}
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
}

View File

@ -0,0 +1,39 @@
package com.mm.android.deviceaddmodule.entity;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
/**
* 封装DEVICE_NET_INFO_EX
*/
public class DeviceNetInfo {
private DEVICE_NET_INFO_EX mDevNetInfoEx;
private boolean mIsValid;
public DeviceNetInfo(DEVICE_NET_INFO_EX devNetInfoEx) {
mDevNetInfoEx = devNetInfoEx;
mIsValid = true;
}
public DEVICE_NET_INFO_EX getDevNetInfoEx() {
return mDevNetInfoEx;
}
public void setDevNetInfoEx(DEVICE_NET_INFO_EX devNetInfoEx) {
this.mDevNetInfoEx = devNetInfoEx;
}
public boolean isValid() {
return mIsValid;
}
public void setValid(boolean isValid) {
this.mIsValid = isValid;
}
@Override
public String toString() {
return "byInitStatus:" + mDevNetInfoEx.byInitStatus + "bySpecialAbility:" + mDevNetInfoEx.bySpecialAbility;/*.append(":").append(mDevNetInfoEx)*/
}
}

View File

@ -0,0 +1,75 @@
package com.mm.android.deviceaddmodule.entity;
import java.io.Serializable;
public class WlanInfo implements Serializable {
/**
* 序列化ID
*/
private static final long serialVersionUID = 1L;
private String wlanSSID; //wifi名称
private int wlanQuality; //wifi信号
private int wlanEncry; //加密方式
private int wlanAuthMode; //当wlanAuthMode和wlanEncrAlgr都为0时就是不需要密码
private int wlanEncrAlgr;
private String wlanPassword; //wifi密码
private String wlanBSSID; //wifi Mac地址
public int getWlanQuality() {
return wlanQuality;
}
public void setWlanQuality(int wlanQuality) {
this.wlanQuality = wlanQuality;
}
public String getWlanSSID() {
return wlanSSID;
}
public void setWlanSSID(String wlanSSID) {
this.wlanSSID = wlanSSID;
}
public int getWlanEncry() {
return wlanEncry;
}
public void setWlanEncry(int wlanEncry) {
this.wlanEncry = wlanEncry;
}
public String getWlanPassword() {
return wlanPassword;
}
public void setWlanPassword(String wlanPassword) {
this.wlanPassword = wlanPassword;
}
public int getWlanAuthMode() {
return wlanAuthMode;
}
public void setWlanAuthMode(int wlanAuthMode) {
this.wlanAuthMode = wlanAuthMode;
}
public int getWlanEncrAlgr() {
return wlanEncrAlgr;
}
public void setWlanEncrAlgr(int wlanEncrAlgr) {
this.wlanEncrAlgr = wlanEncrAlgr;
}
public String getWlanBSSID() {
return wlanBSSID;
}
public void setWlanBSSID(String wlanBSSID) {
this.wlanBSSID = wlanBSSID;
}
}

View File

@ -0,0 +1,49 @@
package com.mm.android.deviceaddmodule.event;
import android.os.Bundle;
import com.mm.android.deviceaddmodule.mobilecommon.eventbus.event.BaseEvent;
/**
* 设备添加消息通信类
**/
public class DeviceAddEvent extends BaseEvent {
//EVENT ACTION
public static String TITLE_MODE_ACTION="title_mode_action"; //标题栏模式控制
public static String CONFIG_PAGE_NAVIGATION_ACTION="config_page_navigation_action"; //添加流程页跳转通知
public static String SOFTAP_REFRSH_WIFI_LIST="softap_refresh_wifi_list"; //软AP刷新wifi列表
public static String SOFTAP_REFRSH_WIFI_LIST_DISABLE_ACTION ="softap_refresh_wifi_list_disable_action"; //软AP刷新wifi列表按钮置灰
public static String SOFTAP_REFRSH_WIFI_LIST_ENABLE_ACTION ="softap_refresh_wifi_list_enable_action"; //软AP刷新wifi列表按钮高亮
public static String SHOW_LOADING_VIEW_ACTION="show_loading_view_action"; //显示加载框
public static String DISMISS_LOADING_VIEW_ACTION="dismiss_loading_view_action"; //隐藏加载框
public static String CHANGE_TO_WIRELESS_ACTION="change_to_wireless_action"; //切换到无线
public static String CHANGE_TO_WIRED_ACTION="change_to_wired_action"; //切换到有线
public static String CHANGE_TO_SOFTAP_ACTION="change_to_softap_action"; //切换到软AP
public static String SHOW_TYPE_CHOSE_ACTION="show_type_chose_action"; //切换到软AP
public static String REFRESH_BATTERY_CAMERA_LIST = "refresh_battery_camera_list"; //更新电池相机列表
public static String DESTROY_ACTION = "destroy_action"; //销毁设备添加使用的缓存数据
public static String OFFLINE_CONFIG_SUCCESS_ACTION = "offline_config_success"; //离线配网成功
//EVENT KEY
public interface KEY{
String TITLE_MODE="title_mode"; //标题栏模式
}
Bundle bundle;
public DeviceAddEvent(String code) {
super(code);
}
public DeviceAddEvent(String code,Bundle bundle){
super(code);
this.bundle=bundle;
}
public Bundle getBundle() {
return bundle;
}
public void setBundle(Bundle bundle) {
this.bundle = bundle;
}
}

View File

@ -0,0 +1,42 @@
package com.mm.android.deviceaddmodule.helper;
import android.app.Activity;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
public class ActivityHelper {
public static Activity getCurrentActivity () {
try {
Class activityThreadClass = Class.forName("android.app.ActivityThread");
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(
null);
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
activitiesField.setAccessible(true);
Map activities = (Map) activitiesField.get(activityThread);
for (Object activityRecord : activities.values()) {
Class activityRecordClass = activityRecord.getClass();
Field pausedField = activityRecordClass.getDeclaredField("paused");
pausedField.setAccessible(true);
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Activity activity = (Activity) activityField.get(activityRecord);
return activity;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,439 @@
package com.mm.android.deviceaddmodule.helper;
import android.annotation.TargetApi;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import com.company.NetSDK.CFG_NETAPP_WLAN;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.company.NetSDK.FinalVar;
import com.company.NetSDK.INetSDK;
import com.dahua.mobile.utility.network.DHWifiUtil;
import com.mm.android.deviceaddmodule.LcnDeviceAddActivity;
import com.mm.android.deviceaddmodule.event.DeviceAddEvent;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceAbility;
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
import com.mm.android.deviceaddmodule.mobilecommon.p2pDevice.P2PErrorHelper;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import com.mm.android.deviceaddmodule.model.DeviceAddModel;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONException;
import org.json.JSONObject;
public class DeviceAddHelper {
public static final String DEVICE_MODEL_NAME_PARAM= "device_model_name_param"; //设备市场型号
public static final int DEVICE_NAME_MAX_LENGTH = 20; //设备名长度限制
public static final int AP_NAME_MAX_LENGTH = 20; //配件名长度限制
public static final String AP_WIFI_NAME_DAP = "DAP-XXXX"; //软Ap通用设备热点名称
public static final String AP_WIFI_VERSION_V1 = "V1"; //软Ap wifi version版本
public static final String AP_WIFI_VERSION_V2 = "V2"; //软Ap wifi version版本
// 是否支持新声波二进制第1位0表示否1表示是
public static final int ALLOW_SoundWaveV2 = 1; // 0001
// 是否支持老声波二进制第2位0表示否1表示是
public static final int ALLOW_SoundWave = 1 << 1; // 0010
// 是否支持SmartConfig二进制第3位0表示否1表示是
public static final int ALLOW_SmartConfig = 1 << 2; // 0100
// 是否支持SoftAP二进制第4位0表示否1表示是
public static final int ALLOW_SoftAP = 1 << 3; // 1000
// 是否支持LAN二进制第4位0表示否1表示是
public static final int ALLOW_LAN = 1 << 4; // 10000
// 是否支持蓝牙二进制第4位0表示否1表示是
public static final int ALLOW_BT = 1 << 5; // 100000
public enum TitleMode {
// FLASH, //闪光灯
MORE, //更多
MORE2, //更多模式2
MORE3, //更多模式3
MORE4, //更多模式4
REFRESH, //刷新
BLANK, //空白
SHARE, //设备共享
FREE_CLOUD_STORAGE, //免费云存储
MODIFY_DEVICE_NAME //修改设备密码
}
public enum TimeoutDevTypeModel {
A_MODEL, //A系列
CK_MODEL, //CK系列
COMMON_MODEL, //通用设备
DOORBELL_MODEL, //门铃系列
AP_MODEL, //配件
OTHER_MODEL, //其他
TP1_MODEL, //TP1类型
TP1S_MODEL, //TP1S类型
G1_MODEL, //G1类型
K5_MODEL //门锁类型
}
//设备添加相关错误码
public interface ErrorCode {
//输入设备序列号流程相关错误码
int INPUT_SN_ERROR_BIND_BY_OTHER = 1000 + 1; //输入序列号时设备被其他用户绑定
int DEVICE_BIND_ERROR_BIND_BY_OTHER = 1000 + 2; //绑定时设备被其他用户绑定
int DEVICE_BIND_ERROR_NOT_SUPPORT_TO_BIND = 1000 + 3; //扫码选型号设备上线绑定时不支持绑定的设备类型
//设备选择流程相关错误码
int TYPE_CHOOSE_ERROR_1 = 2000;
//有线无线配置流程相关错误码
int WIRED_WIRELESS_ERROR_CONFIG_TIMEOUT = 3000 + 1; //配置超时
//软AP添加流程相关错误码
int SOFTAP_ERROR_CONNECT_HOT_FAILED = 4000 + 1; //连接设备热点失败
int SOFTAP_ERROR_CONNECT_WIFI_FAILED = 4000 + 2; //设备连接wifi失败
//设备初始化流程相关错误码
int INIT_ERROR_SERCRITY_CHECK_TIMEOUT = 5000 + 1; //安全检查超时
int INIT_ERROR_INIT_FAILED = 5000 + 2; //初始化失败
//连接云平台流程相关错误码
int CLOUND_CONNECT_ERROR_CONNECT_TIMEOUT = 6000 + 1; //连接超时
int CLOUND_CONNECT_QUERY_STATUS_TIMEOUT = 6000 + 2; //查询超时
//通用
int COMMON_ERROR_NOT_SUPPORT_5G = 7000 + 1; //不支持5G
int COMMON_ERROR_NOT_SUPPORT_RESET = 7000 + 2; //重置设备
int COMMON_ERROR_NOT_SUPPORT_HUB_AP_RESET = 7000 + 3; //重置设备
int COMMON_ERROR_NOT_SUPPORT_HUB_RESET = 7000 + 4; //重置设备
int COMMON_ERROR_DEVICE_LOCKED = 7000 + 5; //设备锁定
int COMMON_ERROR_RED_ROTATE = 7000 + 6; //红灯旋转
int COMMON_ERROR_RED_ALWAYS = 7000 + 7; //红灯长亮
int COMMON_ERROR_RED_FLASH = 7000 + 8; //红灯闪烁
int COMMON_ERROR_DEVICE_BIND_MROE_THAN_TEN = 7000 + 9; //超过10次
int COMMON_ERROR_DEVICE_MROE_THAN_TEN_TWICE = 7000 + 10; //再次超过10次
int COMMON_ERROR_DEVICE_IP_ERROR = 7000 + 11; //IP
int COMMON_ERROR_DEVICE_SN_CODE_CONFLICT = 7000 + 12; //串号
int COMMON_ERROR_DEVICE_SN_OR_IMEI_NOT_MATCH = 7000 + 13; //imei和device id不匹配
int COMMON_ERROR_ABOUT_WIFI_PWD = 7000 + 14; //关于WIFI密码
int COMMON_ERROR_CONNECT_FAIL = 7000 + 15; //软AP连接失败
int COMMON_ERROR_WIFI_NAME = 7000 + 16; //软AP连接失败
//配件
int AP_ERROR_PAIR_TIMEOUT = 8000 + 2; //配对超时
}
//OMS配置key
public interface OMSKey {
final static String ERROR_TIPS_TYPE = "ErrorTipsType";
final static String ERROR_WIFI_TIPS_TYPE = "WifiErrorTipsType"; //有线无线配网错误页面模式
final static String ERROR_SOFTAP_TIPS_TYPE = "SoftAPErrorTipsType"; //软AP配网错误页面模式
final static String ERROR_ACCESSORY_TIPS_TYPE = "AccessoryErrorTipsType"; //配件配网错误页面模式
//有线无线
final static String WIFI_MODE_GUIDING_LIGHT_IMAGE = "WifiModeGuidingLightImage";
final static String WIFI_MODE_CONFIG_INTRODUCTION = "WifiModeConfigIntroduction";
final static String WIFI_MODE_CONFIG_CONFIRM_INTRODUCTION = "WifiModeConfigConfirmIntroduction";
final static String WIFI_MODE_RESET_GUIDE_INTRODUCTION = "WifiModeResetGuideIntroduction";
final static String WIFI_MODE_RESET_IMAGE = "WifiModeResetImage";
final static String WIFI_MODE_RESET_OPERATION_INTRODUCTION = "WifiModeResetOperationIntroduction";
final static String WIFI_MODE_FINISH_DEVICE_IMAGE = "WifiModeFinishDeviceImage";
//软AP
final static String SOFT_AP_MODE_WIFI_NAME = "SoftAPModeWifiName";
final static String SOFT_AP_MODE_GUIDING_STEP_ONE_IMAGE = "SoftAPModeGuidingStepOneImage";
final static String SOFT_AP_MODE_GUIDING_STEP_ONE_INTRODUCTION = "SoftAPModeGuidingStepOneIntroduction";
final static String SOFT_AP_MODE_GUIDING_STEP_TWO_IMAGE = "SoftAPModeGuidingStepTwoImage";
final static String SOFT_AP_MODE_GUIDING_STEP_TWO_INTRODUCTION = "SoftAPModeGuidingStepTwoIntroduction";
final static String SOFT_AP_MODE_GUIDING_STEP_THREE_IMAGE = "SoftAPModeGuidingStepThreeImage";
final static String SOFT_AP_MODE_GUIDING_STEP_THREE_INTRODUCTION = "SoftAPModeGuidingStepThreeIntroduction";
final static String SOFT_AP_MODE_GUIDING_STEP_FOUR_IMAGE = "SoftAPModeGuidingStepFourImage";
final static String SOFT_AP_MODE_GUIDING_STEP_FOUR_INTRODUCTION = "SoftAPModeGuidingStepFourIntroduction";
final static String SOFT_AP_MODE_RESET_GUIDE_INTRODUCTION = "SoftAPModeResetGuideIntroduction";
final static String SOFT_AP_MODE_RESET_IMAGE = "SoftAPModeResetImage";
final static String SOFT_AP_MODE_RESET_OPERATION_INTRODUCTION = "SoftAPModeResetOperationIntroduction";
final static String SOFT_AP_MODE_RESULT_PROMPT_IMAGE = "SoftAPModeResultPromptImage";
final static String SOFT_AP_MODE_RESULT_INTRODUCTION = "SoftAPModeResultIntroduction";
final static String SOFT_AP_MODE_CONFIRM_INTRODUCTION = "SoftAPModeConfirmIntroduction";
final static String SOFT_AP_MODE_WIFI_VERSION = "SoftAPModeWifiVersion";
//配件
final static String ACCESSORY_MODE_PAIR_STATUS_IMAGE = "AccessoryModePairStatusImage";
final static String ACCESSORY_MODE_PAIR_OPERATION_INTRODUCTION = "AccessoryModePairOperationIntroduction";
final static String ACCESSORY_MODE_PAIR_CONFIRM_INTRODUCTION = "AccessoryModePairConfirmIntroduction";
final static String ACCESSORY_MODE_RESET_GUIDE_INTRODUCTION = "AccessoryModeResetGuideIntroduction";
final static String ACCESSORY_MODE_RESET_IMAGE = "AccessoryModeResetImage";
final static String ACCESSORY_MODE_RESET_OPERATION_INTRODUCTION = "AccessoryModeResetOperationIntroduction";
final static String ACCESSORY_MODE_FINISH_DEVICE_IMAGE = "AccessoryModeFinishDeviceImage";
//Hub
final static String HUB_MODE_PAIR_STATUS_IMAGE = "HubModePairStatusImage";
final static String HUB_MODE_PAIR_OPERATION_INTRODUCTION = "HubModePairOperationIntroduction";
final static String HUB_MODE_RESET_GUIDE_INTRODUCTION = "HubModeResetGuideIntroduction";
final static String HUB_MODE_RESET_IMAGE = "HubModeResetImage";
final static String HUB_MODE_RESET_OPERATION_INTRODUCTION = "HubModeResetOperationIntroduction";
final static String HUB_ACCESSORY_MODE_PAIR_STATUS_IMAGE = "HubAccessoryModePairStatusImage";
final static String HUB_ACCESSORY_MODE_PAIR_OPERATION_INTRODUCTION = "HubAccessoryModePairOperationIntroduction";
final static String HUB_ACCESSORY_MODE_RESET_GUIDE_INTRODUCTION = "HubAccessoryModeResetGuideIntroduction";
final static String HUB_ACCESSORY_MODE_RESET_IMAGE = "HubAccessoryModeResetImage";
final static String HUB_ACCESSORY_MODE_RESET_OPERATION_INTRODUCTION = "HubAccessoryModeResetOperationIntroduction";
final static String HUB_MODE_RESULT_PROMPT_IMAGE = "HUBModeResultPromptImage";
final static String HUB_MODE_RESULT_INTRODUCTION = "HUBModeResultIntroduction";
final static String HUB_MODE_CONFIRM_INTRODUCTION = "HUBModeConfirmIntroduction";
//设备本地配网
final static String LOCATION_MODE_OPERATION_IMAGE = "LocationOperationImages"; //引导图
final static String LOCATION_MODE_OPERATION_INTRODUCTION = "LocationOperationIntroduction"; //引导文案
final static String LOCATION_MODE_FINISH_DEVICE_IMAGE = "LocationModeFinishDeviceImage"; //添加完成正视图
// NB
final static String THIRD_PARTY_PLATFORM_MODE_GUIDING_LIGHT_IMAGE = "ThirdPartyPlatformModeGuidingLightImage"; //引导图
final static String THIRD_PARTY_PLATFORM_MODE_RESULT_PROMPT_IMAGE = "ThirdPartyPlatformModeResultPromptImage";
}
public static void updateTile(TitleMode titleMode) {
Bundle bundle = new Bundle();
bundle.putString(DeviceAddEvent.KEY.TITLE_MODE, titleMode.name());
EventBus.getDefault().post(new DeviceAddEvent(DeviceAddEvent.TITLE_MODE_ACTION, bundle));
}
//判断设备是否需要初始化
public static boolean isDeviceNeedInit(DEVICE_NET_INFO_EX device_net_info_ex) {
byte[] s = getByteArray(device_net_info_ex.byInitStatus);
// 设备初始化状态按位确定初始化状态
// bit0~10-老设备没有初始化功能 1-未初始化帐号 2-已初始化帐户
// bit2~30-老设备保留 1-公网接入未使能 2-公网接入已使能
// bit4~50-老设备保留 1-手机直连未使能 2-手机直连使能
if (s[s.length - 1] != 1) {
return false;
} else {
return true;
}
}
//判断设备是否已经初始化
public static boolean isDeviceInited(DEVICE_NET_INFO_EX device_net_info_ex) {
byte[] s = getByteArray(device_net_info_ex.byInitStatus);
// 设备初始化状态按位确定初始化状态
// bit0~10-老设备没有初始化功能 1-未初始化帐号 2-已初始化帐户
// bit2~30-老设备保留 1-公网接入未使能 2-公网接入已使能
// bit4~50-老设备保留 1-手机直连未使能 2-手机直连使能
if (s[s.length - 1] != 2) {
return false;
} else {
return true;
}
}
//判断设备是否支持初始化仅在软AP添加流程中使用为了兼容K5不支持初始化需要用默认用admin登录设备其余添加流程仅判断是否需要初始化即可需要的弹框用户输入不需要的跳过
public static boolean isDeviceSupportInit(DEVICE_NET_INFO_EX device_net_info_ex){
byte[] s = getByteArray(device_net_info_ex.byInitStatus);
// 设备初始化状态按位确定初始化状态
// bit0~10-老设备没有初始化功能 1-未初始化帐号 2-已初始化帐户
// bit2~30-老设备保留 1-公网接入未使能 2-公网接入已使能
// bit4~50-老设备保留 1-手机直连未使能 2-手机直连使能
if (s[s.length - 2] != 1) {
return false;
} else {
return true;
}
}
/**
* 获取配置3代协议
*
* @param loginHandle
* @param channelID
* @param strCommand
* @param BUFFERLEN
* @param stCfg
* @return
*/
public static boolean getNewDevConfig(long loginHandle, int channelID, String strCommand, int BUFFERLEN, CFG_NETAPP_WLAN stCfg, String requestId) {
boolean ret = false;
//netsdk 使用局限只能使用 类对象传递参数
Integer error = new Integer(0);
char szBuffer[] = new char[BUFFERLEN];
ret = INetSDK.GetNewDevConfig(loginHandle, strCommand, channelID, szBuffer, BUFFERLEN, error, 5 * 1000);
if (!ret) {
return false;
}
ret = INetSDK.ParseData(strCommand, szBuffer, stCfg, null);
if (!ret) {
return false;
}
return true;
}
/**
* 判断是否是设备用户名或密码错误
*
* @param error
*/
public static boolean isDevPwdError(int error) {
return (error == P2PErrorHelper.LOGIN_ERROR_KEY_OR_USER_MISMATCH
|| error == P2PErrorHelper.LOGIN_ERROR_KEY_MISMATCH
|| error == FinalVar.NET_LOGIN_ERROR_PASSWORD
|| error == FinalVar.NET_USER_FLASEPWD
|| error == FinalVar.NET_LOGIN_ERROR_USER_OR_PASSOWRD);
}
public static byte[] getByteArray(byte b) {
byte[] array = new byte[8];
for (int i = 7; i >= 0; i--) {
array[i] = (byte) (b & 1);
b = (byte) (b >> 1);
}
return array;
}
/**
* 字符过滤
* @param str
* @return
*/
public static String strDeviceNameFilter(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
StringBuilder builder = new StringBuilder();
String strEx = "^[a-zA-Z0-9\\-\u4E00-\u9FA5\\_\\@\\s]+";
for (int i = 0; i < str.length(); i++) {
String temp = str.substring(i, i + 1);
if (temp.matches(strEx)) {
builder.append(temp);
}
}
return builder.toString();
}
/**
* 支持sc码添加
* @param deviceAddInfo
* @return
*/
public static boolean isSupportAddBySc(DeviceAddInfo deviceAddInfo) {
if(deviceAddInfo == null) {
return false;
}
if(!TextUtils.isEmpty(deviceAddInfo.getSc()) && deviceAddInfo.getSc().length() == 8) {
return true;
}
if(deviceAddInfo.hasAbility(DeviceAbility.SCCode)) {
return true;
}
return false;
}
/**
* 支持SC码的设备使用SC码作为设备密码
*/
public static void setDevicePwdBySc() {
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
if(DeviceAddHelper.isSupportAddBySc(deviceAddInfo)) {
deviceAddInfo.setDevicePwd(deviceAddInfo.getSc());
}
}
/**
* 支持2代声波
* @param deviceAddInfo
* @return
*/
public static boolean isSupportSoundWaveV2(DeviceAddInfo deviceAddInfo) {
if(deviceAddInfo == null) {
return false;
}
return deviceAddInfo.getConfigMode() != null && deviceAddInfo.getConfigMode().contains(DeviceAddInfo.ConfigMode.SoundWaveV2.name());
}
public static String getJsonString(DeviceAddInfo deviceAddInfo, boolean offlineConfigType) {
JSONObject result = new JSONObject();
try {
result.put("SN", deviceAddInfo.getDeviceSn());
if(offlineConfigType) {
result.put("deviceModelName", deviceAddInfo.getDeviceModel());
} else {
result.put("SC", deviceAddInfo.getSc());
}
result.put("imeiCode", deviceAddInfo.getImeiCode());
} catch (JSONException e){
e.printStackTrace();
}
return result.toString();
}
// 打印错误码
public static int printError() {
int error = (INetSDK.GetLastError() & 0x7fffffff);
LogUtil.debugLog("DeviceAddHelper", "error:" + error);
return error;
}
public interface BindNetworkListener{
void onBindWifiListener();
}
/**
* 指定手机走wifi链路
*/
public static void bindNetwork(final BindNetworkListener bindNetworkListener){
final ConnectivityManager connectivityManager = (ConnectivityManager)
ProviderManager.getAppProvider().getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder = new NetworkRequest.Builder();
//set the transport type do WIFI
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onAvailable(Network network) {
LogUtil.debugLog(LcnDeviceAddActivity.TAG, "bindNetwork succuss");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(null);
connectivityManager.bindProcessToNetwork(network);
} else {
//This method was deprecated in API level 23
ConnectivityManager.setProcessDefaultNetwork(null);
ConnectivityManager.setProcessDefaultNetwork(network);
}
connectivityManager.unregisterNetworkCallback(this);
if(bindNetworkListener != null){
bindNetworkListener.onBindWifiListener();
}
}
});
}
}
/**
* 清除网络链路配置注意软ap调用过{@link #bindNetwork}需要在合适的时机释放否则无法连外网
*/
public static void clearNetWork(){
LogUtil.debugLog(LcnDeviceAddActivity.TAG, "clearNetWork succuss");
final ConnectivityManager connectivityManager = (ConnectivityManager)
ProviderManager.getAppProvider().getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(null);
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
//This method was deprecated in API level 23
ConnectivityManager.setProcessDefaultNetwork(null);
}
}
/**
* 连接之前的wifi
* @return
*/
public static void connectPreviousWifi(){
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
String previousSsid = deviceAddInfo.getPreviousSsid();
if(!TextUtils.isEmpty(previousSsid)) {
deviceAddInfo.setPreviousSsid("");
DHWifiUtil wifiUtil = new DHWifiUtil(ProviderManager.getAppProvider().getAppContext());
wifiUtil.connectWifi(previousSsid, "");
}
}
}

View File

@ -0,0 +1,27 @@
package com.mm.android.deviceaddmodule.helper;
import com.mm.android.deviceaddmodule.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
public class DeviceAddImageLoaderHelper {
public static DisplayImageOptions getCommonOptions() {
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.cacheOnDisk(true)
.showImageForEmptyUri(R.drawable.adddevice_default)
.showImageOnFail(R.drawable.adddevice_default)
.considerExifParams(true).cacheOnDisk(true).cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED).build();
return displayImageOptions;
}
public static DisplayImageOptions getCommonOptions4success() {
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.cacheOnDisk(true)
.showImageForEmptyUri(R.drawable.adddevice_icon_success_default)
.showImageOnFail(R.drawable.adddevice_icon_success_default)
.considerExifParams(true).cacheOnDisk(true).cacheInMemory(true)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED).build();
return displayImageOptions;
}
}

View File

@ -0,0 +1,28 @@
package com.mm.android.deviceaddmodule.helper;
import android.text.style.URLSpan;
import android.view.View;
import android.view.View.OnClickListener;
/**
* 自定义加下划线及点击事件的文字相关功能类
*/
class MyURLSpan extends URLSpan {
private OnClickListener mListener;
public MyURLSpan(String url) {
super(url);
}
public void setOnClickListener(OnClickListener listenr) {
// TODO Auto-generated method stub
mListener = listenr;
}
@Override
public void onClick(View widget) {
if (mListener != null) {
mListener.onClick(widget);
}
}
}

View File

@ -0,0 +1,842 @@
package com.mm.android.deviceaddmodule.helper;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.entity.WlanInfo;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.entity.AddApResult;
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
import com.mm.android.deviceaddmodule.model.DeviceAddModel;
import com.mm.android.deviceaddmodule.p_ap.ApBindSuccessFragment;
import com.mm.android.deviceaddmodule.p_ap.ApPairFragment;
import com.mm.android.deviceaddmodule.p_ap.GatewayListFragment;
import com.mm.android.deviceaddmodule.p_ap.TipApLightFragment;
import com.mm.android.deviceaddmodule.p_ap.TipApPowerFragment;
import com.mm.android.deviceaddmodule.p_ap.hubap.HubapGuide1Fragment;
import com.mm.android.deviceaddmodule.p_ap.hubap.HubapGuide2Fragment;
import com.mm.android.deviceaddmodule.p_ap.hubap.HubapGuide3Fragment;
import com.mm.android.deviceaddmodule.p_bindsuccess.BindSuccessFragment;
import com.mm.android.deviceaddmodule.p_cloudconnect.CloudConnectFragment;
import com.mm.android.deviceaddmodule.p_devicelocal.TipDeviceLocalFragment;
import com.mm.android.deviceaddmodule.p_devlogin.DevLoginFragment;
import com.mm.android.deviceaddmodule.p_devlogin.DevSecCodeFragment;
import com.mm.android.deviceaddmodule.p_errortip.ErrorTipFragment;
import com.mm.android.deviceaddmodule.p_init.InitFragment;
import com.mm.android.deviceaddmodule.p_init.SecurityCheckFragment;
import com.mm.android.deviceaddmodule.p_inputsn.DeviceDispatchFragment;
import com.mm.android.deviceaddmodule.p_inputsn.IMEIInputFragment;
import com.mm.android.deviceaddmodule.p_inputsn.ManualInputFragment;
import com.mm.android.deviceaddmodule.p_inputsn.ScanFragment;
import com.mm.android.deviceaddmodule.p_nb.TipNBFragment;
import com.mm.android.deviceaddmodule.p_offlineconfig.OfflineConfigFragment;
import com.mm.android.deviceaddmodule.p_softap.DevWifiListFragment;
import com.mm.android.deviceaddmodule.p_softap.HiddenWifiPwdFragment;
import com.mm.android.deviceaddmodule.p_softap.SoftApWifiPwdFragment;
import com.mm.android.deviceaddmodule.p_softap.TipSoftApConnectWifiFragment;
import com.mm.android.deviceaddmodule.p_softap.TipSoftApStep1Fragment;
import com.mm.android.deviceaddmodule.p_softap.TipSoftApStep2Fragment;
import com.mm.android.deviceaddmodule.p_softap.TipSoftApStep3Fragment;
import com.mm.android.deviceaddmodule.p_softap.TipSoftApStep4Fragment;
import com.mm.android.deviceaddmodule.p_softap.oversea.SoftApResultFragment;
import com.mm.android.deviceaddmodule.p_typechoose.TypeChooseFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.SmartConfigFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.TipLightFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.TipNetCablePluginFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.TipPowerFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.TipSameNetworkFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.TipSoundFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.TipWifiConnectFragment;
import com.mm.android.deviceaddmodule.p_wiredwireless.WifiPwdFragment;
/**
* 设备添加页面跳转帮助类
**/
public class PageNavigationHelper {
public static final String TIP_POWER_FRAGMENT_TAG = "tip_power_fragment";
public static final String WIFI_PWD_TAG = "wifi_pwd_fragment";
public static final String SOFT_AP_TIP_TAG = "soft_ap_tip_fragment";
public static final String AP_TIP_TAG = "ap_tip_fragment";
public static final String SECURITY_CHECK_TAG = "security_check_fragment";
private static void setFragmentAnimations(FragmentTransaction transaction, boolean anim) {
if (anim) {
transaction.setCustomAnimations(R.anim.slide_in_right,
R.anim.slide_out_left,
R.anim.slide_left_back_in,
R.anim.slide_right_back_out);
}
}
private static void setFragmentAnimations(FragmentTransaction transaction) {
setFragmentAnimations(transaction, true);
}
/**
* 跳转至二维码扫描页
*
* @param fragmentActivity
*/
public static void gotoScanPage(FragmentActivity fragmentActivity) {
if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
return;
}
ScanFragment fragment = ScanFragment.newInstance();
FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
transaction.add(R.id.content, fragment);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至二维码扫描页
*
* @param fragmentActivity
*/
public static void gotoDispatchPage(FragmentActivity fragmentActivity) {
if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
return;
}
DeviceDispatchFragment fragment = DeviceDispatchFragment.newInstance();
FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
transaction.add(R.id.content, fragment);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至手动输入序列号页
*
* @param from
*/
public static void gotoManualInputPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
ManualInputFragment fragment = ManualInputFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至输入imei页
*
* @param from
*/
public static void gotoIMEIInputPage(Fragment from, boolean anim) {
if (from == null || from.getFragmentManager() == null) {
return;
}
IMEIInputFragment fragment = IMEIInputFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoIMEIInputPage(Fragment from) {
gotoIMEIInputPage(from, true);
}
/**
* 跳转至设备类型选择页
*
* @param from
*/
public static void gotoTypeChoosePage(Fragment from, boolean anim) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TypeChooseFragment fragment = TypeChooseFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoTypeChoosePage(Fragment from) {
gotoTypeChoosePage(from, true);
}
/**
* 跳转至电源提示页
*
* @param from
* @param isWirelessConfig
*/
public static void gotoPowerTipPageNoAnim(Fragment from, boolean isWirelessConfig) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipPowerFragment fragment = TipPowerFragment.newInstance(isWirelessConfig);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(TIP_POWER_FRAGMENT_TAG);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至电源提示页
*
* @param from
* @param isWirelessConfig
*/
public static void gotoPowerTipPage(Fragment from, boolean isWirelessConfig) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipPowerFragment fragment = TipPowerFragment.newInstance(isWirelessConfig);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(TIP_POWER_FRAGMENT_TAG);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至网线提示页
*
* @param from
*/
public static void gotoNetCableTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipNetCablePluginFragment fragment = TipNetCablePluginFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至同一网络提示页
*
* @param from
*/
public static void gotoSameNetworkTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSameNetworkFragment fragment = TipSameNetworkFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至wifi连接提示页
*
* @param from
*/
public static void gotoWifiConnectTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipWifiConnectFragment fragment = TipWifiConnectFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转至wifi密码输入页
*
* @param parent 父fragment
* @param from
*/
public static void gotoWifiPwdPage(Fragment parent, Fragment from) {
if (parent == null || parent.getFragmentManager() == null) {
return;
}
WifiPwdFragment fragment = WifiPwdFragment.newInstance();
FragmentTransaction transaction = parent.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(WIFI_PWD_TAG);
transaction.commitAllowingStateLoss();
}
/**
* 跳转设备灯光提示页
*
* @param from
*/
public static void gotoLightTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipLightFragment fragment = TipLightFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转设备声音提示页
*
* @param from
*/
public static void gotoSoundTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoundFragment fragment = TipSoundFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转设备声音提示页
*
* @param from
*/
public static void gotoSmartConfigPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
SmartConfigFragment fragment = SmartConfigFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到安全检查页
*
* @param from
*/
public static void gotoSecurityCheckPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
SecurityCheckFragment fragment = SecurityCheckFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(SECURITY_CHECK_TAG);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到设备初始化页
*
* @param from
*/
public static void gotoInitPage(Fragment from, DEVICE_NET_INFO_EX device_net_info_ex) {
if (from == null || from.getFragmentManager() == null) {
return;
}
InitFragment fragment = InitFragment.newInstance(device_net_info_ex);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到云平台连接页
*
* @param from
*/
public static void gotoCloudConnectPage(Fragment from, boolean anim) {
if (from == null || from.getFragmentManager() == null) {
return;
}
CloudConnectFragment fragment = CloudConnectFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
}
public static void gotoCloudConnectPage(Fragment from) {
gotoCloudConnectPage(from, true);
}
/**
* 跳转到设备登录页
*
* @param from
*/
public static void gotoDevLoginPage(Fragment from, boolean anim) {
if (from == null || from.getFragmentManager() == null) {
return;
}
DevLoginFragment fragment = DevLoginFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
//离线进入的都认为走过初始化检查流程了都默认上报
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
}
public static void gotoDevLoginPage(Fragment from) {
gotoDevLoginPage(from, true);
}
/**
* 跳转到设备安全码验证页
*
* @param from
*/
public static void gotoDevSecCodePage(Fragment from, boolean anim) {
if (from == null || from.getFragmentManager() == null) {
return;
}
DevSecCodeFragment fragment = DevSecCodeFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoDevSecCodePage(Fragment from) {
gotoDevSecCodePage(from, true);
}
/**
* 跳转到绑定设备连接页
*
* @param from
*/
public static void gotoDeviceBindPage(Fragment from, boolean anim) {
if (from == null || from.getFragmentManager() == null) {
return;
}
CloudConnectFragment fragment = CloudConnectFragment.newInstance(true);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoDeviceBindPage(Fragment from) {
gotoDeviceBindPage(from, true);
}
/**
* 跳转到绑定成功提示页
*
* @param from
*/
public static void gotoBindSuccessPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
BindSuccessFragment fragment = BindSuccessFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
DeviceAddInfo deviceAddInfo = DeviceAddModel.newInstance().getDeviceInfoCache();
}
/**
* @param from
*/
public static void gotoErrorTipPage(Fragment from, int errorCode, boolean anim) {
ErrorTipFragment fragment = ErrorTipFragment.newInstance(errorCode);
if (from == null || from.getFragmentManager() == null) {
return;
}
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction, anim);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoErrorTipPage(Fragment from, int errorCode) {
gotoErrorTipPage(from, errorCode, true);
}
/**
* 跳转到到软Ap添加引导页
*
* @param from
*/
public static void gotoSoftApTipPage(Fragment from) {
gotoSoftApTip1Page(from);
}
public static void gotoSoftApTip1Page(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoftApStep1Fragment fragment = TipSoftApStep1Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(SOFT_AP_TIP_TAG);
transaction.commitAllowingStateLoss();
}
public static void gotoSoftApTipPageNoAnim(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoftApStep1Fragment fragment = TipSoftApStep1Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
transaction.replace(R.id.content, fragment, TipSoftApStep1Fragment.class.getName());
transaction.addToBackStack(SOFT_AP_TIP_TAG);
transaction.commitAllowingStateLoss();
}
public static void gotoSoftApTip2Page(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoftApStep2Fragment fragment = TipSoftApStep2Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoSoftApTip3Page(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoftApStep3Fragment fragment = TipSoftApStep3Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoSoftApTip4Page(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoftApStep4Fragment fragment = TipSoftApStep4Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
public static void gotoSoftApTipConnectWifiPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipSoftApConnectWifiFragment fragment = TipSoftApConnectWifiFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到软Ap添加wifi列表
*
* @param from
*/
public static void gotoSoftApWifiListPage(Fragment from, boolean isNotNeedLogin) {
if (from == null || from.getFragmentManager() == null) {
return;
}
DevWifiListFragment fragment = DevWifiListFragment.newInstance(isNotNeedLogin);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到软Ap添加wifi列表
*
* @param from
*/
public static void gotoSoftApWifiListPage(Fragment from) {
gotoSoftApWifiListPage(from, false);
}
/**
* 跳转到到软Ap添加wifi密码输入页
*
* @param from
*/
public static void gotoSoftApWifiPwdPage(Fragment from, WlanInfo wlanInfo, boolean isNotNeedLogin) {
if (from == null || from.getFragmentManager() == null) {
return;
}
SoftApWifiPwdFragment fragment = SoftApWifiPwdFragment.newInstance(wlanInfo, isNotNeedLogin);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到软Ap添加wifi密码输入页
*
* @param from
*/
public static void gotoHiddenWifiPwdPage(Fragment from, boolean isNotNeedLogin) {
if (from == null || from.getFragmentManager() == null) {
return;
}
HiddenWifiPwdFragment fragment = HiddenWifiPwdFragment.newInstance(isNotNeedLogin);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到软Ap添加wifi连接结果页海外
*
* @param from
*/
public static void gotoSoftApResultdPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
SoftApResultFragment fragment = SoftApResultFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到配件添加网关列表页
*
* @param from
*/
public static void gotoGatewayListPage(Fragment from, boolean hasSelectGateway) {
if (from == null || from.getFragmentManager() == null) {
return;
}
GatewayListFragment fragment = GatewayListFragment.newInstance(hasSelectGateway);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到配件电源引导页
*
* @param from
*/
public static void gotoApPowerTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipApPowerFragment fragment = TipApPowerFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(AP_TIP_TAG);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到配件电源引导页
*
* @param from
*/
public static void gotoApLightPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipApLightFragment fragment = TipApLightFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到配件配对页
*
* @param from
*/
public static void gotoApPairPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
ApPairFragment fragment = ApPairFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到到配件绑定成功页
*
* @param from
*/
public static void gotoApBindSuccessPage(Fragment from, AddApResult addApResult) {
if (from == null || from.getFragmentManager() == null) {
return;
}
ApBindSuccessFragment fragment = ApBindSuccessFragment.newInstance(addApResult);
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到电池相机配对引导页
*
* @param fragmentActivity
*/
public static void gotoHubGuide1Page(FragmentActivity fragmentActivity, String sn, String hubType) {
if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
return;
}
HubapGuide1Fragment fragment = HubapGuide1Fragment.newInstance(sn, hubType);
FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
transaction.add(R.id.content, fragment);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到电池相机配对引导页
*
* @param from
*/
public static void gotoHubGuide2Page(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
HubapGuide2Fragment fragment = HubapGuide2Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到hub灯提示页
*
* @param from
*/
public static void gotoHubGuide3Page(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
HubapGuide3Fragment fragment = HubapGuide3Fragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到NB设备添加引导页
*
* @param from
*/
public static void gotoNBTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipNBFragment fragment = TipNBFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到离线配网
*
* @param fragmentActivity
* @param sn
* @param devModelName
*/
public static void gotoOfflineConfigPage(FragmentActivity fragmentActivity, String sn, String devModelName, String imei) {
if (fragmentActivity == null || fragmentActivity.getSupportFragmentManager() == null) {
return;
}
OfflineConfigFragment fragment = OfflineConfigFragment.newInstance(sn, devModelName, imei);
FragmentTransaction transaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
transaction.add(R.id.content, fragment);
transaction.commitAllowingStateLoss();
}
public static void gotoDeviceSharePage(FragmentActivity fragmentActivity, String deviceSn) {
Bundle bundle = new Bundle();
bundle.putString(LCConfiguration.Device_ID, deviceSn);
ProviderManager.getAppProvider().goDeviceSharePage(fragmentActivity, bundle);
}
/**
* 跳转到设备本地配网引导页面
*
* @param from
*/
public static void gotoLocationTipPage(Fragment from) {
if (from == null || from.getFragmentManager() == null) {
return;
}
TipDeviceLocalFragment fragment = TipDeviceLocalFragment.newInstance();
FragmentTransaction transaction = from.getFragmentManager().beginTransaction();
setFragmentAnimations(transaction);
transaction.replace(R.id.content, fragment);
transaction.addToBackStack(null);
transaction.commitAllowingStateLoss();
}
/**
* 跳转到蓝牙模块
*/
public static void gotoAddBleLockPage(Bundle bundle) {
//TODO 不会有逻辑进入
}
}

View File

@ -0,0 +1,376 @@
package com.mm.android.deviceaddmodule.helper;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.support.v4.app.Fragment;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.view.View.OnClickListener;
import android.widget.TextView;
import com.company.NetSDK.DEVICE_NET_INFO_EX;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.dialog.LCAlertDialog;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 设备添加相关工具类
*
*/
public class Utils4AddDevice {
public static final int NETWORK_NONE = -1; // 无网络
public static final int NETWORK_WIFI = 0; // wifi
public static final int NETWORK_MOBILE = 1; // 数据网络
public static String strRegCodeFilter(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
String strEx = "[0-9A-Za-z]";
for (int i = 0; i < str.length(); i++) {
String temp = str.substring(i, i + 1);
if (!temp.matches(strEx)) {
str = str.replace(temp, "");
return strRegCodeFilter(str);
}
}
return str;
}
public static String wifiPwdFilter(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
// TD:20780
String chinese1 = "[\u2E80-\uA4CF]";
String chinese2 = "[\uF900-\uFAFF]";
String chinese3 = "[\uFE30-\uFE4F]";
for (int i = 0; i < str.length(); i++) {
String temp = str.substring(i, i + 1);
if (temp.matches(chinese1) || temp.matches(chinese2) || temp.matches(chinese3)) {
str = str.replace(temp, "");
return wifiPwdFilter(str);
}
}
return str;
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取系统网络连接管理<EFBFBD>?
if (connectivity == null) { // 如果网络管理器为null
return false; // 返回false表明网络无法连接
} else {
NetworkInfo[] info = connectivity.getAllNetworkInfo(); // 获取<EFBFBD>?<EFBFBD><EFBFBD>的网络连接对<EFBFBD>?
if (info != null) { // 网络信息不为null
for (NetworkInfo anInfo : info) { // 遍历网路连接对象
if (anInfo.isConnected()) { // 当有<EFBFBD>?<EFBFBD><EFBFBD>网络连接对象连接上网络时
return true; // 返回true表明网络连接正常
}
}
}
}
return false;
}
public static boolean isWifi(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
return false;
} else {
NetworkInfo curNetwork = connectivity.getActiveNetworkInfo();
if (curNetwork != null && curNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
return true;
}
}
return false;
}
public static int getNetWorkState(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivity != null) {
NetworkInfo curNetwork = connectivity.getActiveNetworkInfo();
if (curNetwork != null && curNetwork.isConnected()) {
if (curNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
return NETWORK_WIFI;
} else if (curNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
return NETWORK_MOBILE;
}
}
}
return NETWORK_NONE;
}
public static boolean isWifiEnabled(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
boolean wifi= (wifiInfo.getSSID()==null) || wifiInfo.getSSID().equalsIgnoreCase("");
return !wifi;
}
public static boolean isWifiConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mConnectivityManager == null){
return false;
}
NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null) {
return mWiFiNetworkInfo.isAvailable();
}
}
return false;
}
/**
* 判断是否只包含数字或大小写字母
*
* @param str
* @return
*/
public static boolean checkString(String str) {
String regEx = "[0-9A-Za-z]*"; // 只能是数字以及个别字符
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
if (m.matches()) {
return true;
} else {
return false;
}
}
public static String filterInvalidString(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
String numberAndAbc = "[a-zA-Z0-9]";
StringBuilder buffer = new StringBuilder();
int len = str.length();
for (int i = 0; i < len; ++i) {
String temp = str.substring(i, i + 1);
if (temp.matches(numberAndAbc)) {
buffer.append(temp);
}
}
return buffer.toString();
}
public static String filterInvalidString4Type(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
String numberAndAbc = "[a-zA-Z0-9-/\\\\]";
StringBuilder buffer = new StringBuilder();
int len = str.length();
for (int i = 0; i < len; ++i) {
String temp = str.substring(i, i + 1);
if (temp.matches(numberAndAbc)) {
buffer.append(temp);
}
}
return buffer.toString();
}
/**
* 是否是乐盒设备
*
* @param deviceMode
* @return
*/
public static boolean isDeviceTypeBox(String deviceMode) {
if (deviceMode == null || TextUtils.isEmpty(deviceMode)) {
return false;
}
if (deviceMode.equalsIgnoreCase("G10")) {
return true;
} else {
return false;
}
}
/**
* 设置下划线字体
*/
public static SpannableString setSpannableString(Context context, int showResId, int showUnderLineResId) {
String showResourceTip = context.getResources().getString(showResId);
String showUnderLineResTip = context.getResources().getString(showUnderLineResId);
String tip = showResourceTip + showUnderLineResTip;
SpannableString ss = new SpannableString(tip);
int start = showResourceTip.length();
int end = showUnderLineResTip.length() + start;
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
MyURLSpan mus = new MyURLSpan(context.getResources().getString(R.string.assetfont_html));// 字体
ForegroundColorSpan fcs = new ForegroundColorSpan(context.getResources()
.getColor(R.color.lc_color_4ea7f2));
ss.setSpan(mus, start, end, flag);
ss.setSpan(fcs, start, end, flag);
return ss;
}
/**
* <p>
* 设置下划线字体及点击事件
* </p>
*/
public static void setSpannableString(int showResId, int showUnderLineResId, OnClickListener listener, TextView view) {
String showResourceTip = "";
if (showResId != 0) {
showResourceTip = view.getContext().getResources().getString(showResId);
}
String showUnderLineResTip = view.getContext().getResources().getString(showUnderLineResId);
String tip = showResourceTip + showUnderLineResTip;
SpannableString ss = new SpannableString(tip);
int start = showResourceTip.length();
int end = showUnderLineResTip.length() + start;
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
MyURLSpan mus = new MyURLSpan(view.getContext().getResources().getString(R.string.assetfont_html));// 字体
mus.setOnClickListener(listener);
ForegroundColorSpan fcs = new ForegroundColorSpan(view.getContext().getResources()
.getColor(R.color.lc_color_4ea7f2));
ss.setSpan(mus, start, end, flag);
ss.setSpan(fcs, start, end, flag);
view.setText(ss);
view.setMovementMethod(LinkMovementMethod.getInstance());
}
/**
* <p>
* 设置下划线字体及点击事件
* </p>
*/
public static void setSpannableString(int showResId, String showUnderLineResTip, OnClickListener listener, TextView view) {
String showResourceTip = "";
if (showResId != 0) {
showResourceTip = view.getContext().getResources().getString(showResId);
}
if (showUnderLineResTip == null) {
showUnderLineResTip = "";
}
String tip = showResourceTip + showUnderLineResTip;
SpannableString ss = new SpannableString(tip);
int start = showResourceTip.length();
int end = showUnderLineResTip.length() + start;
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
MyURLSpan mus = new MyURLSpan(view.getContext().getResources().getString(R.string.assetfont_html));// 字体
mus.setOnClickListener(listener);
ForegroundColorSpan fcs = new ForegroundColorSpan(view.getContext().getResources()
.getColor(R.color.lc_color_4ea7f2));
ss.setSpan(mus, start, end, flag);
ss.setSpan(fcs, start, end, flag);
view.setText(ss);
view.setMovementMethod(LinkMovementMethod.getInstance());
}
private static DisplayImageOptions mDeviceModeImageOptions;
/**
* 是否为TP1等设备包括TP1 TC1 TK1 TC3 TK3 TC4 TC5 TC5S TP6TP6CTC6TC6CTP7
*/
public static boolean isTp1And(String deviceModelName) {
return LCConfiguration.TYPE_TC1.equals(deviceModelName) || LCConfiguration.TYPE_TK1.equals(deviceModelName)
|| LCConfiguration.TYPE_TC3.equals(deviceModelName) || LCConfiguration.TYPE_TK3.equals(deviceModelName)
|| LCConfiguration.TYPE_TC4.equals(deviceModelName) || LCConfiguration.TYPE_TC5.equals(deviceModelName)
|| LCConfiguration.TYPE_TC5S.equals(deviceModelName) || LCConfiguration.TYPE_TP1.equals(deviceModelName)
|| LCConfiguration.TYPE_TP6.equals(deviceModelName) || LCConfiguration.TYPE_TP6C.equals(deviceModelName)
|| LCConfiguration.TYPE_TC6.equals(deviceModelName) || LCConfiguration.TYPE_TC6C.equals(deviceModelName)
|| LCConfiguration.TYPE_TP7.equals(deviceModelName);
}
//根据域名获取
public static String getAddDeviceHelpUrl(String host) {
if (host.contains(":443")) {
host = host.split(":")[0];
}
return "http://" + host + "/bindhelp.html";
}
/**
*  * 检测设备新老版本 ture 表示新版本并且DHCP打开走单播流程 false 老版本/DHCP关闭走组播加单播流程
*  * @return
*  
*/
public static boolean checkDeviceVersion(DEVICE_NET_INFO_EX deviceInfo) {
if(deviceInfo==null)
return false;
int flag = (deviceInfo.bySpecialAbility >> 2) & 0x03;
return 0x00 != flag && 0x03 != flag;
}
/**
*  * 检测设备获取的IP是否有效 ture 有效
*  * @param deviceInfo
*  * @return
*  
*/
public static boolean checkEffectiveIP(DEVICE_NET_INFO_EX deviceInfo) {
if(deviceInfo==null)
return false;
int flag = (deviceInfo.bySpecialAbility >> 2) & 0x03;
return 0x02 == flag;
}
/**
* 生成二维码
* @param url
* @param width
* @param height
* @return
*/
public static Bitmap creatQRImage(String url, final int width, final int height) {
try {
if(TextUtils.isEmpty(url)) {
return null;
}
Hashtable<EncodeHintType, String> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MARGIN, "0"); // 不要边距
// 图像数据变换,使用矩阵转换
BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);
int[] pixels = new int[width * height];
// 下面这里按照二维码的算法逐个生成二维码的图片
// 两个for循环是图片横列扫描的结果
for(int y = 0; y < height; y++) {
for(int x = 0; x <width; x++) {
if(bitMatrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
} else {
pixels[y * width + x] = 0xffffffff;
}
}
}
// 生成二维码图片格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,48 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import com.mm.android.deviceaddmodule.mobilecommon.base.BaseProvider;
public class AppBaseProvider extends BaseProvider implements IApp {
private static int appType = 0;
@Override
public void setAppType(int type) {
appType = type;
}
@Override
public int getAppType() {
return appType;
}
@Override
public Context getAppContext() {
return null;
}
@Override
public void goDeviceSharePage(Activity activity, Bundle bundle) {
}
@Override
public void goBuyCloudPage(Activity activity, Bundle bundle) {
}
@Override
public void goModifyDevicePwdGuidePage(Activity activity) {
}
@Override
public String getAppLanguage() {
return null;
}
}

View File

@ -0,0 +1,62 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
public class AppProvider extends AppBaseProvider implements IApp {
private volatile static AppProvider appProvider;
public static AppProvider newInstance() {
if (appProvider == null) {
synchronized (AppProvider.class) {
if (appProvider == null) {
appProvider = new AppProvider();
}
}
}
return appProvider;
}
@Override
public void uninit() {
}
@Override
public void setAppType(int type) {
super.setAppType(type);
}
@Override
public int getAppType() {
return super.getAppType();
}
@Override
public void goDeviceSharePage(Activity activity, Bundle bundle) {
super.goDeviceSharePage(activity, bundle);
}
@Override
public void goBuyCloudPage(Activity activity, Bundle bundle) {
super.goBuyCloudPage(activity, bundle);
}
@Override
public void goModifyDevicePwdGuidePage(Activity activity) {
super.goModifyDevicePwdGuidePage(activity);
}
@Override
public String getAppLanguage() {
return super.getAppLanguage();
}
@Override
public Context getAppContext() {
return EnvironmentConfig.mContext;
}
}

View File

@ -0,0 +1,36 @@
/**
* Exception style class encapsulating Business errors
*/
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
@SuppressWarnings("serial")
public class BusinessException extends Exception{
/**
* 执行错误码
*/
public int errorCode = 1;
/**
* 错误描述
*/
public String errorDescription = "UNKNOWN_ERROR";
public BusinessException(){
}
public BusinessException(String e) {
super(e);
this.errorDescription =e;
}
public BusinessException(Throwable cause) {
super(cause);
this.errorDescription =cause.getMessage();
}
public BusinessException(int errorCode) {
this.errorCode = errorCode;
}
}

View File

@ -0,0 +1,53 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.os.Handler;
import com.mm.android.deviceaddmodule.mobilecommon.businesstip.BusinessErrorCode;
import com.mm.android.deviceaddmodule.mobilecommon.businesstip.HandleMessageCode;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import java.lang.ref.WeakReference;
public abstract class BusinessRunnable implements Runnable {
private WeakReference<Handler> mHandler;
public BusinessRunnable(Handler handle) {
mHandler = new WeakReference<>(handle);
Handler handler = getHander();
if (handler != null && handler instanceof DHBaseHandler) {
((DHBaseHandler) handler).onStart();
}
ThreadPool.submit(this);
}
public Handler getHander() {
return mHandler.get();
}
@Override
public void run() {
try {
doBusiness();
} catch (BusinessException e) {
Handler handler = getHander();
LogUtil.debugLog("BusinessRunnable", "hander == null ? " + (handler == null));
if (handler != null) {
handler.obtainMessage(HandleMessageCode.HMC_EXCEPTION,
e.errorCode, e.errorCode, e).sendToTarget();
}
} catch (Exception e) {
LogUtil.debugLog("HsviewResponse Exception", e.getMessage());
Handler handler = getHander();
if (handler != null) {
handler.obtainMessage(HandleMessageCode.HMC_EXCEPTION,
BusinessErrorCode.BEC_COMMON_UNKNOWN,
BusinessErrorCode.BEC_COMMON_UNKNOWN,new BusinessException(e)).sendToTarget();
}
}
}
public abstract void doBusiness() throws BusinessException;
}

View File

@ -0,0 +1,8 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
public interface Callback<T> {
public void onSuccess(T t);
public void onFail(String code, String message);
}

View File

@ -0,0 +1,32 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.os.Message;
import com.mm.android.deviceaddmodule.mobilecommon.base.LCBusinessHandler;
import com.mm.android.deviceaddmodule.mobilecommon.base.mvp.IBaseView;
import java.lang.ref.WeakReference;
public abstract class DHBaseHandler<T extends IBaseView> extends LCBusinessHandler {
WeakReference<T> mView;
public DHBaseHandler(WeakReference<T> view){
super();
mView=view;
}
public abstract void onStart();
protected abstract void onCompleted();
protected abstract void handleBusinessFinally(Message msg);
@Override
public void handleBusiness(Message msg) {
if(mView==null
|| mView.get()==null
||!mView.get().isViewActive()){
return;
}
onCompleted();
handleBusinessFinally(msg);
}
}

View File

@ -0,0 +1,47 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.app.Activity;
import android.content.Context;
import com.mm.android.deviceaddmodule.helper.ActivityHelper;
import com.mm.android.deviceaddmodule.utils.SDsolutionUtility;
public class DeviceAddCustomImpl implements IDeviceAddCustom {
private volatile static DeviceAddCustomImpl deviceAddCustom;
public static DeviceAddCustomImpl newInstance() {
if (deviceAddCustom == null) {
synchronized (DeviceAddCustomImpl.class) {
if (deviceAddCustom == null) {
deviceAddCustom = new DeviceAddCustomImpl();
}
}
}
return deviceAddCustom;
}
@Override
public void goFAQWebview(Context context) {
}
@Override
public void goHomePage(Context context) {
Activity activity=ActivityHelper.getCurrentActivity();
if (activity!=null){
activity.finish();
}
}
@Override
public String getDevAddCachePath() {
return SDsolutionUtility.getCachePath();
}
@Override
public void uninit() {
}
}

View File

@ -0,0 +1,12 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.text.TextUtils;
/**
* 设备模块帮助类
**/
public class DeviceHelper {
public static boolean isH1G(String deviceModelName){
return !TextUtils.isEmpty(deviceModelName) && "H1G".equalsIgnoreCase(deviceModelName);
}
}

View File

@ -0,0 +1,265 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import com.mm.android.deviceaddmodule.mobilecommon.utils.PreferencesHelper;
import java.io.File;
/**
* 业务必要属性
*
* App配置文件必须要配置的 推送ID
* {@code meta_data4project} App配置文件必须要配置的 项目名称 {@code meta_data4Type}
* App配置文件必须要配置的 协议发起方
*/
public final class EnvironmentConfig {
public static final String meta_data4Type = "meta-data4type";
public static final String meta_data4AppId = "meta-data4appid";
public static final String meta_isHttps = "meta-ishttps";
/**
* 1.clientType客户端类型必填"phone"-手机"web"-浏览器"box"-盒子
* {@link } 环境配置属性
*/
private String clientType;
/**
* 2.clientMac客户端MAC地址必填用于唯一标识这个客户端
*/
private String clientMac;
/**
* 服务端地址
*/
private String host;
/**
* 是否是走https协议
*/
private boolean isHttps;
/**
* 缓存文件名
*/
private String userAgent = "volley/0";
/**
* 缓存路径
*/
private File cacheDir;
/**
* 应用ID
*/
private String appId;
/**
* Application
*/
private Context application;
/**
* 版本名
*/
private String versionName;
private String language = null;
public static Context mContext;// applicationContext
public EnvironmentConfig(Builder b) {
this.clientMac = b.clientMac;
this.clientType = b.clientType;
userAgent = b.userAgent;
cacheDir = b.cacheDir;
appId = b.appId;
host = b.host;
this.isHttps = b.isHttps;
application = b.applicationContext;
versionName = b.versionName;
language = b.language;
}
public String getHost() {
return host;
}
public String getClientType() {
return clientType;
}
public void setHost(String host) {
this.host = host;
}
public String getClientMacAddress() {
return clientMac;
}
public Context getContext() {
return application;
}
public String getVersionName() {
return versionName;
}
public String getLanguage() {
return language;
}
public static class Builder {
private String clientType;
private String clientMac;
private String project;
private String userAgent;
private File cacheDir;
private String appId;
private String host;
private boolean isHttps;
private Context applicationContext;
private String versionName;
private String language = null;
public Builder setContext(Context context) throws Exception {
if (!(context instanceof Application)) {
throw new Exception("context must instance application");
}
applicationContext = context;
mContext = applicationContext.getApplicationContext();
return this;
}
public Builder setClientType(String clientType) {
this.clientType = clientType;
return this;
}
private void setVersionName(Context context) {
PackageManager pm = context.getPackageManager();
PackageInfo pi = null;
try {
pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
private void setClientMac(Context context) {
try {
// FIXME:Mac地址可能为空 IMEI 未识别信息如果未发现则功能不正常使用
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = telephonyManager.getDeviceId();
LogUtil.debugLog("lechange", "imei : " + imei);
if (imei == null) {
WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = (null == wifiMgr ? null : wifiMgr.getConnectionInfo());
String mac = info != null ? info.getMacAddress() : "";
LogUtil.debugLog("lechange", "mac : " + mac);
if (mac != null) {
mac = mac.replace(":", "");
} else {
mac = "";
}
clientMac = mac;
} else {
clientMac = imei;
}
LogUtil.debugLog("lechange", "clientMac : " + clientMac);
} catch (Exception e) {
clientMac = "";
}
}
public Builder setProject(String project) {
this.project = project;
return this;
}
private void setCacheFile(Context context) {
cacheDir = context.getCacheDir();
userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
}
public Builder setHost(String host) {
this.host = host;
String historyHost = PreferencesHelper.getInstance(applicationContext).getString(PreferencesConfig.HOST_HELP);
if (!TextUtils.isEmpty(historyHost)) {// 如果历史记录Host 不是nil
// 则设置历史Host用于测试服务器
this.host = historyHost;
}
return this;
}
private void setDefaultHost(String host) {
this.host = host;
String historyHost = PreferencesHelper.getInstance(applicationContext).getString(PreferencesConfig.HOST_HELP);
if (!TextUtils.isEmpty(historyHost)) {// 如果历史记录Host 不是nil
// 则设置历史Host用于测试服务器
this.host = historyHost;
}
}
public Builder setLanguage(String language) {
this.language = language;
return this;
}
private void setLanguage(Context context) {
this.language = context.getResources().getConfiguration().locale.getLanguage();
}
public EnvironmentConfig build() {
if (versionName == null || versionName.equals("")) {
setVersionName(applicationContext);
}
if (cacheDir == null) {
setCacheFile(applicationContext);
}
if (clientMac == null || clientMac.equals("")) {
setClientMac(applicationContext);
}
if (language == null || language.equals("")) {
setLanguage(applicationContext);
}
try {
ApplicationInfo appInfo = applicationContext.getPackageManager().getApplicationInfo(applicationContext.getPackageName(), PackageManager.GET_META_DATA);
if (clientType == null || clientType.equals("")) {
clientType = appInfo.metaData.getString(meta_data4Type);
}
isHttps = appInfo.metaData.getBoolean(meta_isHttps);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return new EnvironmentConfig(this);
}
}
}

View File

@ -0,0 +1,30 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import com.mm.android.deviceaddmodule.mobilecommon.base.IBaseProvider;
/**
* App通用接口类
*/
public interface IApp extends IBaseProvider {
/*设备App使用类型0表示国内1表示海外*/
public void setAppType(int type);
public int getAppType(); //APP类型(0:乐橙/1:Easy4ip)
public Context getAppContext(); //获取App上下文
public void goDeviceSharePage(Activity activity , Bundle bundle); //进入设备分享页
void goBuyCloudPage(Activity activity , Bundle bundle);
//跳转修改设备密码引导页
void goModifyDevicePwdGuidePage(Activity activity);
String getAppLanguage();
}

View File

@ -0,0 +1,12 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import com.mm.android.deviceaddmodule.mobilecommon.base.BaseHandler;
import com.mm.android.deviceaddmodule.mobilecommon.base.IBaseProvider;
/**
* 设备添加对外接口外部模块可调用的功能
*/
public interface IDeviceAdd extends IBaseProvider {
void stopSearchDevicesAsync(long ret, BaseHandler handler); //异步停止设备搜索
boolean stopSearchDevices(long ret, String requestId); //同步停止设备搜索
}

View File

@ -0,0 +1,16 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.content.Context;
import com.mm.android.deviceaddmodule.mobilecommon.base.IBaseProvider;
/**
* 设备添加模块App需不同实现的接口
**/
public interface IDeviceAddCustom extends IBaseProvider {
void goFAQWebview(Context context); //调整至FAQ
void goHomePage(Context context);//回到设备列表页
String getDevAddCachePath(); //设备添加文件缓存路径
}

View File

@ -0,0 +1,21 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import static com.mm.android.deviceaddmodule.mobilecommon.AppConsume.PseudoJsonScanResult.filterInvalidString;
import static com.mm.android.deviceaddmodule.mobilecommon.AppConsume.PseudoJsonScanResult.filterInvalidString4Type;
public class OneColonScanResult extends ScanResult {
/**
* 创建一个新的实例OneColonScanResult.
*
* @param scanString
*/
public OneColonScanResult(String scanString) {
super(scanString);
String[] resultStrings = scanString.split(":");
this.setSn(filterInvalidString(resultStrings[0]));
this.setMode(filterInvalidString4Type(resultStrings[1]));
}
}

View File

@ -0,0 +1,6 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
public class PreferencesConfig {
public static final String HOST_HELP = "HOST_HELP_V2";
}

View File

@ -0,0 +1,22 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import com.mm.android.deviceaddmodule.provider.DeviceAddProvider;
/**
* 功能接口管理类
*/
public class ProviderManager {
public static IApp getAppProvider() {
return AppProvider.newInstance();
}
public static IDeviceAdd getDeviceAddProvider() {
return DeviceAddProvider.newInstance();
}
public static IDeviceAddCustom getDeviceAddCustomProvider() {
return DeviceAddCustomImpl.newInstance();
}
}

View File

@ -0,0 +1,99 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import org.json.JSONObject;
/**
* <p>
* 伪json格式的二维码扫描结果(带NC)
* </p>
*/
public class PseudoJsonNcScanResult extends ScanResult {
private static final String TAG = "JsonScanResult";
private static final String[] SN_TAGS = new String[]{"SN", "sN", "Sn", "sn"};
private static final String[] DT_TAGS = new String[]{"DT", "dT", "Dt", "dt"};
private static final String[] RD_TAGS = new String[]{"RD", "rD", "Rd", "rd"};
private static final String[] RC_TAGS = new String[]{"RC", "rC", "Rc", "rc"};
private static final String[] NC_TAGS = new String[]{"NC", "nC", "Nc", "nc"};
private static final String[] SC_TAGS = new String[]{"SC", "sC", "Sc", "sc"};
private static final String[] IMEI_TAGS = new String[]{"IMEI", "imei"};
/**
* 创建一个新的实例JsonScanResult.
*
* @param scanString
*/
public PseudoJsonNcScanResult(String scanString) {
super(scanString);
//解析伪Json 类似{SN:DVRP2P00LJL0028,DT:DH/HCVR1604HG-SFD-V4/-AF-DVR-II-A/16-16,NC:QR,RC:SQ93W5}
//替换中文""
scanString = scanString.replace('', ':');
// 补充"{" "}"
int first = scanString.indexOf("{");
if (first < 0) {
scanString = "{" + scanString;
}
int last = scanString.indexOf("}");
if (last < 0) {
scanString = scanString + "}";
}
// 补充引号"""
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < scanString.length(); i++) {
char c = scanString.charAt(i);
if(c == '{') {
buffer.append(c).append("\"");
}else if(c == ':' || c == ',' || c == ';') {
buffer.append("\"").append(c).append("\"");
} else if(c == '}') {
buffer.append("\"").append(c);
} else {
buffer.append(c);
}
}
String sn = "";
String dt = "";
String rd = "";
String nc = "";
String sc = "";
String imeiCode = "";
try {
JSONObject jsonObject = new JSONObject(buffer.toString());
sn = getValue(jsonObject, SN_TAGS, "");
dt = getValue(jsonObject, DT_TAGS, "");
rd = getValue(jsonObject, RD_TAGS, "");
rd = getValue(jsonObject, RC_TAGS, "");
nc = getValue(jsonObject, NC_TAGS, "");
sc = getValue(jsonObject, SC_TAGS, "");
imeiCode = getValue(jsonObject, IMEI_TAGS, "");
} catch (Exception e) {
e.printStackTrace();
}
this.setSn(sn);
this.setRegcode(rd);
this.setMode(dt);
this.setNc(nc);
this.setSc(sc);
this.setImeiCode(imeiCode);
LogUtil.debugLog("PseudoJsonNcScanResult", this.toString());
}
private String getValue(JSONObject json, String[] tags, String defaultStr) {
for (String tag : tags) {
if (json.has(tag)) {
return json.optString(tag, defaultStr);
}
}
return defaultStr;
}
}

View File

@ -0,0 +1,157 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.text.TextUtils;
/**
* <p>
* 伪json格式的二维码扫描结果
* </p>
*/
public class PseudoJsonScanResult extends ScanResult {
private static final String TAG = "JsonScanResult";
private static final String[] SN_TAGS = new String[]{"SN:", "sN:", "Sn:", "sn:", "SN", "sN", "Sn", "sn"};
private static final String[] DT_TAGS = new String[]{"DT:", "dT:", "Dt:", "dt:", "DT", "dT", "Dt", "dt"};
private static final String[] RD_TAGS = new String[]{"RD:", "rD:", "Rd:", "rd:", "RD", "rD", "Rd", "rd"};
private static final String[] RC_TAGS = new String[]{"RC:", "rC:", "Rc:", "rc:", "RC", "rC", "Rc", "rc"};
/**
* 创建一个新的实例JsonScanResult.
*
* @param scanString
*/
public PseudoJsonScanResult(String scanString) {
super(scanString);
//解析伪Json 类似{SN:DVRP2P00LJL0028,DT:DH/HCVR1604HG-SFD-V4/-AF-DVR-II-A/16-16,RC:SQ93W5}
String jsonStr;
int firstIndex = scanString.indexOf("{");
if (firstIndex >= 0 && firstIndex <= scanString.length() - 1) {
jsonStr = scanString.substring(firstIndex, scanString.length());
} else {
jsonStr = scanString;
}
int snEndIndex = -1;
int dtEndIndex = -1;
int rdEndIndex = -1;
int snStartIndex = getStartIndex(jsonStr, SN_TAGS, -1);
int dtStartIndex = getStartIndex(jsonStr, DT_TAGS, -1);
int rdStartIndex = getStartIndex(jsonStr, RD_TAGS, -1);
rdStartIndex = getStartIndex(jsonStr, RC_TAGS, rdStartIndex);
if (snStartIndex == -1) {
this.setSn("");
return;
}
if (snStartIndex > dtStartIndex && snStartIndex > rdStartIndex) { // sn在最后
if (dtStartIndex == -1 && rdStartIndex == -1) { // {sn:}
snEndIndex = jsonStr.length() - 1;
} else if (dtStartIndex == -1 && rdStartIndex != -1) { // {rd:,sn:}
rdEndIndex = snStartIndex - 1;
snEndIndex = jsonStr.length() - 1;
} else if (dtStartIndex != -1 && rdStartIndex == -1) { // {dt:,sn:}
dtEndIndex = snStartIndex - 1;
snEndIndex = jsonStr.length() - 1;
} else {
if (dtStartIndex > rdStartIndex) { // {rd:,dt:,sn:}
rdEndIndex = dtStartIndex - 1;
dtEndIndex = snStartIndex - 1;
snEndIndex = jsonStr.length() - 1;
} else { // {dt:,rd:,sn:}
dtEndIndex = rdStartIndex - 1;
rdEndIndex = snStartIndex - 1;
snEndIndex = jsonStr.length() - 1;
}
}
} else if (dtStartIndex > snStartIndex && dtStartIndex > rdStartIndex) { // dt在最后
if (rdStartIndex == -1) {
snEndIndex = dtStartIndex - 1;
dtEndIndex = jsonStr.length() - 1;
} else if (snStartIndex > rdStartIndex) {
rdEndIndex = snStartIndex - 1;
snEndIndex = dtStartIndex - 1;
dtEndIndex = jsonStr.length() - 1;
} else if (snStartIndex < rdStartIndex) {
snEndIndex = rdStartIndex - 1;
rdEndIndex = dtStartIndex - 1;
dtEndIndex = jsonStr.length() - 1;
}
} else if (rdStartIndex > snStartIndex && rdStartIndex > dtStartIndex) { // rd在最后
if (dtStartIndex == -1) {
snEndIndex = rdStartIndex - 1;
rdEndIndex = jsonStr.length() - 1;
} else if (snStartIndex > dtStartIndex) {
dtEndIndex = snStartIndex - 1;
snEndIndex = rdStartIndex - 1;
rdEndIndex = jsonStr.length() - 1;
} else if (snStartIndex < dtStartIndex) {
snEndIndex = dtStartIndex - 1;
dtEndIndex = rdStartIndex - 1;
rdEndIndex = jsonStr.length() - 1;
}
}
if (rdStartIndex != -1) {
this.setRegcode(filterInvalidString(jsonStr.substring(rdStartIndex + 2, rdEndIndex)));
} else {
this.setRegcode("");
}
if (dtStartIndex != -1) {
this.setMode(filterInvalidString4Type(jsonStr.substring(dtStartIndex + 2, dtEndIndex)));
} else {
this.setMode("");
}
this.setSn(filterInvalidString(jsonStr.substring(snStartIndex + 2, snEndIndex)));
}
private int getStartIndex(String jsonStr, String[] tags, int startIndex) {
for (String dttag : tags) {
if (jsonStr.contains(dttag)) {
return jsonStr.indexOf(dttag) + 1;
}
}
return startIndex;
}
public static String filterInvalidString(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
String numberAndAbc = "[a-zA-Z0-9]";
StringBuilder buffer = new StringBuilder();
int len = str.length();
for (int i = 0; i < len; ++i) {
String temp = str.substring(i, i + 1);
if (temp.matches(numberAndAbc)) {
buffer.append(temp);
}
}
return buffer.toString();
}
public static String filterInvalidString4Type(String str) {
if (TextUtils.isEmpty(str)) {
return str;
}
String numberAndAbc = "[a-zA-Z0-9-/\\\\]";
StringBuilder buffer = new StringBuilder();
int len = str.length();
for (int i = 0; i < len; ++i) {
String temp = str.substring(i, i + 1);
if (temp.matches(numberAndAbc)) {
buffer.append(temp);
}
}
return buffer.toString();
}
}

View File

@ -0,0 +1,124 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
/**
* <p>
* 二维码扫描结果基类
* </p>
*/
public class ScanResult {
/**
* 设备序列号
*/
private String sn = "";
/**
* 设备型号
*/
private String mode = "";
/**
* 设备验证码设备安全码
*/
private String regcode = "";
/**
* 设备随机码备用
*/
private String rd = "";
/**
* 设备能力
*/
private String nc = "";
/**
* 设备安全验证码
*/
private String sc = "";
private String imeiCode = "";
/**
* 创建一个新的实例ScanResult.
*
* @param scanString
*/
public ScanResult(String scanString) {
// TODO Auto-generated constructor stub
}
/**
* 创建一个新的实例ScanResult.
*/
public ScanResult() {
// TODO Auto-generated constructor stub
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getRegcode() {
return regcode;
}
public void setRegcode(String regcode) {
this.regcode = regcode;
}
public String getRd() {
return rd;
}
public void setRd(String rd) {
this.rd = rd;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getNc() {
return nc;
}
public void setNc(String nc) {
this.nc = nc;
}
public String getSc() {
return sc;
}
public void setSc(String sc) {
this.sc = sc;
}
public String getImeiCode() {
return imeiCode;
}
public void setImeiCode(String imeiCode) {
this.imeiCode = imeiCode;
}
@Override
public String toString() {
return "ScanResult{" +
"sn='" + sn + '\'' +
", mode='" + mode + '\'' +
", regcode='" + regcode + '\'' +
", nc='" + nc + '\'' +
", sc='" + sc + '\'' +
", imeiCode='" + imeiCode + '\'' +
'}';
}
}

View File

@ -0,0 +1,140 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.text.TextUtils;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <p>
* 根据二维码扫描结果生成相应的类
* </p>
*/
public class ScanResultFactory {
// 工厂方法.注意 返回类型为抽象产品角色
private static String tag = "www.hsview.com";
private static String tag_lc = "www.lechange.cn";
public static ScanResult scanResult(String scanString) {
if (ProviderManager.getAppProvider().getAppType() == LCConfiguration.APP_LECHANGE_OVERSEA) {//海外二维码规则
// 带NC标签的
final String[] NC_ARRAYS = new String[]{"NC:", "nC:", "Nc:", "nc:", "NC", "nC", "Nc", "nc"};
// 带SC标签的
final String[] SC_ARRAYS = new String[]{"SC:", "sC:", "Sc:", "Sc:", "SC", "sC", "Sc", "sc"};
boolean hasNc = hasTag(scanString, NC_ARRAYS);
boolean hasSc = hasTag(scanString, SC_ARRAYS);
if((hasNc || hasSc) && scanString.contains("{")) {
return new PseudoJsonNcScanResult(scanString);
} else {
String deviceSN = "";
String deviceSerial = "";
if (scanString.contains(",")) { //逗号分割{SN:2J021B3PAK00120,DT:IPC-HFW1120SP-W-0280B,RC:564897}
scanString = scanString.substring(1, scanString.length() - 1); //去掉收尾花括号
String[] array = scanString.split(",");
for (String strArray : array) {
if (strArray.contains("SN:")) {
deviceSN = strArray.substring(strArray.indexOf("SN:") + 3, strArray.length());
}
if (strArray.contains("DT:")) {
deviceSerial = strArray.substring(strArray.indexOf("DT:") + 3, strArray.length());
}
}
} else if (scanString.contains(";")) {//分号分割{SN:2J021B3PAK00120;DT:IPC-HFW1120SP-W-0280B;RC:564897}
scanString = scanString.substring(1, scanString.length() - 1); //去掉收尾花括号
String[] array = scanString.split(";");
for (String strArray : array) {
if (strArray.contains("SN:")) {
deviceSN = strArray.substring(strArray.indexOf("SN:") + 3, strArray.length());
}
if (strArray.contains("DT:")) {
deviceSerial = strArray.substring(strArray.indexOf("DT:") + 3, strArray.length());
}
}
} else if (scanString.contains(":")) { //2M047C9PAN00005:DHI-ARD1611-W:PJ0V46
String[] array = scanString.split(":");
deviceSN = array[0];
deviceSerial = array[1];
} else {
deviceSN = scanString;
}
// 兼容 俄语区Q4的订单采用标签二维码内容异常 格式为DH-IPC-C35P,4K002C6PAJA49A7
if(TextUtils.isEmpty(deviceSN)) {
String[] array = scanString.split(",");
if(array != null && array.length == 2) {
deviceSN = array[1];
}
}
ScanResult scanResult = new ScanResult();
scanResult.setSn(deviceSN);
scanResult.setMode(deviceSerial);
return scanResult;
}
} else {//国内二维码规则
if(scanString.contains(tag) || scanString.contains(tag_lc)){
if(scanString.contains("{")){
// 兼容TC1
ScanResult scanResult = new PseudoJsonScanResult(scanString);
return scanResult;
}
// 兼容老乐橙设备
int index = scanString.indexOf('=');
String sn = scanString.substring(index + 1, scanString.length());
ScanResult scanResult = new ScanResult();
scanResult.setSn(sn);
return scanResult;
} else if (scanString.contains("{")) {
ScanResult result = new PseudoJsonNcScanResult(scanString);
return result;
} else if (!scanString.contains("SN:") || !scanString.contains("SN=") || !scanString.contains("SN =") ||
!scanString.contains("sn:") || !scanString.contains("sn=") || !scanString.contains("sn =")) {
if (!checkString(scanString)) {
String[] strings = scanString.split(":");
if (strings != null && !scanString.startsWith("http://") && strings.length == 3) {
return new TwoColonsScanResult(scanString);
} else if (strings != null && !scanString.startsWith("http://") && strings.length == 2) {
return new OneColonScanResult(scanString);
}
} else {
ScanResult scanResult = new ScanResult();
scanResult.setSn(scanString);
return scanResult;
}
}
}
return new ScanResult();
}
// 判断是否有tag
private static boolean hasTag(String scanString, String[] tagArrays) {
boolean hasTag = false;
for (String tag : tagArrays) {
if (scanString.contains(tag)) {
hasTag = true;
break;
}
}
return hasTag;
}
/**
* 判断是否只包含数字或大小写字母
*
* @param str
* @return
*/
public static boolean checkString(String str) {
String regEx = "[0-9A-Za-z]*"; // 只能是数字以及个别字符
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
if (m.matches()) {
return true;
} else {
return false;
}
}
}

View File

@ -0,0 +1,60 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import android.os.Process;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
public class ThreadPool {
private volatile static ExecutorService cachedThreadPool;
// 提交线程
public static Future<?> submit(Runnable mRunnable) {
if (cachedThreadPool == null) {
synchronized (ExecutorService.class) {
if (cachedThreadPool == null) {
cachedThreadPool = Executors.newFixedThreadPool(Runtime
.getRuntime().availableProcessors() * 2,new DefaultFactory());
}
}
}
return cachedThreadPool.submit(mRunnable);
}
// 关闭
public static void shutdown() {
if (cachedThreadPool != null && !cachedThreadPool.isShutdown())
cachedThreadPool.shutdown();
cachedThreadPool = null;
}
static class DefaultFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(new FactoryRunnable(r));
return thread;
}
}
static class FactoryRunnable implements Runnable {
Runnable runnable;
public FactoryRunnable(Runnable runnable) {
this.runnable = runnable;
}
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
runnable.run();
}
}
}

View File

@ -0,0 +1,25 @@
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
import static com.mm.android.deviceaddmodule.mobilecommon.AppConsume.PseudoJsonScanResult.filterInvalidString;
import static com.mm.android.deviceaddmodule.mobilecommon.AppConsume.PseudoJsonScanResult.filterInvalidString4Type;
/**
* <p>
* xxxxxx:xxx格式二维码
* </p>
*/
public class TwoColonsScanResult extends ScanResult {
/**
* 创建一个新的实例TwoColonsScanResult.
*
* @param scanString
*/
public TwoColonsScanResult(String scanString) {
super(scanString);
String[] resultStrings = scanString.split(":");
this.setSn(filterInvalidString(resultStrings[0]));
this.setMode(filterInvalidString4Type(resultStrings[1]));
this.setRegcode(filterInvalidString(resultStrings[2]));
}
}

View File

@ -0,0 +1,164 @@
package com.mm.android.deviceaddmodule.mobilecommon.annotation;
import android.support.annotation.StringDef;
import java.lang.annotation.Retention;
import static com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceAbility.*;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@Retention(SOURCE)
@StringDef({WLAN, AlarmPIR, AlarmMD, AudioTalk, AudioTalkV1, VVP2P, DHP2P, PTZ, PT, HSEncrypt, CloudStorage, AGW, BreathingLight,
PlaybackByFilename, LocalStorage, RegCode, RemoteControl, Panorama, RD, SLAlarm, CK, AudioEncodeOff, MDS, MDW, HeaderDetect,
SR, AGWDisarm, CollectionPoint, TimedCruise, SmartTrack, ZoomFocus, SmartLocate, LocalRecord, XUpgrade, Auth, NumberStat,
HoveringAlarm, BeOpenedDoor, NonAccessoriesAdd, CloseCamera, MobileDetect, Siren, LinkageSiren, WhiteLight, WLV2, Dormant,
/*NoVA, */NoAccessories, UnsupportLiveShare, RTSV1, PBSV1, SearchLight, CallByRtsp, SirenTime,NVM, LEDS, TimingGraphics, HumanDetect, AlarmPIRV2, HUBAlarmPIRV2,
AlarmPIRV3, AlarmPIRV4, LocalStorageEnable, DaySummerTime, WeekSummerTime,SummerTimeOffset, AiHuman, AiCar, Electric, WIFI, DLOCS, OpenDoorByFace, OpenDoorByTouch,
PlaySoundModify, WideDynamic, TalkSoundModify, LinkDevAlarm, LinkAccDevAlarm, AbAlarmSound, CheckAbDecible, Reboot, PlaySound,
AudioEncodeControl, SceneMode, SIMCA, TimeFormat, SASQ, MGOCS, ModifyName, ElecInfo, SigInfo, ACT, AlarmSound, DDT, OnlyArmed, TSV1, NoPlan, ChnLocalStorage,
AccessoryAlarmSound, RingAlarmSound, SCCode, CustomRing, InfraredLight, AudioEncodeControlV2, InstantDisAlarm,IDAP, RDV2,RDV3, DeviceAlarmSound, FaceDetect,
CallAbility, CAV2, HAV2, Ring, RTSV2, PBSV2, TSV2, PT1, AX, HAV3, VideoMotionSMD, TLSEnable, TCM, CLDA, ChnWhiteLight, ChnSiren, LED,
CCR, CLS, CLW, ""})
public @interface DeviceAbility {
String WLAN = "WLAN"; // 设备支持接入无线局域网
String AlarmPIR = "AlarmPIR"; // 设备支持人体红外报警
String AlarmMD = "AlarmMD"; // 设备支持动检报警
String AudioTalk = "AudioTalk"; // 设备支持语音对讲
String AudioTalkV1 = "AudioTalkV1"; // 通道支持语音对讲
String VVP2P = "VVP2P"; // 设备支持威威网络P2P服务
String DHP2P = "DHP2P"; // 设备支持大华P2P服务
String PTZ = "PTZ"; // 设备支持云台方向操作,及云台缩放
String PT = "PT"; // 设备支持云台方向操作
String PT1 = "PT1"; // 设备支持云台四方向操作
String HSEncrypt = "HSEncrypt"; // 设备支持华视微讯码流加密
String CloudStorage = "CloudStorage"; // 设备支持华视微讯平台云存储
String CloudUpdate = "CloudUpdate"; // easy4ip支持云升级自己本地判断使用
String AGW = "AGW"; // 设备支持网关功能
String BreathingLight = "BreathingLight"; // 设备有呼吸灯
String PlaybackByFilename = "PlaybackByFilename"; // 设备支持根据文件名回放
String LocalStorage = "LocalStorage"; // 支持设备本地存储如有SD卡或硬盘
String RegCode = "RegCode"; // 设备添加需要支持验证码
String RemoteControl = "RemoteControl"; // 支持远程联动
String Panorama = "Panorama"; //支持全景图
String RD = "RD"; //设备具有远程调试能力Remote Debug
String RDV2 = "RDV2"; //支持RD能力支持数据埋点控制支持调试日志上传 对应设备体验计划开关
String RDV3 = "RDV3"; //支持RD能力支持数据埋点控制支持级别控制
String SLAlarm = "SLAlarm"; //设备支持声光告警sound and light alarm
String CK = "CK"; // 设备视频加密
String AudioEncodeOff = "AudioEncodeOff"; //支持音频编码关闭无伴音 AudioEncode支持音频编码伴音 老设备不上报因此只需要使用AudioEncodeOff进行判断即可
String MDS = "MDS"; //通道 motion-detect-sensitive支持动检灵敏度设置
String MDW = "MDW"; //通道 motion-detect-window支持动检窗口设置
String HeaderDetect = "HeaderDetect"; //通道 支持人头检测
String SR = "SR"; ////设备设备支持语音识别
String AGWDisarm = "AGWDisarm"; // 网关告警解除配置(APP2.8网关支持布撤防过滤配件告警但保留告警配置功能)
String CollectionPoint = "CollectionPoint"; //支持收藏点
String TimedCruise = "TimedCruise"; //支持定时巡航
String SmartTrack = "SmartTrack"; //智能追踪
String ZoomFocus = "ZoomFocus"; //支持变倍聚焦 变焦相机能力集
String SmartLocate = "SmartLocate"; //听声辨位
String LocalRecord = "LocalRecord"; //支持设备设备录像设置
String XUpgrade = "XUpgrade"; // 云升级
String Auth = "Auth"; // 设备端环回RTSP需认证
String NumberStat = "NumberStat"; // 客流量数据采集
String HoveringAlarm = "HoveringAlarm"; //徘徊报警
String BeOpenedDoor = "BeOpenedDoor"; //普通开门即成功开门K5电池门锁
String NonAccessoriesAdd = "NonAccessoriesAdd"; //表示不支持C端信令添加方式
String CloseCamera = "CloseCamera"; //支持关闭摄像头
String MobileDetect = "MobileDetect"; //动检+PIR
String Siren = "Siren"; //警笛
String LinkageSiren = "LinkageSiren"; //报警联动警笛
String WhiteLight = "WhiteLight"; //白光灯
String WLV2 = "WLV2"; // 白光灯不支持亮度调节能力
String Dormant = "Dormant"; //可休眠具有唤醒休眠状态
// String NoVA = "NoVA"; //不支持语音播报(Voice Announcements)
String NoAccessories = "NoAccessories"; //不支持配件使能(不支持布撤防)
String UnsupportLiveShare = "UnsupportLiveShare"; //是否支持直播分享,easy4ip独有, 客户端自己的能力级相当于控制开关
String RTSV1 = "RTSV1";//实时流支持私有协议拉流
String PBSV1 = "PBSV1";//回放流支持私有协议拉流
String TSV1 = "TSV1"; //对讲支持私有协议拉流
String RTSV2 = "RTSV2";//实时流支持私有协议拉流(TLS)
String PBSV2 = "PBSV2";//回放流支持私有协议拉流(TLS)
String TSV2 = "TSV2"; //对讲支持私有协议拉流(TLS)
String TimingGraphics = "TimingGraphics"; //人形录像服务能力
String HumanDetect = "HumanDetect"; //人形检测海外
String AlarmPIRV2 = "AlarmPIRV2"; //支持PIR开关
String HUBAlarmPIRV2 = "HUBAlarmPIRV2"; //支持Hub PIR开关
String AlarmPIRV3 = "AlarmPIRV3"; //支持PIR扇形区域同时支持PIR使能开关
String AlarmPIRV4 = "AlarmPIRV4"; //支持PIR扇形区域
String LocalStorageEnable = "LocalStorageEnable"; //支持录像存储开关
String SearchLight = "SearchLight"; //探照灯
String CallByRtsp = "CallByRtsp"; //表示接听挂断可直接基于RTSP协议实现
String SirenTime = "SirenTime"; //支持警笛时长设置
String NVM = "NVM"; //支持夜视模式设置
String LEDS = "LEDS"; //支持补光灯灵敏度
String DaySummerTime = "DaySummerTime"; //按日夏令时
String WeekSummerTime = "WeekSummerTime";//按周夏令时
String SummerTimeOffset = "SummerTimeOffset"; //支持夏令时偏移量设置
String TimeFormat = "TimeFormat";//支持时间格式设置
String SceneMode = "SceneMode"; //支持布撤防情景模式设置
String SIMCA = "SIMCA"; //支持SIM卡相关配置
String SASQ = "SASQ";//配件防拆状态能力集
String MGOCS = "MGOCS";//支持门磁开关状态获取
String ModifyName = "ModifyName";//配件支持修改名称
String ElecInfo = "ElecInfo";//支持电量信息查询上报
String SigInfo = "SigInfo";//支持信号信息查询上报
String ACT = "ACT";//支持报警持续时间配置
String AlarmSound = "AlarmSound"; //支持报警音设置
String AiHuman = "AiHuman";//人形智能 TF8P
String AiCar = "AiCar";//车辆智能 TF8P
String Electric = "Electric";//设备支持电池电量能力
String WIFI = "WIFI";//设备支持获取WIFI信号强度能力
String DLOCS = "DLOCS";//门锁开关状态
String DDT = "DDT"; //支持布防延时能力
String OnlyArmed = "OnlyArmed"; //只支持布防(永久布防)
String NoPlan = "NoPlan";//不支持布防计划
String OpenDoorByFace = "OpenDoorByFace";//人脸开门
String OpenDoorByTouch = "OpenDoorByTouch";// 触摸开门
String PlaySoundModify = "PlaySoundModify";// 设备提示音调节能力
String TalkSoundModify = "TalkSoundModify";//对讲音量调节
String WideDynamic = "WideDynamic";// 宽动态
String LinkDevAlarm = "LinkDevAlarm";//关联设备报警
String LinkAccDevAlarm = "LinkAccDevAlarm";//关联配件报警
String AbAlarmSound = "AbAlarmSound";//异常报警音
String CheckAbDecible = "CheckAbDecible";//异常检测音分贝阈值
String Reboot = "Reboot";//设备重启
String PlaySound = "PlaySound"; //设备提示音开关能力
String AudioEncodeControl = "AudioEncodeControl"; //支持音频编码控制(开或关)
String AudioEncodeControlV2 = "AudioEncodeControlV2";//支持音频编码控制(开或关)只影响实时视频录像音频不影响对讲音频控制
String AccessoryAlarmSound = "AccessoryAlarmSound";//支持报警网关配件报警音效设置
String DeviceAlarmSound = "DeviceAlarmSound"; //设备报警音效设置
String RingAlarmSound = "RingAlarmSound";//支持门铃音量设置
String ChnLocalStorage = "ChnLocalStorage";//支持通道本地存储
String SCCode = "SCCode"; // 设备支持SC安全码
String CustomRing = "CustomRing";//自定义铃声
String InfraredLight = "InfraredLight";//红外灯能力集
String InstantDisAlarm = "InstantDisAlarm";//支持一键撤防能力
String IDAP = "IDAP";//支持一键撤防能力
String FaceDetect = "FaceDetect"; //支持人脸检测
String CallAbility = "CallAbility"; //支持呼叫能力
String CAV2 = "CAV2"; //支持呼叫能力且拒接时可选择播放自定义铃声
String HAV2 = "HAV2"; //徘徊报警V2支持统一的检测距离设置及逗留时长设置
String Ring = "Ring"; //仅支持铃声设置 LoginAfter DS11去除根据设备型号兼容逻辑 2019-4-3
String AX = "AX"; // 安消一体机
String HAV3 = "HAV3"; // 徘徊报警V3V2降级版不支持逗留时长立即设置
String VideoMotionSMD = "VideoMotionSMD";//包含人形和车辆能力
/*3.15.0*/
String TCM = "TCM"; //支持3码合一(Three code megre)
String TLSEnable = "TLSEnable";// 2019-8-20 支持拉流图片和云录像链路加密传输
/*5.0.0*/
String CLW = "CLW"; //通道报警联动白光灯
String CLS = "CLS"; //通道报警联动警笛
String CCR = "CCR"; //通道自定义铃声
String LED = "LED"; //补光灯
String ChnSiren = "ChnSiren"; //警笛
String ChnWhiteLight = "ChnWhiteLight"; //通道白光灯
String CLDA = "CLDA"; //通道关联设备报警
}

View File

@ -0,0 +1,24 @@
package com.mm.android.deviceaddmodule.mobilecommon.annotation;
import android.support.annotation.StringDef;
import java.lang.annotation.Retention;
import static com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceState.OFFLINE;
import static com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceState.ONLINE;
import static com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceState.SLEEP;
import static com.mm.android.deviceaddmodule.mobilecommon.annotation.DeviceState.UPGRADE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
/**
* 设备在离线状态枚举值
*/
@Retention(SOURCE)
@StringDef({ONLINE, OFFLINE, SLEEP,UPGRADE, ""})
public @interface DeviceState {
String ONLINE = "online";
String OFFLINE = "offline";
String SLEEP = "sleep";
String UPGRADE = "upgrading";
}

View File

@ -0,0 +1,71 @@
package com.mm.android.deviceaddmodule.mobilecommon.base;
import android.app.Activity;
import java.util.Stack;
/**
* <p>
* activity 栈管理
* </p>
*/
public class ActivityManager {
private static Stack<Activity> activityStack;
private static ActivityManager instance;
private ActivityManager() {
}
public static ActivityManager getScreenManager() {
if (instance == null) {
instance = new ActivityManager();
}
return instance;
}
// 退出栈顶Activity
public void popActivity(Activity activity) {
if (activity != null) {
// 在从自定义集合中取出当前Activity时也进行了Activity的关闭操作
//activity.finish();
activityStack.remove(activity);
activity = null;
}
}
// 获得当前栈顶Activity
public Activity currentActivity() {
Activity activity = null;
try{
if (activityStack != null && !activityStack.empty()){
activity = activityStack.lastElement();
}
}catch (Exception e){
return activity;
}
return activity;
}
// 将当前Activity推入栈中
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<>();
}
activityStack.add(activity);
}
// 退出栈中所有Activity
public void popAllActivityExceptOne(Class cls) {
while (true) {
Activity activity = currentActivity();
if (activity == null) {
break;
}
if (activity.getClass().equals(cls)) {
break;
}
popActivity(activity);
}
}
}

View File

@ -0,0 +1,190 @@
package com.mm.android.deviceaddmodule.mobilecommon.base;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;
import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.eventbus.event.BaseEvent;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
public class BaseActivity extends Activity implements IActivityResultDispatch {
private Toast mToast;
private ProgressDialog mProgressDialog;
private boolean isDestroyed = false;
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(BaseEvent event) {
}
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this);
mProgressDialog = new ProgressDialog(this, R.style.mobile_common_custom_dialog);
mProgressDialog.setCanceledOnTouchOutside(false);
}
@Override
protected void onDestroy() {
super.onDestroy();
dissmissProgressDialog();
isDestroyed = true;
mProgressDialog = null;
}
protected void showProgressDialog(int layoutId) {
if (mProgressDialog != null && !mProgressDialog.isShowing()) {
mProgressDialog.show();
mProgressDialog.setContentView(layoutId);
}
}
protected void dissmissProgressDialog() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
public boolean isActivityDestory() {
return isDestroyed;
}
protected void toast(int res) {
String content = "";
try {
content = getString(res);
} catch (Resources.NotFoundException e) {
LogUtil.debugLog("toast", "resource id not found!!!");
}
toast(content);
}
protected void toast(String content) {
if (mToast == null) {
mToast = Toast.makeText(this, content, Toast.LENGTH_SHORT);
} else {
mToast.setText(content);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}
/**
* 带错误码的toast
*
* @param errorCode
*/
public void toast(int res, int errorCode) {
if (mToast == null) {
mToast = Toast.makeText(this, getString(res) + "(" + errorCode + ")",
Toast.LENGTH_SHORT);
} else {
mToast.setText(getString(res) + "(" + errorCode + ")");
}
mToast.show();
}
protected void toastInCenter(int res) {
String content = "";
try {
content = getString(res);
} catch (Resources.NotFoundException e) {
LogUtil.debugLog("toast", "resource id not found!!!");
}
toastInCenter(content);
}
protected void toastInCenter(String content) {
if (mToast == null) {
mToast = Toast.makeText(this, content, Toast.LENGTH_SHORT);
mToast.setGravity(Gravity.CENTER, 0, 0);
TextView tv = mToast.getView().findViewById(android.R.id.message);
tv.setGravity(Gravity.CENTER);
} else {
mToast.setText(content);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}
@Override
public void startActivity(Intent intent) {
super.startActivity(intent);
overridePendingTransition(R.anim.mobile_common_slide_in_right, R.anim.mobile_common_slide_out_left);
}
public void startActivityNoAnimation(Intent intent) {
super.startActivity(intent);
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
//
}
public void startActivityForResultWithAnimation(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
overridePendingTransition(R.anim.mobile_common_slide_in_right, R.anim.mobile_common_slide_out_left);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.mobile_common_slide_left_back_in
, R.anim.mobile_common_slide_right_back_out);
}
public void finishNoAnimation() {
super.finish();
}
@Override
@CallSuper
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (listeners == null) return;
synchronized (listeners) {
for (OnActivityResultListener listener : listeners) {
if (listener != null) {
listener.onActivityResult(requestCode, resultCode, data);
}
}
}
}
private final List<IActivityResultDispatch.OnActivityResultListener> listeners = new ArrayList<>();
public void addOnActivityResultListener(IActivityResultDispatch.OnActivityResultListener listener) {
listeners.add(listener);
}
public void removeOnActivityResultListener(IActivityResultDispatch.OnActivityResultListener listener) {
if (listener != null) {
listeners.remove(listener);
}
}
}

Some files were not shown because too many files have changed in this diff Show More