Commit abe316ce625dc13943ef15efde7670bb6d72bbca

Authored by YangShuai
1 parent d9135ec9

1 搭建设备说明界面

2 自定义pop框
Showing 100 changed files with 3523 additions and 450 deletions
app/build.gradle
1 apply plugin: 'com.android.application' 1 apply plugin: 'com.android.application'
2 - 2 +static def stringValue(def value) {
  3 + return "\"${value}\""
  4 +}
3 android { 5 android {
4 compileSdkVersion 28 6 compileSdkVersion 28
5 defaultConfig { 7 defaultConfig {
6 - applicationId "com.cnlive.strike.xiaojiaspeaker" 8 + applicationId "com.cnlive.strike"
7 minSdkVersion 18 9 minSdkVersion 18
8 targetSdkVersion 28 10 targetSdkVersion 28
9 versionCode 1 11 versionCode 1
10 versionName "1.0" 12 versionName "1.0"
11 testInstrumentationRunner "android.test.runner.AndroidJUnitRunner" 13 testInstrumentationRunner "android.test.runner.AndroidJUnitRunner"
  14 + multiDexEnabled true
12 } 15 }
13 buildTypes { 16 buildTypes {
  17 + debug {
  18 + applicationIdSuffix ".debug"
  19 + resValue("string", "app_name", "网++ 内测")
  20 + buildConfigField("String", "APP_ID", stringValue("802_jhbqccxw08"))
  21 + buildConfigField("String", "APP_KEY", stringValue("9c5619e9be747bb3b925dd215ca5923d86f12c09b9394f"))
  22 + buildConfigField("String", "APP_SCERET", stringValue("1e6380cb347255e777f72b5aa60f41daa68443a132aaea"))
  23 + buildConfigField("String", "BAIDU_MAP_APP_KEY", stringValue("2IIsTtvX2FA88yvDrPZedc2ZvMhxyDbN"))
  24 +// BAIDU_MAP_APP_KEY: "OeotXc38bbnU7WmyKGA0VMahk4v35VG2" //测试
  25 +
  26 + manifestPlaceholders = [
  27 +
  28 + BAIDU_MAP_APP_KEY: "2IIsTtvX2FA88yvDrPZedc2ZvMhxyDbN"
  29 +// BAIDU_MAP_APP_KEY: "OeotXc38bbnU7WmyKGA0VMahk4v35VG2"
  30 +
  31 + ]
  32 + }
  33 +// BAIDU_MAP_APP_KEY: "Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2"//正式
  34 +// BAIDU_MAP_APP_KEY: "0bWeo04KKKHqTwozcqgyLZVd0oVhv3rZ"
  35 +
14 release { 36 release {
15 - minifyEnabled false  
16 - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 37 + resValue("string", "app_name", "网++")
  38 + buildConfigField("String", "APP_ID", stringValue("769_jetj7bq525"))
  39 + buildConfigField("String", "APP_KEY", stringValue("0d57b045ec0c3988a682d94c644e66b9b8e0d2b8ef937d"))
  40 + buildConfigField("String", "APP_SCERET", stringValue("275e8dc29274a1186d82f65bc607c231d02bcb3bfd8976"))
  41 + buildConfigField("String", "BAIDU_MAP_APP_KEY", stringValue("Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2"))
  42 +
  43 + manifestPlaceholders = [
  44 + BAIDU_MAP_APP_KEY: "Q7y9SGcZVs0tmhbNTiaz0jHm4S1xGzE2"
  45 +// BAIDU_MAP_APP_KEY: "0bWeo04KKKHqTwozcqgyLZVd0oVhv3rZ"
  46 + ]
17 } 47 }
18 } 48 }
19 dataBinding { 49 dataBinding {
20 enabled = true 50 enabled = true
21 } 51 }
  52 + dexOptions {
  53 + javaMaxHeapSize '4g'
  54 + }
22 compileOptions { 55 compileOptions {
23 sourceCompatibility = 1.8 56 sourceCompatibility = 1.8
24 targetCompatibility = 1.8 57 targetCompatibility = 1.8
@@ -29,7 +62,7 @@ android { @@ -29,7 +62,7 @@ android {
29 dependencies { 62 dependencies {
30 implementation fileTree(dir: 'libs', include: ['*.jar']) 63 implementation fileTree(dir: 'libs', include: ['*.jar'])
31 testImplementation 'junit:junit:4.12' 64 testImplementation 'junit:junit:4.12'
32 - compile project(path: ':module_xiaojiaSoundBox') 65 + implementation project(path: ':module_xiaojiaSoundBox')
33 implementation "com.android.support:support-v4:$rootProject.supportV4" 66 implementation "com.android.support:support-v4:$rootProject.supportV4"
34 implementation "com.android.support:appcompat-v7:$rootProject.appcompatV7" 67 implementation "com.android.support:appcompat-v7:$rootProject.appcompatV7"
35 implementation "com.android.support:design:$rootProject.design" 68 implementation "com.android.support:design:$rootProject.design"
@@ -38,4 +71,5 @@ dependencies { @@ -38,4 +71,5 @@ dependencies {
38 implementation "com.cnlive:app_arch:$rootProject.appArch" 71 implementation "com.cnlive:app_arch:$rootProject.appArch"
39 implementation "com.qmuiteam:qmui:$rootProject.qmui" 72 implementation "com.qmuiteam:qmui:$rootProject.qmui"
40 implementation "com.cnlive.libs:base:$rootProject.libBase" 73 implementation "com.cnlive.libs:base:$rootProject.libBase"
  74 + androidTestImplementation 'junit:junit:4.12'
41 } 75 }
app/src/androidTest/java/com/cnlive/strike/xiaojiaspeaker/ExampleInstrumentedTest.java deleted 100644 → 0
1 -package com.cnlive.strike.xiaojiaspeaker;  
2 -  
3 -import android.content.Context;  
4 -  
5 -import androidx.test.platform.app.InstrumentationRegistry;  
6 -import androidx.test.ext.junit.runners.AndroidJUnit4;  
7 -  
8 -import org.junit.Test;  
9 -import org.junit.runner.RunWith;  
10 -  
11 -import static org.junit.Assert.*;  
12 -  
13 -/**  
14 - * Instrumented test, which will execute on an Android device.  
15 - *  
16 - * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>  
17 - */  
18 -@RunWith(AndroidJUnit4.class)  
19 -public class ExampleInstrumentedTest {  
20 - @Test  
21 - public void useAppContext() {  
22 - // Context of the app under test.  
23 - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();  
24 -  
25 - assertEquals("com.cnlive.strike.xiaojiaspeaker", appContext.getPackageName());  
26 - }  
27 -}  
app/src/main/java/com/cnlive/strike/xiaojiaspeaker/MainActivity.java
@@ -5,8 +5,11 @@ import android.content.Intent; @@ -5,8 +5,11 @@ import android.content.Intent;
5 import android.os.Bundle; 5 import android.os.Bundle;
6 import android.support.v7.app.AppCompatActivity; 6 import android.support.v7.app.AppCompatActivity;
7 7
  8 +import com.cnlive.strike.xiaojiaspeaker.ui.activity.AllDeviceActivity;
8 import com.cnlive.strike.xiaojiaspeaker.ui.activity.BlueToothStep1Activity; 9 import com.cnlive.strike.xiaojiaspeaker.ui.activity.BlueToothStep1Activity;
9 import com.cnlive.strike.xiaojiaspeaker.ui.activity.BluetoothConnActivity; 10 import com.cnlive.strike.xiaojiaspeaker.ui.activity.BluetoothConnActivity;
  11 +import com.cnlive.strike.xiaojiaspeaker.ui.activity.ConnBluetoothSuccessActivity;
  12 +import com.cnlive.strike.xiaojiaspeaker.ui.activity.DeviceInstructionActivity;
10 import com.cnlive.strike.xiaojiaspeaker.ui.activity.SearchDeviceActivity; 13 import com.cnlive.strike.xiaojiaspeaker.ui.activity.SearchDeviceActivity;
11 import com.cnlive.strike.xiaojiaspeaker.ui.activity.SpeakerMainActivity; 14 import com.cnlive.strike.xiaojiaspeaker.ui.activity.SpeakerMainActivity;
12 15
@@ -19,8 +22,11 @@ public class MainActivity extends AppCompatActivity { @@ -19,8 +22,11 @@ public class MainActivity extends AppCompatActivity {
19 setContentView(R.layout.activity_speaker_main); 22 setContentView(R.layout.activity_speaker_main);
20 // startActivity(new Intent(MainActivity.this, SpeakerMainActivity.class)); 23 // startActivity(new Intent(MainActivity.this, SpeakerMainActivity.class));
21 // startActivity(new Intent(MainActivity.this, BluetoothConnActivity.class)); 24 // startActivity(new Intent(MainActivity.this, BluetoothConnActivity.class));
22 - startActivity(new Intent(MainActivity.this, BlueToothStep1Activity.class));  
23 - 25 +// startActivity(new Intent(MainActivity.this, BlueToothStep1Activity.class));
  26 +// startActivity(new Intent(MainActivity.this, ConnBluetoothSuccessActivity.class));
  27 + startActivity(new Intent(MainActivity.this, AllDeviceActivity.class));
  28 +// startActivity(new Intent(MainActivity.this, DeviceInstructionActivity.class));
  29 +//
24 30
25 finish(); 31 finish();
26 } 32 }
app/src/main/java/com/cnlive/strike/xiaojiaspeaker/MyApp.java
@@ -2,11 +2,17 @@ package com.cnlive.strike.xiaojiaspeaker; @@ -2,11 +2,17 @@ package com.cnlive.strike.xiaojiaspeaker;
2 2
3 import android.app.Application; 3 import android.app.Application;
4 4
  5 +import com.cnlive.libs.base.application.AppConfig;
  6 +import com.cnlive.strike.speaker.BuildConfig;
5 7
6 8
7 public class MyApp extends Application { 9 public class MyApp extends Application {
8 @Override 10 @Override
9 public void onCreate() { 11 public void onCreate() {
10 super.onCreate(); 12 super.onCreate();
  13 + String userId = "";
  14 + AppConfig.init(getApplicationContext(), BuildConfig.APP_ID, BuildConfig.APP_KEY, BuildConfig.APP_SCERET,
  15 + 0, BuildConfig.DEBUG, "", "",
  16 + userId, "", "", "", "");
11 } 17 }
12 } 18 }
app/src/main/res/values/strings.xml
1 <resources> 1 <resources>
2 - <string name="app_name">XiaoJiaSpeaker</string> 2 +<!-- <string name="app_name">XiaoJiaSpeaker</string>-->
3 </resources> 3 </resources>
module_xiaojiaSoundBox/build.gradle
1 apply plugin: 'com.android.library' 1 apply plugin: 'com.android.library'
  2 +apply from: './maven_push.gradle'
  3 +
  4 +static def stringValue(def value) {
  5 + return "\"${value}\""
  6 +}
2 7
3 android { 8 android {
4 compileSdkVersion 28 9 compileSdkVersion 28
@@ -17,12 +22,25 @@ android { @@ -17,12 +22,25 @@ android {
17 enabled = true 22 enabled = true
18 } 23 }
19 buildTypes { 24 buildTypes {
  25 + debug {
  26 + }
20 release { 27 release {
21 minifyEnabled false 28 minifyEnabled false
22 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 29 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23 } 30 }
24 } 31 }
  32 + compileOptions {
  33 + sourceCompatibility JavaVersion.VERSION_1_8
  34 + targetCompatibility JavaVersion.VERSION_1_8
  35 + }
25 36
  37 + dataBinding {
  38 + enabled true
  39 + }
  40 +
  41 + dexOptions {
  42 + javaMaxHeapSize '4g'
  43 + }
26 } 44 }
27 45
28 dependencies { 46 dependencies {
@@ -35,7 +53,9 @@ dependencies { @@ -35,7 +53,9 @@ dependencies {
35 implementation "com.cnlive:app_arch:$rootProject.appArch" 53 implementation "com.cnlive:app_arch:$rootProject.appArch"
36 implementation "com.qmuiteam:qmui:$rootProject.qmui" 54 implementation "com.qmuiteam:qmui:$rootProject.qmui"
37 implementation "com.cnlive.libs:base:$rootProject.libBase" 55 implementation "com.cnlive.libs:base:$rootProject.libBase"
38 -// implementation 'com.blakequ.androidblemanager:bluetooth-manager-lib:2.1.5' 56 + implementation "com.cnlive.libs:network:$rootProject.libNetwork"
  57 +
  58 + // 蓝牙相关
39 implementation 'com.clj.fastble:FastBleLib:2.3.4' 59 implementation 'com.clj.fastble:FastBleLib:2.3.4'
40 // https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md 60 // https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md
41 // implementation 'com.blankj:utilcode:1.25.9' 61 // implementation 'com.blankj:utilcode:1.25.9'
@@ -45,5 +65,13 @@ dependencies { @@ -45,5 +65,13 @@ dependencies {
45 // loading动画 65 // loading动画
46 implementation "com.wang.avi:library:$rootProject.avi" 66 implementation "com.wang.avi:library:$rootProject.avi"
47 67
  68 +// implementation 'com.android.support.constraint:constraint-layout:1.1.3'
  69 + implementation "com.scwang.smartrefresh:SmartRefreshLayout:$rootProject.SmartRefreshLayout"
  70 + implementation "com.scwang.smartrefresh:SmartRefreshHeader:$rootProject.SmartRefreshHeader"
  71 + // implementation 'com.android.support.constraint:constraint-layout:1.1.3'
  72 + // 动画库
  73 + // implementation 'com.android.support:support-compat:25.1.1'
  74 + implementation 'com.daimajia.easing:library:2.0@aar'
  75 + implementation 'com.daimajia.androidanimations:library:2.3@aar'
48 implementation 'com.android.support.constraint:constraint-layout:1.1.3' 76 implementation 'com.android.support.constraint:constraint-layout:1.1.3'
49 } 77 }
module_xiaojiaSoundBox/maven_push.gradle 0 → 100644
  1 +apply plugin: 'maven'
  2 +
  3 +uploadArchives() {
  4 + repositories {
  5 + mavenDeployer {
  6 + def lib = moudle_subscription
  7 + //发布环境(正式/测试)
  8 + android.defaultPublishConfig lib.debug ? "debug" : "release"
  9 + //发布渠道(地址/账号)
  10 + repository(url: maven.mavenMixedUrl) {
  11 + authentication(userName: maven.mavenUserName, password: maven.mavenPwd)
  12 + }
  13 + //发布信息(包名/别名/版本)
  14 + pom.project {
  15 + groupId lib.packeg
  16 + artifactId lib.name
  17 + version = lib.debug ? lib.version.concat("-SNAPSHOT") : lib.version
  18 + }
  19 + pom.whenConfigured { pom ->
  20 + pom.dependencies.clear()
  21 + }
  22 +
  23 + }
  24 + }
  25 +}
0 \ No newline at end of file 26 \ No newline at end of file
module_xiaojiaSoundBox/src/main/AndroidManifest.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:tools="http://schemas.android.com/tools"
3 package="com.cnlive.strike.xiaojiaspeaker"> 4 package="com.cnlive.strike.xiaojiaspeaker">
4 - 5 + <!-- wifi -->
  6 + <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  7 + <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
5 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 8 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
6 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 9 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
7 - <uses-permission android:name="android.permission.BLUETOOTH" />  
8 - <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />  
9 - <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
10 - <uses-permission android:name="android.permission.INTERNET" />  
11 - <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
12 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 10 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
  11 + <uses-permission
  12 + android:name="android.permission.WRITE_SECURE_SETTINGS"
  13 + tools:ignore="ProtectedPermissions" /> <!-- 蓝牙 -->
  14 + <uses-permission android:name="android.permission.BLUETOOTH" />
  15 + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- wifi和蓝牙都要 -->
13 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 16 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  17 + <uses-permission android:name="android.permission.INTERNET" />
14 18
15 <application> 19 <application>
16 - <activity android:name=".ui.activity.SelectWifiActivity"></activity> 20 + <activity android:name=".ui.activity.DeviceInstructionActivity"></activity>
  21 + <activity android:name=".ui.activity.AllDeviceActivity" />
  22 + <activity android:name=".ui.activity.ConnBluetoothSuccessActivity" />
  23 + <activity android:name=".ui.activity.SelectWifiActivity" />
17 <activity android:name=".ui.activity.BlueToothStep2Activity" /> 24 <activity android:name=".ui.activity.BlueToothStep2Activity" />
18 <activity android:name=".ui.activity.BlueToothStep1Activity" /> 25 <activity android:name=".ui.activity.BlueToothStep1Activity" />
19 <activity android:name=".ui.activity.BlueToothHelpActivity" /> 26 <activity android:name=".ui.activity.BlueToothHelpActivity" />
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/commonInfo/CommInfo.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.commonInfo;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import com.cnlive.strike.xiaojiaspeaker.util.MySpHelper;
  6 +
  7 +/**
  8 + * 公共参数
  9 + *
  10 + * @author ys
  11 + */
  12 +public class CommInfo {
  13 + //用户ID
  14 + private static final String KEY_USER_ID = "xiaojia_UserId";
  15 + //是否显示礼物弹窗
  16 + private static final String KEY_CONN_SUCCESS_GIF = "xiaojia_conn_success_gif";
  17 + // 设备sn
  18 + private static final String KEY_SN = "xiaojia_sn";
  19 + //当前token
  20 + private static final String KEY_TOKEN = "xiaojia_token";
  21 + //家庭云id
  22 + private static final String KEY_FAMILY_ID = "xiaojia_family_id";
  23 +
  24 + //
  25 + private static final int MyCurrentMode = Context.MODE_MULTI_PROCESS;
  26 +
  27 + public static void setFamilyId(Context context, String familyId) {
  28 + MySpHelper.getInstance(context, MyCurrentMode).putString(KEY_FAMILY_ID, familyId);
  29 + }
  30 +
  31 + public static String getFamilyId(Context context) {
  32 + return MySpHelper.getInstance(context, MyCurrentMode).getString(KEY_FAMILY_ID, "");
  33 + }
  34 +
  35 + //
  36 + public static void setToken(Context context, String token) {
  37 + MySpHelper.getInstance(context, MyCurrentMode).putString(KEY_TOKEN, token);
  38 + }
  39 +
  40 + public static String getToken(Context context) {
  41 + return MySpHelper.getInstance(context, MyCurrentMode).getString(KEY_TOKEN, "");
  42 + }
  43 +
  44 + public static String getSN(Context context) {
  45 + return MySpHelper.getInstance(context, MyCurrentMode).getString(KEY_SN, "");
  46 + }
  47 +
  48 + public static void setSN(Context context, String sn) {
  49 + MySpHelper.getInstance(context, MyCurrentMode).putString(KEY_SN, sn);
  50 + }
  51 +
  52 + public static boolean getIsShowConnGift(Context context) {
  53 + return MySpHelper.getInstance(context, MyCurrentMode).getBoolean(KEY_CONN_SUCCESS_GIF, true);
  54 + }
  55 +
  56 + public static void setIsShowConnGift(Context context, boolean isShow) {
  57 + MySpHelper.getInstance(context, MyCurrentMode).putBoolean(KEY_CONN_SUCCESS_GIF, isShow);
  58 + }
  59 +
  60 + /**
  61 + * @param context
  62 + * @param uid
  63 + */
  64 + public static void setUserId(Context context, String uid) {
  65 + MySpHelper.getInstance(context, MyCurrentMode).putString(KEY_USER_ID, uid);
  66 + }
  67 +
  68 + /**
  69 + * @param context
  70 + */
  71 + public static String getUserId(Context context) {
  72 + return MySpHelper.getInstance(context, MyCurrentMode).getString(KEY_USER_ID, "");
  73 + }
  74 +
  75 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/constants/BlufiConstants.java
@@ -20,4 +20,11 @@ public final class BlufiConstants { @@ -20,4 +20,11 @@ public final class BlufiConstants {
20 public static final int POST_DATA_LENGTH_LESS = 16; 20 public static final int POST_DATA_LENGTH_LESS = 16;
21 21
22 public static final String PREF_MESH_IDS_NAME = "espblufi_mesh_ids"; 22 public static final String PREF_MESH_IDS_NAME = "espblufi_mesh_ids";
  23 + // 音箱返回状态
  24 + public static final String SSID_RECEIVED = "ssid received";
  25 + public static final String WIFI_LINKING = "WiFi Linking";
  26 + public static final String WIFI_LINK_OK = "WiFi Link OK";
  27 + public static final String WIFI_LINK_FAIL = "WiFi Link Fail";
  28 +
  29 +
23 } 30 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/frame/presenter/AllDeviceFragmentPresenter.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.frame.presenter;
  2 +
  3 +import com.cnlive.strike.xiaojiaspeaker.frame.view.AllDeviceFragmentView;
  4 +import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
  5 +
  6 +public class AllDeviceFragmentPresenter extends MvpBasePresenter<AllDeviceFragmentView> {
  7 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/frame/presenter/SelectWifiFragmentPresenter.java
1 package com.cnlive.strike.xiaojiaspeaker.frame.presenter; 1 package com.cnlive.strike.xiaojiaspeaker.frame.presenter;
2 2
  3 +import android.app.Activity;
  4 +import android.content.Context;
  5 +import android.util.Log;
  6 +
  7 +import com.cnlive.libs.base.logic.Logic;
  8 +import com.cnlive.libs.base.logic.callback.DataCallback;
  9 +import com.cnlive.libs.base.logic.callback.FailureCallback;
  10 +import com.cnlive.libs.base.logic.callback.SuccessCallback;
  11 +import com.cnlive.libs.base.util.AlertUtil;
3 import com.cnlive.strike.xiaojiaspeaker.frame.view.SelectWifiFragmentView; 12 import com.cnlive.strike.xiaojiaspeaker.frame.view.SelectWifiFragmentView;
  13 +import com.cnlive.strike.xiaojiaspeaker.netWork.ApiServiceCMCC;
  14 +import com.cnlive.strike.xiaojiaspeaker.netWork.CmccRequest;
  15 +import com.cnlive.strike.xiaojiaspeaker.netWork.SubscriptionRequest;
  16 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.BaseInfo;
  17 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.ConfigDeviceNetParam;
  18 +import com.cnlive.strike.xiaojiaspeaker.netWork.result.ConfigDeviceNetResult;
  19 +import com.cnlive.strike.xiaojiaspeaker.ui.activity.ConnBluetoothSuccessActivity;
  20 +import com.cnlive.strike.xiaojiaspeaker.util.QMUITipDialogUtil;
4 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter; 21 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
5 22
  23 +import org.greenrobot.eventbus.EventBus;
  24 +
  25 +import java.util.Map;
  26 +
  27 +import io.reactivex.disposables.Disposable;
  28 +import okhttp3.MediaType;
  29 +import okhttp3.RequestBody;
  30 +import retrofit2.Call;
  31 +import retrofit2.Callback;
  32 +import retrofit2.Response;
  33 +
6 public class SelectWifiFragmentPresenter extends MvpBasePresenter<SelectWifiFragmentView> { 34 public class SelectWifiFragmentPresenter extends MvpBasePresenter<SelectWifiFragmentView> {
  35 + private String TAG = "SelectWifiFragmentPresenter";
  36 +
  37 + /**
  38 + * 查询配网情况
  39 + *
  40 + * @param context
  41 + * @param param
  42 + */
  43 + public void queryConfigDeviceNetResult(Activity context, ConfigDeviceNetParam param) {
  44 + CmccRequest.getInstance(ApiServiceCMCC.class)
  45 + .queryDeviceConfigNet(param)
  46 + .enqueue(new Callback<ConfigDeviceNetResult>() {
  47 + @Override
  48 + public void onResponse(Call<ConfigDeviceNetResult> call, Response<ConfigDeviceNetResult> response) {
  49 + if (null == getView()) {
  50 + return;
  51 + }
  52 + QMUITipDialogUtil.dismessDialog();
  53 + ConfigDeviceNetResult result = response.body();
  54 + //响应成功
  55 + if (CmccRequest.SUCCRSS == result.getResult()) {
  56 + Log.e(TAG, "onResponse: ");
  57 + if ("success".equals(result.getData().getResult())) {
  58 + context.finish();
  59 + ConnBluetoothSuccessActivity.startActivity(context);
  60 + } else {
  61 + AlertUtil.showDeftToast(context, "配网失败,请稍后重试");
  62 + }
  63 + } else {
  64 + //响应失败
  65 + AlertUtil.showDeftToast(context, "配网失败,请稍后重试");
  66 + }
  67 + }
  68 +
  69 + @Override
  70 + public void onFailure(Call<ConfigDeviceNetResult> call, Throwable t) {
  71 + QMUITipDialogUtil.dismessDialog();
  72 + }
  73 + });
  74 + }
7 } 75 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/frame/view/AllDeviceFragmentView.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.frame.view;
  2 +
  3 +import android.app.Activity;
  4 +import android.support.v7.widget.LinearLayoutManager;
  5 +
  6 +import com.cnlive.strike.xiaojiaspeaker.model.AllDeviceInfo;
  7 +import com.cnlive.strike.xiaojiaspeaker.ui.activity.BlueToothStep1Activity;
  8 +import com.cnlive.strike.xiaojiaspeaker.ui.adapter.AllDeviceAdapter;
  9 +import com.cnlive.strike.xiaojiaspeaker.ui.fragment.AllDeviceFragment;
  10 +import com.hannesdorfmann.mosby3.mvp.MvpView;
  11 +
  12 +import java.util.ArrayList;
  13 +import java.util.List;
  14 +
  15 +public class AllDeviceFragmentView implements MvpView {
  16 + private AllDeviceFragment fragment;
  17 + private AllDeviceAdapter adapter;
  18 + private List<AllDeviceInfo> allDeviceInfoList;
  19 +
  20 + public AllDeviceFragmentView(AllDeviceFragment fragment) {
  21 + this.fragment = fragment;
  22 + }
  23 +
  24 + public Activity getContext() {
  25 + return fragment == null ? null : fragment.getActivity();
  26 + }
  27 +
  28 + public void initView() {
  29 + AllDeviceInfo allDeviceInfo = new AllDeviceInfo();
  30 + allDeviceInfoList = new ArrayList<>();
  31 + allDeviceInfoList.add(allDeviceInfo);
  32 + adapter = new AllDeviceAdapter(getContext(), allDeviceInfoList);
  33 + fragment.binding.rvAllDevice.setLayoutManager(new LinearLayoutManager(getContext()));
  34 + fragment.binding.rvAllDevice.setAdapter(adapter);
  35 + adapter.setOnAddClickListener(new AllDeviceAdapter.OnAddClickListener() {
  36 + @Override
  37 + public void onAddClick() {
  38 + BlueToothStep1Activity.startActivity(fragment.getActivity());
  39 + }
  40 + });
  41 + }
  42 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/frame/view/SearchDevicefragmentView.java
@@ -136,83 +136,7 @@ public class SearchDevicefragmentView implements MvpView { @@ -136,83 +136,7 @@ public class SearchDevicefragmentView implements MvpView {
136 scanBlueToothDevice(); 136 scanBlueToothDevice();
137 } 137 }
138 138
139 - private void connectDevice(BleDevice bleDevice) {  
140 - BleManager.getInstance().disconnect(bleDevice);  
141 - BleManager.getInstance().connect(bleDevice, new BleGattCallback() {  
142 - // 开始连接  
143 - @Override  
144 - public void onStartConnect() {  
145 - if (null == getContext()) {  
146 - return;  
147 - }  
148 - }  
149 -  
150 - // 连接失败  
151 - @Override  
152 - public void onConnectFail(BleDevice bleDevice, BleException exception) {  
153 -  
154 - }  
155 -  
156 - // 连接成功,BleDevice即为所连接的BLE设备  
157 - @Override  
158 - public void onConnectSuccess(final BleDevice bleDevice, BluetoothGatt gatt, int status) {  
159 -  
160 - BleManager.getInstance().notify(  
161 - bleDevice,  
162 - BlufiConstants.UUID_WIFI_SERVICE.toString(),  
163 - BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString(),  
164 - new BleNotifyCallback() {  
165 - @Override  
166 - public void onNotifySuccess() {  
167 - Log.e(TAG, "onNotifySuccess: ");  
168 - // 打开通知操作成功  
169 - BleManager.getInstance().write(  
170 - bleDevice,  
171 - BlufiConstants.UUID_WIFI_SERVICE.toString(),  
172 - BlufiConstants.UUID_WRITE_CHARACTERISTIC.toString(),  
173 - (BlueToothUtil.getSSIDAndPwd("CNLive-VIP", "cnlIVE_99", "he:28850150e8bd4c830314819939361b77")).getBytes(),  
174 - new BleWriteCallback() {  
175 - @Override  
176 - public void onWriteSuccess(int current, int total, byte[] justWrite) {  
177 - Log.e(TAG, "onWriteSuccess: " + justWrite.toString());  
178 - // 发送数据到设备成功(分包发送的情况下,可以通过方法中返回的参数可以查看发送进度)  
179 - }  
180 -  
181 - @Override  
182 - public void onWriteFailure(BleException exception) {  
183 - Log.e(TAG, "onWriteFailure: ");  
184 139
185 - }  
186 - });  
187 - //  
188 - }  
189 -  
190 - @Override  
191 - public void onNotifyFailure(BleException exception) {  
192 - Log.e(TAG, "onNotifyFailure: " + exception);  
193 - }  
194 -  
195 - @Override  
196 - public void onCharacteristicChanged(byte[] data) {  
197 - try {  
198 - Log.e(TAG, "onCharacteristicChanged: " + new String(data, "UTF-8"));  
199 - } catch (UnsupportedEncodingException e) {  
200 - e.printStackTrace();  
201 - }  
202 - }  
203 - }  
204 - );  
205 -  
206 -  
207 - }  
208 -  
209 - // 连接中断,isActiveDisConnected表示是否是主动调用了断开连接方法  
210 - @Override  
211 - public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {  
212 -  
213 - }  
214 - });  
215 - }  
216 140
217 /** 141 /**
218 * 开始扫描蓝牙设备 142 * 开始扫描蓝牙设备
@@ -223,8 +147,8 @@ public class SearchDevicefragmentView implements MvpView { @@ -223,8 +147,8 @@ public class SearchDevicefragmentView implements MvpView {
223 } 147 }
224 //隐藏loading视图 148 //隐藏loading视图
225 hideView(fragment.binding.llRetry); 149 hideView(fragment.binding.llRetry);
226 - if (null != bleDevices) {  
227 - bleDevices.clear(); 150 + if (null != adapter) {
  151 + adapter.clearData();
228 } 152 }
229 BleManager.getInstance().scan(new BleScanCallback() { 153 BleManager.getInstance().scan(new BleScanCallback() {
230 // 扫描结束,列出所有扫描到的符合扫描规则的BLE设备(主线程) 154 // 扫描结束,列出所有扫描到的符合扫描规则的BLE设备(主线程)
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/frame/view/SelectWifiFragmentView.java
1 package com.cnlive.strike.xiaojiaspeaker.frame.view; 1 package com.cnlive.strike.xiaojiaspeaker.frame.view;
2 2
3 import android.app.Activity; 3 import android.app.Activity;
4 -import android.content.BroadcastReceiver;  
5 -import android.content.Context;  
6 -import android.content.Intent;  
7 -import android.content.IntentFilter;  
8 -import android.net.NetworkInfo; 4 +import android.bluetooth.BluetoothGatt;
  5 +import android.graphics.Typeface;
9 import android.net.wifi.ScanResult; 6 import android.net.wifi.ScanResult;
10 -import android.net.wifi.WifiManager; 7 +import android.support.annotation.NonNull;
  8 +import android.support.v4.content.ContextCompat;
11 import android.support.v7.widget.LinearLayoutManager; 9 import android.support.v7.widget.LinearLayoutManager;
  10 +import android.text.TextUtils;
12 import android.util.Log; 11 import android.util.Log;
  12 +import android.view.View;
13 13
14 -import com.cnlive.strike.xiaojiaspeaker.model.WifiConnModel;  
15 -import com.cnlive.strike.xiaojiaspeaker.ui.activity.SpeakerMainActivity; 14 +import com.clj.fastble.BleManager;
  15 +import com.clj.fastble.callback.BleGattCallback;
  16 +import com.clj.fastble.callback.BleNotifyCallback;
  17 +import com.clj.fastble.callback.BleWriteCallback;
  18 +import com.clj.fastble.data.BleDevice;
  19 +import com.clj.fastble.exception.BleException;
  20 +import com.cnlive.libs.base.util.AlertUtil;
  21 +import com.cnlive.strike.xiaojiaspeaker.R;
  22 +import com.cnlive.strike.xiaojiaspeaker.constants.BlufiConstants;
  23 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.ConfigDeviceNetParam;
16 import com.cnlive.strike.xiaojiaspeaker.ui.adapter.WifiRecycleAdapter; 24 import com.cnlive.strike.xiaojiaspeaker.ui.adapter.WifiRecycleAdapter;
17 import com.cnlive.strike.xiaojiaspeaker.ui.fragment.SelectWifiFragment; 25 import com.cnlive.strike.xiaojiaspeaker.ui.fragment.SelectWifiFragment;
  26 +import com.cnlive.strike.xiaojiaspeaker.ui.widget.TipDialog;
  27 +import com.cnlive.strike.xiaojiaspeaker.ui.widget.WifiPwdDialog;
  28 +import com.cnlive.strike.xiaojiaspeaker.util.BlueToothUtil;
  29 +import com.cnlive.strike.xiaojiaspeaker.util.QMUITipDialogUtil;
18 import com.cnlive.strike.xiaojiaspeaker.util.WifiUtils; 30 import com.cnlive.strike.xiaojiaspeaker.util.WifiUtils;
19 import com.hannesdorfmann.mosby3.mvp.MvpView; 31 import com.hannesdorfmann.mosby3.mvp.MvpView;
20 32
  33 +import java.io.UnsupportedEncodingException;
21 import java.util.ArrayList; 34 import java.util.ArrayList;
22 import java.util.List; 35 import java.util.List;
  36 +import java.util.logging.Handler;
23 37
24 public class SelectWifiFragmentView implements MvpView { 38 public class SelectWifiFragmentView implements MvpView {
25 private SelectWifiFragment fragment; 39 private SelectWifiFragment fragment;
@@ -27,6 +41,11 @@ public class SelectWifiFragmentView implements MvpView { @@ -27,6 +41,11 @@ public class SelectWifiFragmentView implements MvpView {
27 private List<ScanResult> results = new ArrayList<>(); 41 private List<ScanResult> results = new ArrayList<>();
28 private WifiUtils wifiUtils; 42 private WifiUtils wifiUtils;
29 private String TAG = "SelectWifiView"; 43 private String TAG = "SelectWifiView";
  44 + private WifiPwdDialog wifiPwdDialog;
  45 + private TipDialog errorDialog;
  46 + private String SSID;
  47 + private BleDevice bleDevice;
  48 + private Handler failHandler;
30 49
31 public SelectWifiFragmentView(SelectWifiFragment fragment) { 50 public SelectWifiFragmentView(SelectWifiFragment fragment) {
32 this.fragment = fragment; 51 this.fragment = fragment;
@@ -37,16 +56,86 @@ public class SelectWifiFragmentView implements MvpView { @@ -37,16 +56,86 @@ public class SelectWifiFragmentView implements MvpView {
37 return fragment == null ? null : fragment.getActivity(); 56 return fragment == null ? null : fragment.getActivity();
38 } 57 }
39 58
40 - public void initWifiList() { 59 + public void initWifiList(final BleDevice bleDevice) {
  60 + this.bleDevice = bleDevice;
  61 + showLoading();
  62 + initWifiPwdDialog();
  63 + initErrorDialog();
41 if (null == adapter) { 64 if (null == adapter) {
42 adapter = new WifiRecycleAdapter(getContext(), results); 65 adapter = new WifiRecycleAdapter(getContext(), results);
43 fragment.binding.rvWifi.setLayoutManager(new LinearLayoutManager(getContext())); 66 fragment.binding.rvWifi.setLayoutManager(new LinearLayoutManager(getContext()));
44 fragment.binding.rvWifi.setAdapter(adapter); 67 fragment.binding.rvWifi.setAdapter(adapter);
45 } 68 }
  69 + adapter.setOnItemClickListener(new WifiRecycleAdapter.onItemClickListener() {
  70 + @Override
  71 + public void onItemClick(int position, ScanResult scanResult) {
  72 + String encryptionType = scanResult.capabilities;
  73 + SSID = scanResult.SSID;
  74 + //判断是否需要输入密码
  75 + if (!encryptionType.contains("WEP") && !encryptionType.contains("PSK") && !encryptionType.contains("EAP")) {
  76 + Log.e(TAG, "onItemClick: 不需要密码");
  77 + connectDevice(bleDevice, SSID, "");
  78 + } else {
  79 + //需要密码
  80 + if (!wifiPwdDialog.isShowing()) {
  81 + wifiPwdDialog.setMsgTip(scanResult.SSID);
  82 + wifiPwdDialog.show();
  83 + }
  84 + }
  85 + }
  86 + });
46 wifiUtils.startScanWifi(); 87 wifiUtils.startScanWifi();
47 } 88 }
48 89
  90 + private void initErrorDialog() {
  91 + errorDialog = new TipDialog(getContext(), "", "关闭", R.color.btn_green, new TipDialog.DialogInterface() {
  92 + @Override
  93 + public void onClick(TipDialog dialog) {
  94 + dialog.dismiss();
  95 + }
  96 + });
  97 + errorDialog.setTipTextStyle(Typeface.DEFAULT);
  98 + errorDialog.setTipTextSize(16);
  99 + errorDialog.setCancelable(false);
  100 + errorDialog.setCanceledOnTouchOutside(false);
  101 + }
  102 +
  103 + private void initRefreshLayout() {
  104 +// fragment.binding.refreshLayout.setEnableLoadMore(false);
  105 +// fragment.binding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
  106 +// @Override
  107 +// public void onRefresh(@NonNull RefreshLayout refreshLayout) {
  108 +// showLoading();
  109 +// wifiUtils.startScanWifi();
  110 +// }
  111 +// });
  112 + }
  113 +
  114 + private void initWifiPwdDialog() {
  115 + wifiPwdDialog = new WifiPwdDialog(getContext(), "", "取消", new WifiPwdDialog.DialogInterface() {
  116 + @Override
  117 + public void onClick(WifiPwdDialog dialog) {
  118 + dialog.dismiss();
  119 + }
  120 + }, "确定", new WifiPwdDialog.ConnDialogInterface() {
  121 + @Override
  122 + public void onClick(WifiPwdDialog dialog, String pwd) {
  123 + if (!TextUtils.isEmpty(pwd) && !TextUtils.isEmpty(SSID)) {
  124 + dialog.dismiss();
  125 + connectDevice(bleDevice, SSID, pwd);
  126 + } else {
  127 + AlertUtil.showDeftToast(getContext(), "密码不能为空");
  128 + }
  129 + }
  130 + });
  131 + wifiPwdDialog.setLeftBtnColor(R.color.color_999999);
  132 + wifiPwdDialog.setRightBtnColor(R.color.btn_green);
  133 + wifiPwdDialog.setCancelable(false);
  134 + wifiPwdDialog.setCanceledOnTouchOutside(false);
  135 + }
  136 +
49 public void updateWifiList() { 137 public void updateWifiList() {
  138 + hideLoading();
50 List<ScanResult> scanResults = wifiUtils.getScanResults(); 139 List<ScanResult> scanResults = wifiUtils.getScanResults();
51 if (null != scanResults && null != results) { 140 if (null != scanResults && null != results) {
52 results.clear(); 141 results.clear();
@@ -56,5 +145,149 @@ public class SelectWifiFragmentView implements MvpView { @@ -56,5 +145,149 @@ public class SelectWifiFragmentView implements MvpView {
56 } 145 }
57 } 146 }
58 } 147 }
  148 +
  149 + public void showLoading() {
  150 + if (null == getContext()) {
  151 + return;
  152 + }
  153 + fragment.binding.avLoading.show();
  154 + fragment.binding.llLoading.setVisibility(View.VISIBLE);
  155 + //设置按钮不可点击
  156 + fragment.binding.btnNext.setClickable(false);
  157 + fragment.binding.btnNext.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.shape_btn_press));
  158 +
  159 + }
  160 +
  161 + public void hideLoading() {
  162 + if (null == getContext()) {
  163 + return;
  164 + }
  165 +// fragment.binding.refreshLayout.finishRefresh();
  166 + fragment.binding.avLoading.hide();
  167 + fragment.binding.llLoading.setVisibility(View.GONE);
  168 + //设置按钮可点击
  169 + fragment.binding.btnNext.setClickable(true);
  170 + fragment.binding.btnNext.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.selector_btn_green));
  171 + }
  172 +
  173 + private void connectDevice(BleDevice bleDevice, final String wifiSSID, final String wifiPwd) {
  174 + BleManager.getInstance().disconnect(bleDevice);
  175 + BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
  176 + // 开始连接
  177 + @Override
  178 + public void onStartConnect() {
  179 + if (null == getContext()) {
  180 + return;
  181 + }
  182 + QMUITipDialogUtil.loadingDialog(getContext(), "正在连接中,请稍后...", false);
  183 +
  184 + }
  185 +
  186 + // 连接失败
  187 + @Override
  188 + public void onConnectFail(BleDevice bleDevice, BleException exception) {
  189 + QMUITipDialogUtil.failedDialog(getContext(), "连接失败,请重试...", 2);
  190 + Log.e(TAG, "onConnectFail: " + exception);
  191 + }
  192 +
  193 + // 连接成功,BleDevice即为所连接的BLE设备
  194 + @Override
  195 + public void onConnectSuccess(final BleDevice bleDevice, BluetoothGatt gatt, int status) {
  196 + BleManager.getInstance().notify(
  197 + bleDevice,
  198 + BlufiConstants.UUID_WIFI_SERVICE.toString(),
  199 + BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString(),
  200 + new BleNotifyCallback() {
  201 + @Override
  202 + public void onNotifySuccess() {
  203 +
  204 + // 打开通知操作成功
  205 + BleManager.getInstance().write(
  206 + bleDevice,
  207 + BlufiConstants.UUID_WIFI_SERVICE.toString(),
  208 + BlufiConstants.UUID_WRITE_CHARACTERISTIC.toString(),
  209 + (BlueToothUtil.getSSIDAndPwd(wifiSSID, wifiPwd, "he:28850150e8bd4c830314819939361b77")).getBytes(),
  210 + new BleWriteCallback() {
  211 + @Override
  212 + public void onWriteSuccess(int current, int total, byte[] justWrite) {
  213 + Log.e(TAG, "onWriteSuccess: " + current + "," + total);
  214 + // 发送数据到设备成功(分包发送的情况下,可以通过方法中返回的参数可以查看发送进度)
  215 + }
  216 +
  217 + @Override
  218 + public void onWriteFailure(BleException exception) {
  219 + Log.e(TAG, "onWriteFailure: ");
  220 + QMUITipDialogUtil.failedDialog(getContext(), "连接失败,请重试...", 2);
  221 +
  222 + }
  223 + });
  224 + //
  225 + }
  226 +
  227 + @Override
  228 + public void onNotifyFailure(BleException exception) {
  229 + Log.e(TAG, "onNotifyFailure: " + exception);
  230 + QMUITipDialogUtil.failedDialog(getContext(), "连接失败,请重试...", 2);
  231 +
  232 + }
  233 +
  234 + @Override
  235 + public void onCharacteristicChanged(byte[] data) {
  236 + if (null == getContext()) {
  237 + return;
  238 + }
  239 + try {
  240 + String result = new String(data, "UTF-8");
  241 + Log.e(TAG, "onCharacteristicChanged: " + result);
  242 + if (result.indexOf(BlufiConstants.WIFI_LINK_OK) != -1) {
  243 + BleManager.getInstance().stopNotify(bleDevice, BlufiConstants.UUID_WIFI_SERVICE.toString(), BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString());
  244 + BleManager.getInstance().disconnect(bleDevice);
  245 + //查询配网是否成功
  246 + if (null == getContext()) {
  247 + return;
  248 + }
  249 + queryDeviceConfigNet(getContext());
  250 + } else if (result.indexOf(BlufiConstants.WIFI_LINK_FAIL) != -1) {
  251 + if (null != errorDialog) {
  252 + if (!TextUtils.isEmpty(SSID)) {
  253 + errorDialog.setTipMsg(SSID + "\n密码错误");
  254 + if (!errorDialog.isShowing()) {
  255 + errorDialog.show();
  256 + }
  257 + }
  258 + }
  259 + QMUITipDialogUtil.dismessDialog();
  260 + BleManager.getInstance().stopNotify(bleDevice, BlufiConstants.UUID_WIFI_SERVICE.toString(), BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString());
  261 + BleManager.getInstance().disconnect(bleDevice);
  262 + }
  263 + } catch (UnsupportedEncodingException e) {
  264 + e.printStackTrace();
  265 + }
  266 + }
  267 + }
  268 + );
  269 +
  270 +
  271 + }
  272 +
  273 + // 连接中断,isActiveDisConnected表示是否是主动调用了断开连接方法
  274 + @Override
  275 + public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
  276 +
  277 + }
  278 + });
  279 + }
  280 +
  281 +
  282 + private void queryDeviceConfigNet(Activity activity) {
  283 + ConfigDeviceNetParam param = new ConfigDeviceNetParam();
  284 + param.setAction("mc/getWifiResult");
  285 + ConfigDeviceNetParam.DataBean dataBean = new ConfigDeviceNetParam.DataBean();
  286 + dataBean.setFrom("he:28850150e8bd4c830314819939361b77");
  287 + dataBean.setMyid("he:28850150e8bd4c830314819939361b77");
  288 + dataBean.setToken("6fdff0f39ec659c94dd12cdc32937e9d");
  289 + param.setData(dataBean);
  290 + fragment.getPresenter().queryConfigDeviceNetResult(activity, param);
  291 + }
59 } 292 }
60 293
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/model/AllDeviceInfo.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.model;
  2 +
  3 +/**
  4 + * 所有设备信息
  5 + *
  6 + * @author ys
  7 + */
  8 +public class AllDeviceInfo {
  9 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/model/PopMenuInfo.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.model;
  2 +
  3 +public class PopMenuInfo {
  4 + private String title;
  5 + private int imgDraw;
  6 +
  7 + public String getTitle() {
  8 + return title;
  9 + }
  10 +
  11 + public void setTitle(String title) {
  12 + this.title = title;
  13 + }
  14 +
  15 + public int getImgDraw() {
  16 + return imgDraw;
  17 + }
  18 +
  19 + public void setImgDraw(int imgDraw) {
  20 + this.imgDraw = imgDraw;
  21 + }
  22 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/ApiServiceCMCC.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork;
  2 +
  3 +
  4 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.BaseInfo;
  5 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.ConfigDeviceNetParam;
  6 +import com.cnlive.strike.xiaojiaspeaker.netWork.result.ConfigDeviceNetResult;
  7 +
  8 +import java.util.Map;
  9 +
  10 +import io.reactivex.Observable;
  11 +import okhttp3.RequestBody;
  12 +import retrofit2.Call;
  13 +import retrofit2.adapter.rxjava2.Result;
  14 +import retrofit2.http.Body;
  15 +import retrofit2.http.POST;
  16 +import retrofit2.http.Query;
  17 +import retrofit2.http.QueryMap;
  18 +
  19 +/**
  20 + * 移动官方接口
  21 + */
  22 +public interface ApiServiceCMCC {
  23 +
  24 + /**
  25 + * 查询设备配网结果
  26 + *
  27 + * @return
  28 + */
  29 + @POST("users/custom")
  30 + Call<ConfigDeviceNetResult> queryDeviceConfigNet(@Body ConfigDeviceNetParam param);
  31 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/ApiServiceXIaoJia.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork;
  2 +
  3 +
  4 +import java.util.Map;
  5 +
  6 +import io.reactivex.Observable;
  7 +import retrofit2.adapter.rxjava2.Result;
  8 +import retrofit2.http.GET;
  9 +import retrofit2.http.POST;
  10 +import retrofit2.http.QueryMap;
  11 +
  12 +/**
  13 + * 达人有关的接口
  14 + */
  15 +public interface ApiServiceXIaoJia {
  16 +
  17 +}
  18 +
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/ApiSubscriber.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork;
  2 +
  3 +
  4 +import com.cnlive.libs.data.network.Subscriber;
  5 +
  6 +/**
  7 + * Created by xiansong on 2017/9/8.
  8 + */
  9 +
  10 +public class ApiSubscriber {
  11 +
  12 + private static final String success_code = "0";
  13 + private static final String success_message = "数据加载成功";
  14 +
  15 + public static final Subscriber.Config subscriberBuild = Subscriber.newConfig()
  16 + .putInfo(Subscriber.Config.response_success, success_code, success_message) ;
  17 +
  18 + public static String getSuccessCode(){
  19 + return success_code;
  20 + }
  21 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/CmccRequest.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork;
  2 +
  3 +import com.cnlive.strike.xiaojiaspeaker.netWork.result.ConfigDeviceNetResult;
  4 +
  5 +import java.io.IOException;
  6 +
  7 +import okhttp3.Interceptor;
  8 +import okhttp3.OkHttpClient;
  9 +import okhttp3.Request;
  10 +import okhttp3.Response;
  11 +import retrofit2.Call;
  12 +import retrofit2.Retrofit;
  13 +import retrofit2.converter.gson.GsonConverterFactory;
  14 +
  15 +public class CmccRequest {
  16 + private static Retrofit retrofit;
  17 + private static Class mclass;
  18 + //移动官方接口
  19 + private static final String CMCC_API_DEBUG_URL = "http://storybox.roobo.net/";
  20 + private static final String CMCC_API_REA_URL = "https://storybox-api.roobo.com/rtoy/";
  21 + private static String TAG = "CmccRequest";
  22 +
  23 + //错误状态码
  24 + public static final int ERROR_5 = -5;//更新数据失败
  25 + public static final int SUCCRSS = 0;//成功
  26 +
  27 + public static ApiServiceCMCC getInstance(Class<ApiServiceCMCC> mclass) {
  28 + if (null == retrofit) {
  29 + // 创建Retrofit对象
  30 + retrofit = new Retrofit.Builder()
  31 + .baseUrl(CMCC_API_REA_URL)//设置网络请求url,后面一段写在网络请求接口里面
  32 + .addConverterFactory(GsonConverterFactory.create())//添加Gson支持,然后Retrofit就会使用Gson将响应体(api接口的Take)转换我们想要的类型。
  33 + .client(new OkHttpClient.Builder().addInterceptor(new Interceptor() {
  34 + @Override
  35 + public Response intercept(Chain chain) throws IOException {
  36 + Request request = chain.request()
  37 + .newBuilder()
  38 + .addHeader("Content-Type", "application/json;charset=UTF-8")
  39 + .build();
  40 + return chain.proceed(request);
  41 + }
  42 + }).build())
  43 + .build();
  44 + }
  45 + return retrofit.create(mclass);
  46 + }
  47 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/SubscriptionRequest.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork;
  2 +
  3 +import android.content.Context;
  4 +
  5 +import com.cnlive.libs.base.application.AppConfig;
  6 +import com.cnlive.libs.base.logic.callback.DataCallback;
  7 +import com.cnlive.libs.data.network.ApiBuild;
  8 +import com.cnlive.libs.data.network.Subscriber;
  9 +import com.cnlive.libs.data.network.interceptor.NetPPEncryptInterceptor;
  10 +import com.cnlive.libs.data.network.interceptor.NetPPPayEncryptInterceptor;
  11 +import com.cnlive.libs.data.network.interceptor.SignEncryptInterceptor;
  12 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.BaseInfo;
  13 +
  14 +import io.reactivex.android.schedulers.AndroidSchedulers;
  15 +import io.reactivex.disposables.Disposable;
  16 +import io.reactivex.schedulers.Schedulers;
  17 +import okhttp3.Interceptor;
  18 +import retrofit2.adapter.rxjava2.Result;
  19 +
  20 +import static com.cnlive.libs.base.logic.Config.SUCCESS;
  21 +
  22 +/**
  23 + * Created by Lynn on 2019/3/27.
  24 + * modify by ShinnyYang
  25 + */
  26 +public class SubscriptionRequest<Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> {
  27 + private static final String SP_CMS_URL_DEBUT = "http://cmstest.cnlive.com:8768/";
  28 + private static final String SP_CMS_URL = "http://cms.cnlive.com:8768/";
  29 + private static final int OKHTTP_KEEP_ALIVE_DURATION_SECONDS = 10;
  30 + //OPEN API 接口域名
  31 + private static final String OPEN_URL = "https://api.cnlive.com/";
  32 + //网++ 接口域名
  33 + public static final String SP_BASE_URL = "https://apiwjj.cnlive.com/";
  34 + //网++ 测试环境 接口域名
  35 + public static final String SP_DEBUG_URL = "http://apiwjjtest.cnlive.com/";
  36 + //OPEN API 接口域名
  37 + private Observable observable;
  38 + //移动官方接口
  39 + public static final String CMCC_API_DEBUG_URL = "http://storybox.roobo.net/";
  40 + public static final String CMCC_API_REA_URL = "https://storybox-api.roobo.com/rtoy/";
  41 +
  42 + private static <T> String baseCMSEndpoint() {
  43 + return AppConfig.isDebug() ? SP_CMS_URL_DEBUT : SP_CMS_URL;
  44 + }
  45 +
  46 + public static <T> String baseEndpoint() {
  47 + return AppConfig.isDebug() ? SP_DEBUG_URL : SP_BASE_URL;
  48 + }
  49 +
  50 + private static <T> String serviceEndpoint(Class<T> clazz) {
  51 + //中国移动直接用正式环境
  52 + if (clazz == ApiServiceCMCC.class) {
  53 + return CMCC_API_REA_URL;
  54 + }
  55 +// else if (clazz == ApiServiceCMCC.class) {
  56 +// return BAIDU_TRACE_URL;
  57 +// } else {
  58 + return baseEndpoint();
  59 +// }
  60 + }
  61 +
  62 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  63 + SubscriptionRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  64 + return service(clazz, api, new SignEncryptInterceptor());
  65 + }
  66 +
  67 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  68 + SubscriptionRequest<Observable, BaseData> cmccService(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  69 + return service(clazz, api, null);
  70 + }
  71 +
  72 + public static <Service> Service service(Class<Service> clazz) {
  73 + return service(clazz, new SignEncryptInterceptor());
  74 + }
  75 +
  76 +
  77 + private static <Service> Service service(Class<Service> clazz, Interceptor... interceptor) {
  78 + return service(clazz, false, interceptor);
  79 + }
  80 +
  81 + private static <Service> Service service(Class<Service> clazz, boolean decode, Interceptor... interceptor) {
  82 + return ApiBuild.service(clazz, null)
  83 + .setEndpoint(serviceEndpoint(clazz))
  84 + .addInterceptor(interceptor)
  85 + .service(decode, OKHTTP_KEEP_ALIVE_DURATION_SECONDS);
  86 + }
  87 +
  88 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  89 + SubscriptionRequest<Observable, BaseData> serviceEncrypt(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  90 + return service(clazz, api, new NetPPEncryptInterceptor());
  91 + }
  92 +
  93 + public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  94 + SubscriptionRequest<Observable, BaseData> servicePayEncrypt(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
  95 + return service(clazz, api, new NetPPPayEncryptInterceptor());
  96 + }
  97 +
  98 + private static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  99 + SubscriptionRequest<Observable, BaseData> service(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api, Interceptor... interceptor) {
  100 +
  101 + SubscriptionRequest<Observable, BaseData> request = new SubscriptionRequest<Observable, BaseData>();
  102 +
  103 + request.observable = ApiBuild.service(clazz, api)
  104 + .setEndpoint(serviceEndpoint(clazz))
  105 + .addInterceptor(interceptor)
  106 + .build(false);
  107 +
  108 + return request;
  109 + }
  110 +
  111 + public Disposable subscribe(Context context, final DataCallback<BaseData> callback) {
  112 + Subscriber<BaseData> subscriber = new Subscriber<BaseData>(context) {
  113 + @Override
  114 + public void onCompleted(String s, String s1, BaseData data) {
  115 + if (callback == null) {
  116 + return;
  117 + }
  118 + callback.callback(SUCCESS, "", data);
  119 + }
  120 +
  121 + @Override
  122 + public void onError(String code, String message) {
  123 + if (callback == null) {
  124 + return;
  125 + }
  126 + int errorCode = -1;
  127 + try {
  128 + errorCode = Integer.valueOf(code);
  129 + } catch (Exception ignored) {
  130 + }
  131 +
  132 + callback.callback(errorCode, message, null);
  133 + }
  134 + };
  135 +
  136 + return observable.take(1)
  137 + .subscribeOn(Schedulers.io())
  138 + .observeOn(AndroidSchedulers.mainThread())
  139 + .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
  140 + }
  141 +
  142 + public static <Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  143 + Disposable subscribe(Observable observable, Subscriber<BaseData> subscriber) {
  144 + return observable.take(1)
  145 + .subscribeOn(Schedulers.io())
  146 + .observeOn(AndroidSchedulers.mainThread())
  147 + .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
  148 + }
  149 +/***************************************************************************************/
  150 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/bean/BaseInfo.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork.bean;
  2 +
  3 +import com.cnlive.libs.data.network.model.IBaseInfo;
  4 +import com.cnlive.strike.xiaojiaspeaker.netWork.ApiSubscriber;
  5 +
  6 +
  7 +public class BaseInfo<T> implements IBaseInfo {
  8 + //TODO 接口错误信息 需要自定义
  9 + private String errorCode = ApiSubscriber.getSuccessCode();
  10 + private String errorMessage = "";
  11 +
  12 + //TODO 接口内容数据 需要自定义
  13 + private T data;
  14 +
  15 + public void setCode(String status_code) {
  16 + this.errorCode = status_code;
  17 + }
  18 +
  19 + @Override
  20 + public String getCode() {
  21 + return errorCode;
  22 + }
  23 +
  24 + public void setMessage(String errorMessage) {
  25 + this.errorMessage = errorMessage;
  26 + }
  27 +
  28 + @Override
  29 + public String getMessage() {
  30 + return errorMessage;
  31 + }
  32 +
  33 + public void setData(T data) {
  34 + this.data = data;
  35 + }
  36 +
  37 + @Override
  38 + public T getData() {
  39 + return data;
  40 + }
  41 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/bean/ConfigDeviceNetParam.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork.bean;
  2 +
  3 +/**
  4 + * 配网结果查询参数
  5 + *
  6 + * @author ys
  7 + */
  8 +public class ConfigDeviceNetParam {
  9 +
  10 + /**
  11 + * action : mc/getWifiResult
  12 + * data : {"myid":"1234567890ab","token":"xxxxx","from":"sessionId"}
  13 + */
  14 + public ConfigDeviceNetParam() {
  15 + this.action = "mc/getWifiResult";
  16 + }
  17 +
  18 + private String action;
  19 + private DataBean data;
  20 +
  21 + public String getAction() {
  22 + return action;
  23 + }
  24 +
  25 + public void setAction(String action) {
  26 + this.action = action;
  27 + }
  28 +
  29 + public DataBean getData() {
  30 + return data;
  31 + }
  32 +
  33 + public void setData(DataBean data) {
  34 + this.data = data;
  35 + }
  36 +
  37 + public static class DataBean {
  38 + /**
  39 + * myid : 1234567890ab
  40 + * token : xxxxx
  41 + * from : sessionId
  42 + */
  43 +
  44 + private String myid;
  45 + private String token;
  46 + private String from;
  47 +
  48 + public String getMyid() {
  49 + return myid;
  50 + }
  51 +
  52 + public void setMyid(String myid) {
  53 + this.myid = myid;
  54 + }
  55 +
  56 + public String getToken() {
  57 + return token;
  58 + }
  59 +
  60 + public void setToken(String token) {
  61 + this.token = token;
  62 + }
  63 +
  64 + public String getFrom() {
  65 + return from;
  66 + }
  67 +
  68 + public void setFrom(String from) {
  69 + this.from = from;
  70 + }
  71 + }
  72 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/netWork/result/ConfigDeviceNetResult.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.netWork.result;
  2 +
  3 +public class ConfigDeviceNetResult {
  4 +
  5 + /**
  6 + * result : 0
  7 + * msg : success
  8 + * data : {"mainctl":"4000119C000011AE","token":"6ff1ba3f2e62352b7a95ef943e33b368","pid":"he:28850150e8bd4c830314819939361b77","agentId":"UxN2JkZTg3OTYzMT","timestamp":1568615885732,"result":"success","isFirstBinded":false,"isBinded":true,"bindtel":"+86 132****5668"}
  9 + */
  10 +
  11 + private int result;
  12 + private String msg;
  13 + private DataBean data;
  14 +
  15 + public int getResult() {
  16 + return result;
  17 + }
  18 +
  19 + public void setResult(int result) {
  20 + this.result = result;
  21 + }
  22 +
  23 + public String getMsg() {
  24 + return msg;
  25 + }
  26 +
  27 + public void setMsg(String msg) {
  28 + this.msg = msg;
  29 + }
  30 +
  31 + public DataBean getData() {
  32 + return data;
  33 + }
  34 +
  35 + public void setData(DataBean data) {
  36 + this.data = data;
  37 + }
  38 +
  39 + public static class DataBean {
  40 + /**
  41 + * mainctl : 4000119C000011AE
  42 + * token : 6ff1ba3f2e62352b7a95ef943e33b368
  43 + * pid : he:28850150e8bd4c830314819939361b77
  44 + * agentId : UxN2JkZTg3OTYzMT
  45 + * timestamp : 1568615885732
  46 + * result : success
  47 + * isFirstBinded : false
  48 + * isBinded : true
  49 + * bindtel : +86 132****5668
  50 + */
  51 +
  52 + private String mainctl;
  53 + private String token;
  54 + private String pid;
  55 + private String agentId;
  56 + private long timestamp;
  57 + private String result;
  58 + private boolean isFirstBinded;
  59 + private boolean isBinded;
  60 + private String bindtel;
  61 +
  62 + public String getMainctl() {
  63 + return mainctl;
  64 + }
  65 +
  66 + public void setMainctl(String mainctl) {
  67 + this.mainctl = mainctl;
  68 + }
  69 +
  70 + public String getToken() {
  71 + return token;
  72 + }
  73 +
  74 + public void setToken(String token) {
  75 + this.token = token;
  76 + }
  77 +
  78 + public String getPid() {
  79 + return pid;
  80 + }
  81 +
  82 + public void setPid(String pid) {
  83 + this.pid = pid;
  84 + }
  85 +
  86 + public String getAgentId() {
  87 + return agentId;
  88 + }
  89 +
  90 + public void setAgentId(String agentId) {
  91 + this.agentId = agentId;
  92 + }
  93 +
  94 + public long getTimestamp() {
  95 + return timestamp;
  96 + }
  97 +
  98 + public void setTimestamp(long timestamp) {
  99 + this.timestamp = timestamp;
  100 + }
  101 +
  102 + public String getResult() {
  103 + return result;
  104 + }
  105 +
  106 + public void setResult(String result) {
  107 + this.result = result;
  108 + }
  109 +
  110 + public boolean isIsFirstBinded() {
  111 + return isFirstBinded;
  112 + }
  113 +
  114 + public void setIsFirstBinded(boolean isFirstBinded) {
  115 + this.isFirstBinded = isFirstBinded;
  116 + }
  117 +
  118 + public boolean isIsBinded() {
  119 + return isBinded;
  120 + }
  121 +
  122 + public void setIsBinded(boolean isBinded) {
  123 + this.isBinded = isBinded;
  124 + }
  125 +
  126 + public String getBindtel() {
  127 + return bindtel;
  128 + }
  129 +
  130 + public void setBindtel(String bindtel) {
  131 + this.bindtel = bindtel;
  132 + }
  133 + }
  134 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/AllDeviceActivity.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.activity;
  2 +
  3 +import android.database.DatabaseUtils;
  4 +import android.databinding.DataBindingUtil;
  5 +import android.support.v4.content.ContextCompat;
  6 +import android.support.v7.app.AppCompatActivity;
  7 +import android.os.Bundle;
  8 +import android.view.View;
  9 +
  10 +import com.cnlive.libs.base.util.StatusBarUtil;
  11 +import com.cnlive.libs.base.util.StatusBarUtil2;
  12 +import com.cnlive.strike.xiaojiaspeaker.R;
  13 +import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityAllDeviceBinding;
  14 +import com.cnlive.strike.xiaojiaspeaker.ui.fragment.AllDeviceFragment;
  15 +import com.cnlive.strike.xiaojiaspeaker.ui.fragment.SearchDevicefragment;
  16 +import com.cnlive.strike.xiaojiaspeaker.ui.fragment.SelectWifiFragment;
  17 +
  18 +/**
  19 + * 所有设备
  20 + *
  21 + * @author ys
  22 + */
  23 +public class AllDeviceActivity extends AppCompatActivity {
  24 + private ActivityAllDeviceBinding binding;
  25 +
  26 + @Override
  27 + protected void onCreate(Bundle savedInstanceState) {
  28 + super.onCreate(savedInstanceState);
  29 + binding = DataBindingUtil.setContentView(this, R.layout.activity_all_device);
  30 + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, AllDeviceFragment.newInstance()).commitAllowingStateLoss();
  31 +
  32 + }
  33 +
  34 +
  35 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/BlueToothStep1Activity.java
@@ -30,7 +30,6 @@ public class BlueToothStep1Activity extends AppCompatActivity { @@ -30,7 +30,6 @@ public class BlueToothStep1Activity extends AppCompatActivity {
30 @Override 30 @Override
31 public void onClick(View view) { 31 public void onClick(View view) {
32 BlueToothStep2Activity.startActivity(BlueToothStep1Activity.this); 32 BlueToothStep2Activity.startActivity(BlueToothStep1Activity.this);
33 - finish();  
34 } 33 }
35 }); 34 });
36 } 35 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/BlueToothStep2Activity.java
@@ -29,6 +29,7 @@ import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityBlueToothStep2Bindin @@ -29,6 +29,7 @@ import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityBlueToothStep2Bindin
29 import com.cnlive.strike.xiaojiaspeaker.ui.widget.SelectDialog; 29 import com.cnlive.strike.xiaojiaspeaker.ui.widget.SelectDialog;
30 import com.cnlive.strike.xiaojiaspeaker.util.lib_permisshelper.PermissionsListener; 30 import com.cnlive.strike.xiaojiaspeaker.util.lib_permisshelper.PermissionsListener;
31 import com.cnlive.strike.xiaojiaspeaker.util.lib_permisshelper.PermissionsUtils; 31 import com.cnlive.strike.xiaojiaspeaker.util.lib_permisshelper.PermissionsUtils;
  32 +import com.cnlive.strike.xiaojiaspeaker.util.utilcode.CheckUtil;
32 33
33 public class BlueToothStep2Activity extends AppCompatActivity { 34 public class BlueToothStep2Activity extends AppCompatActivity {
34 private ActivityBlueToothStep2Binding binding; 35 private ActivityBlueToothStep2Binding binding;
@@ -76,8 +77,14 @@ public class BlueToothStep2Activity extends AppCompatActivity { @@ -76,8 +77,14 @@ public class BlueToothStep2Activity extends AppCompatActivity {
76 binding.btnNext.setOnClickListener(new View.OnClickListener() { 77 binding.btnNext.setOnClickListener(new View.OnClickListener() {
77 @Override 78 @Override
78 public void onClick(View view) { 79 public void onClick(View view) {
79 - //判断蓝牙是否打开  
80 - getPermissionsWithTip(); 80 + //判断GPS是否打开
  81 + boolean isOpenGPS = CheckUtil.isOPenGps(BlueToothStep2Activity.this);
  82 + if (!isOpenGPS) {
  83 + CheckUtil.openGPS(BlueToothStep2Activity.this);
  84 + } else {
  85 + //判断蓝牙是否打开
  86 + getPermissionsWithTip();
  87 + }
81 } 88 }
82 }); 89 });
83 } 90 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/BluetoothConnActivity.java
@@ -3,9 +3,13 @@ package com.cnlive.strike.xiaojiaspeaker.ui.activity; @@ -3,9 +3,13 @@ package com.cnlive.strike.xiaojiaspeaker.ui.activity;
3 import android.bluetooth.BluetoothAdapter; 3 import android.bluetooth.BluetoothAdapter;
4 import android.bluetooth.BluetoothDevice; 4 import android.bluetooth.BluetoothDevice;
5 import android.bluetooth.BluetoothGatt; 5 import android.bluetooth.BluetoothGatt;
  6 +import android.content.BroadcastReceiver;
  7 +import android.content.Context;
6 import android.content.Intent; 8 import android.content.Intent;
  9 +import android.content.IntentFilter;
7 import android.databinding.DataBindingUtil; 10 import android.databinding.DataBindingUtil;
8 import android.os.Bundle; 11 import android.os.Bundle;
  12 +import android.os.Message;
9 import android.support.v7.app.AppCompatActivity; 13 import android.support.v7.app.AppCompatActivity;
10 import android.support.v7.widget.DefaultItemAnimator; 14 import android.support.v7.widget.DefaultItemAnimator;
11 import android.support.v7.widget.LinearLayoutManager; 15 import android.support.v7.widget.LinearLayoutManager;
@@ -29,6 +33,9 @@ import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityBluetoothMainBinding @@ -29,6 +33,9 @@ import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityBluetoothMainBinding
29 import com.cnlive.strike.xiaojiaspeaker.model.BlueToothMsgEvent; 33 import com.cnlive.strike.xiaojiaspeaker.model.BlueToothMsgEvent;
30 import com.cnlive.strike.xiaojiaspeaker.model.BluetoothDeviceInfo; 34 import com.cnlive.strike.xiaojiaspeaker.model.BluetoothDeviceInfo;
31 import com.cnlive.strike.xiaojiaspeaker.ui.adapter.BluetoothDeviceAdapter; 35 import com.cnlive.strike.xiaojiaspeaker.ui.adapter.BluetoothDeviceAdapter;
  36 +import com.cnlive.strike.xiaojiaspeaker.ui.adapter.BluetoothListViewAdapterTest;
  37 +import com.cnlive.strike.xiaojiaspeaker.ui.adapter.WifiRecycleAdapter;
  38 +import com.cnlive.strike.xiaojiaspeaker.util.QMUITipDialogUtil;
32 39
33 import org.greenrobot.eventbus.EventBus; 40 import org.greenrobot.eventbus.EventBus;
34 import org.greenrobot.eventbus.Subscribe; 41 import org.greenrobot.eventbus.Subscribe;
@@ -46,203 +53,22 @@ public class BluetoothConnActivity extends AppCompatActivity { @@ -46,203 +53,22 @@ public class BluetoothConnActivity extends AppCompatActivity {
46 private static final String TAG = "BluetoothConnActivity"; 53 private static final String TAG = "BluetoothConnActivity";
47 private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 54 private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
48 private ActivityBluetoothMainBinding binding; 55 private ActivityBluetoothMainBinding binding;
49 - private List<BleDevice> bleDevices = new ArrayList<>();  
50 - private BluetoothDeviceAdapter adapter; 56 + private BluetoothListViewAdapterTest adapter;
  57 + private List<BluetoothDevice> unbondDevices = new ArrayList<>(); // 用于存放未配对蓝牙设备
  58 + private List<BluetoothDevice> bondDevices = new ArrayList<>();// 用于存放已配对蓝牙设备
  59 + private BluetoothListViewAdapterTest bondAdapter = null;
  60 + private BluetoothListViewAdapterTest unBondAdapter = null;
51 61
52 @Override 62 @Override
53 protected void onCreate(Bundle savedInstanceState) { 63 protected void onCreate(Bundle savedInstanceState) {
54 super.onCreate(savedInstanceState); 64 super.onCreate(savedInstanceState);
55 binding = DataBindingUtil.setContentView(this, R.layout.activity_bluetooth_main); 65 binding = DataBindingUtil.setContentView(this, R.layout.activity_bluetooth_main);
56 initView(); 66 initView();
57 - initBlueToothScanConfig();  
58 - initListAdapter();  
59 - openBluetooth();  
60 if (!EventBus.getDefault().isRegistered(this)) { 67 if (!EventBus.getDefault().isRegistered(this)) {
61 EventBus.getDefault().register(this); 68 EventBus.getDefault().register(this);
62 } 69 }
63 } 70 }
64 71
65 - private void initListAdapter() {  
66 - adapter = new BluetoothDeviceAdapter(this, bleDevices);  
67 - adapter.setHasStableIds(true);  
68 - binding.rvBlueTooth.setLayoutManager(new LinearLayoutManager(BluetoothConnActivity.this));  
69 - binding.rvBlueTooth.setAdapter(adapter);  
70 - ((DefaultItemAnimator) binding.rvBlueTooth.getItemAnimator()).setSupportsChangeAnimations(false);  
71 - adapter.setOnItemClickListener(new BluetoothDeviceAdapter.OnItemClickListener() {  
72 - @Override  
73 - public void onItemClick(int position, BleDevice bleDevice) {  
74 - BleManager.getInstance().disconnect(bleDevice);  
75 - BleManager.getInstance().connect(bleDevice, new BleGattCallback() {  
76 - // 开始连接  
77 - @Override  
78 - public void onStartConnect() {  
79 -  
80 - }  
81 -  
82 - // 连接失败  
83 - @Override  
84 - public void onConnectFail(BleDevice bleDevice, BleException exception) {  
85 -  
86 - }  
87 -  
88 - // 连接成功,BleDevice即为所连接的BLE设备  
89 - @Override  
90 - public void onConnectSuccess(final BleDevice bleDevice, BluetoothGatt gatt, int status) {  
91 -  
92 - BleManager.getInstance().notify(  
93 - bleDevice,  
94 - BlufiConstants.UUID_WIFI_SERVICE.toString(),  
95 - BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString(),  
96 - new BleNotifyCallback() {  
97 - @Override  
98 - public void onNotifySuccess() {  
99 - Log.e(TAG, "onNotifySuccess: " );  
100 - // 打开通知操作成功  
101 - BleManager.getInstance().write(  
102 - bleDevice,  
103 - BlufiConstants.UUID_WIFI_SERVICE.toString(),  
104 - BlufiConstants.UUID_WRITE_CHARACTERISTIC.toString(),  
105 - (getSSIDAndPwd("CNLive-VIP", "cnlIVE_99", "he:28850150e8bd4c830314819939361b77")).getBytes(),  
106 - new BleWriteCallback() {  
107 - @Override  
108 - public void onWriteSuccess(int current, int total, byte[] justWrite) {  
109 - Log.e(TAG, "onWriteSuccess: " + justWrite.toString());  
110 - // 发送数据到设备成功(分包发送的情况下,可以通过方法中返回的参数可以查看发送进度)  
111 -  
112 -// if (mIsExit) {  
113 -// return;  
114 -// }  
115 -  
116 - if (current == total) {  
117 -// BleManager.getInstance().stopNotify(bleDevice,  
118 -// BlufiConstants.UUID_WIFI_SERVICE.toString(),  
119 -// BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString());  
120 - }  
121 - }  
122 -  
123 - @Override  
124 - public void onWriteFailure(BleException exception) {  
125 - Log.e(TAG, "onWriteFailure: ");  
126 -  
127 -// if (mIsExit) {  
128 -// return;  
129 -// }  
130 -  
131 -// mainHandler.post(new Runnable() {  
132 -// @Override  
133 -// public void run() {  
134 -// // 发送数据到设备失败  
135 -// getActivityView().onSendWifiFailure("数据发送失败,请确认设备蓝牙正常");  
136 -// }  
137 -// });  
138 -  
139 -// BleManager.getInstance().stopNotify(bleDevice,  
140 -// BlufiConstants.UUID_WIFI_SERVICE.toString(),  
141 -// BlufiConstants.UUID_NOTIFY_CHARACTERISTIC.toString());  
142 - }  
143 - });  
144 - //  
145 - }  
146 -  
147 - @Override  
148 - public void onNotifyFailure(BleException exception) {  
149 - Log.e(TAG, "onNotifyFailure: "+exception );  
150 - }  
151 -  
152 - @Override  
153 - public void onCharacteristicChanged(byte[] data) {  
154 - try {  
155 - Log.e(TAG, "onCharacteristicChanged: "+ new String(data,"UTF-8"));  
156 - } catch (UnsupportedEncodingException e) {  
157 - e.printStackTrace();  
158 - }  
159 - }  
160 - }  
161 - );  
162 -  
163 -  
164 - }  
165 -  
166 - // 连接中断,isActiveDisConnected表示是否是主动调用了断开连接方法  
167 - @Override  
168 - public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {  
169 -  
170 - }  
171 - });  
172 - //  
173 -  
174 - //  
175 -  
176 - }  
177 - });  
178 - }  
179 -  
180 - public String getSSIDAndPwd(String ssid, String pwd, String uid) {  
181 - StringBuilder builder = new StringBuilder();  
182 - builder.append("1111(");  
183 - builder.append("v1");  
184 - builder.append('#');  
185 - builder.append(encode(ssid));  
186 - builder.append('#');  
187 - builder.append(encode(pwd));  
188 - builder.append('#');  
189 - builder.append(encode(uid));  
190 - builder.append('#');  
191 - builder.append(")2222");  
192 - String info = builder.toString();  
193 - String infoSend = info.replaceAll("(.{16})", "$1DATA");  
194 - return "DATA" + infoSend;  
195 - }  
196 -  
197 - /**  
198 - * 初始化蓝牙扫描  
199 - */  
200 - private void initBlueToothScanConfig() {  
201 - BleManager.getInstance().init(getApplication());  
202 - BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()  
203 -// .setServiceUuids(serviceUuids) // 只扫描指定的服务的设备,可选  
204 -// .setDeviceName(true, names) // 只扫描指定广播名的设备,可选  
205 -// .setDeviceMac(mac) // 只扫描指定mac的设备,可选  
206 -// .setAutoConnect(isAutoConnect) // 连接时的autoConnect参数,可选,默认false  
207 - .setScanTimeOut(15000) // 扫描超时时间,可选,默认10秒;小于等于0表示不限制扫描时间  
208 - .build();  
209 - BleManager.getInstance().initScanRule(scanRuleConfig);  
210 - }  
211 -  
212 - /**  
213 - * 开始扫描蓝牙设备  
214 - */  
215 - public void scanBlueToothDevice() {  
216 - if (null != bleDevices) {  
217 - bleDevices.clear();  
218 - }  
219 - BleManager.getInstance().scan(new BleScanCallback() {  
220 - // 扫描结束,列出所有扫描到的符合扫描规则的BLE设备(主线程)  
221 - @Override  
222 - public void onScanFinished(List<BleDevice> scanResultList) {  
223 - binding.rlProgress.setVisibility(View.GONE);  
224 -  
225 - }  
226 -  
227 - // 开始扫描(主线程)  
228 - @Override  
229 - public void onScanStarted(boolean success) {  
230 - binding.rlProgress.setVisibility(View.VISIBLE);  
231 - }  
232 -  
233 - // 扫描到一个符合扫描规则的BLE设备(主线程)  
234 - @Override  
235 - public void onScanning(BleDevice bleDevice) {  
236 -// Log.e(TAG, "onScanning: " + GsonUtils.toJson(bleDevice));  
237 - if (TextUtils.isEmpty(bleDevice.getName())) {  
238 - return;  
239 - }  
240 - if (null != adapter) {  
241 - adapter.addListData(bleDevice);  
242 - }  
243 - }  
244 - });  
245 - }  
246 72
247 @Override 73 @Override
248 protected void onPause() { 74 protected void onPause() {
@@ -266,13 +92,25 @@ public class BluetoothConnActivity extends AppCompatActivity { @@ -266,13 +92,25 @@ public class BluetoothConnActivity extends AppCompatActivity {
266 } 92 }
267 93
268 private void initView() { 94 private void initView() {
  95 + if (null == adapter) {
  96 + adapter = new BluetoothListViewAdapterTest(this, unbondDevices);
  97 + binding.rvBlueTooth.setLayoutManager(new LinearLayoutManager(this));
  98 + binding.rvBlueTooth.setAdapter(adapter);
  99 + }
  100 + adapter.setOnItemClickListener(new BluetoothListViewAdapterTest.OnItemClickListener() {
  101 + @Override
  102 + public void onClick(int position, BluetoothDevice bluetoothDevice) {
  103 + BluetoothConnThread connThread = new BluetoothConnThread(BluetoothConnActivity.this, position,bluetoothDevice);
  104 + connThread.start();
  105 + }
  106 + });
269 //搜索蓝牙设备按钮 107 //搜索蓝牙设备按钮
270 binding.btnScanBluetooth.setOnClickListener(new View.OnClickListener() { 108 binding.btnScanBluetooth.setOnClickListener(new View.OnClickListener() {
271 @Override 109 @Override
272 public void onClick(View view) { 110 public void onClick(View view) {
273 binding.rlProgress.setVisibility(View.VISIBLE); 111 binding.rlProgress.setVisibility(View.VISIBLE);
274 if (isBluetoothOpen()) { 112 if (isBluetoothOpen()) {
275 - scanBlueToothDevice(); 113 + searchDevices();
276 } else { 114 } else {
277 openBluetooth(); 115 openBluetooth();
278 } 116 }
@@ -348,42 +186,46 @@ public class BluetoothConnActivity extends AppCompatActivity { @@ -348,42 +186,46 @@ public class BluetoothConnActivity extends AppCompatActivity {
348 } 186 }
349 } 187 }
350 188
351 -// /**  
352 -// * 搜索蓝牙的方法  
353 -// */  
354 -// private void startScanBluth() { 189 + /**
  190 + * 搜索蓝牙的方法
  191 + */
  192 + private void startScanBluth() {
  193 + if (null!=unbondDevices){
  194 + unbondDevices.clear();
  195 + }
  196 + if(null!=adapter){
  197 + adapter.notifyDataSetChanged();
  198 + }
355 // getBondBluetoothDeviceData(); 199 // getBondBluetoothDeviceData();
356 -// // 判断是否在搜索,如果在搜索,就取消搜索  
357 -// if (mBluetoothAdapter.isDiscovering()) {  
358 -// mBluetoothAdapter.cancelDiscovery();  
359 -// } else {  
360 -// // 开始搜索  
361 -// mBluetoothAdapter.startDiscovery(); 200 + // 判断是否在搜索,如果在搜索,就取消搜索
  201 + if (mBluetoothAdapter.isDiscovering()) {
  202 + mBluetoothAdapter.cancelDiscovery();
  203 + } else {
  204 + // 开始搜索
  205 + mBluetoothAdapter.startDiscovery();
362 // QMUITipDialogUtil.loadingDialog(this, "正在搜索蓝牙设备,请稍后...", false); 206 // QMUITipDialogUtil.loadingDialog(this, "正在搜索蓝牙设备,请稍后...", false);
363 -//  
364 -// }  
365 -//  
366 -// }  
367 207
  208 + }
368 209
369 -// /**  
370 -// * 注册异步搜索蓝牙设备的广播  
371 -// */  
372 -// private void searchDevices() {  
373 -// // 找到设备的广播  
374 -// IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);  
375 -// filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);  
376 -// // 注册广播  
377 -// registerReceiver(receiver, filter);  
378 -// isRegisterReceiver = true;  
379 -// // 搜索完成的广播  
380 -// IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);  
381 -// // 注册广播  
382 -// registerReceiver(receiver, filter1);  
383 -// isRegisterReceiver = true;  
384 -// Log.e(TAG, "startDiscovery: 注册广播");  
385 -// startScanBluth();  
386 -// } 210 + }
  211 +
  212 +
  213 + /**
  214 + * 注册异步搜索蓝牙设备的广播
  215 + */
  216 + private void searchDevices() {
  217 + // 找到设备的广播
  218 + IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
  219 + filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
  220 + // 注册广播
  221 + registerReceiver(receiver, filter);
  222 + // 搜索完成的广播
  223 + IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  224 + // 注册广播
  225 + registerReceiver(receiver, filter1);
  226 + Log.e(TAG, "startDiscovery: 注册广播");
  227 + startScanBluth();
  228 + }
387 229
388 230
389 /** 231 /**
@@ -480,17 +322,119 @@ public class BluetoothConnActivity extends AppCompatActivity { @@ -480,17 +322,119 @@ public class BluetoothConnActivity extends AppCompatActivity {
480 } 322 }
481 } 323 }
482 324
483 - private String encode(String str) {  
484 - StringBuilder builder = new StringBuilder();  
485 - for (int i = 0; i < str.length(); ++i) {  
486 - char ch = str.charAt(i);  
487 - if (ch == '#') {  
488 - builder.append('\\');  
489 - } else if (ch == '\\') {  
490 - builder.append('\\'); 325 + /**
  326 + * 广播接收器
  327 + */
  328 + private BroadcastReceiver receiver = new BroadcastReceiver() {
  329 + BluetoothDevice device = null;
  330 +
  331 +
  332 + @Override
  333 + public void onReceive(final Context context, Intent intent) {
  334 + // 收到的广播类型
  335 + String action = intent.getAction();
  336 + // 发现设备的广播
  337 + if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  338 + // 从intent中获取设备
  339 + device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  340 + if (TextUtils.isEmpty(device.getName())){
  341 + return;
  342 + }
  343 + // 只获取未配对设备
  344 + Log.e(TAG, "蓝牙设备状态:" + device.getBondState());
  345 + if (device.getBondState() == BluetoothDevice.BOND_NONE) {
  346 + adapter.updateList(device);
  347 + }
  348 + Log.e(TAG, "unbondDevices大小:" + unbondDevices.size());
  349 + // 搜索完成
  350 + }
  351 + if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
  352 + QMUITipDialogUtil.dismessDialog();
  353 +// //-1代表没有设备连接
  354 +// BluetoothInfo bluetoothInfo = new BluetoothInfo();
  355 +// if (unbondDevices.size() > 0) {
  356 +// bluetoothInfo.bluetoothDeviceList = unbondDevices;
  357 +// bluetoothInfo.position = -1;
  358 +// unBondAdapter = new BluetoothListViewAdapterTest(context, bluetoothInfo);
  359 +// lv_unBondBluetoothDevice.setAdapter(unBondAdapter);
  360 +//// setListViewHeightBasedOnChildren(lv_unBondBluetoothDevice);
  361 +// Log.e(TAG, "onReceive: 搜索完成");
  362 +// } else {
  363 +// ToastUtil.msg(getApplicationContext(), "暂未发现可用的蓝牙设备!");
  364 +// }
  365 + }
  366 + //状态改变时
  367 + else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
  368 + device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  369 + switch (device.getBondState()) {
  370 + case BluetoothDevice.BOND_BONDING://正在配对
  371 + Log.e("BlueToothTestActivity", "正在配对......");
  372 + QMUITipDialogUtil.loadingDialog(getApplicationContext(),"正在配对......",false);
  373 +// if (progressDialog == null) {
  374 +// progressDialog = new ProgressDialog(BluetoothConnActivity.this);
  375 +// }
  376 +// progressDialog.setMessage("正在配对中,请稍后!");
  377 +// progressDialog.show();
  378 + break;
  379 + case BluetoothDevice.BOND_BONDED://配对结束
  380 + Log.e("BlueToothTestActivity", "完成配对");
  381 + QMUITipDialogUtil.dismessDialog();
  382 +// QMUITipDialogUtil.successDialog(me, "配对已完成", 2);
  383 +// bondDevices.clear();
  384 +// bondDevices = getBondedBluetoothDevice();
  385 +// Log.e(TAG, "已配对蓝牙设备数量:" + bondDevices.size());
  386 +// BluetoothInfo bluetoothInfo = new BluetoothInfo();
  387 +// bluetoothInfo.position = -1;
  388 +// bluetoothInfo.bluetoothDeviceList = bondDevices;
  389 +// bondAdapter = new BluetoothListViewAdapterTest(BluetoothConnActivity.this, bluetoothInfo);
  390 +// lv_bondBluetoothDevice.setAdapter(bondAdapter);
  391 +//
  392 +// unBondAdapter.notifyDataSetChanged();//刷新未绑定列表
  393 +// unbondDevices.remove(device);
  394 +
  395 + break;
  396 + case BluetoothDevice.BOND_NONE://取消配对/未配对
  397 + Log.e("BlueToothTestActivity", "取消配对");
  398 +// Message msg = new Message();
  399 +// msg.what = Constant.BOND_BLUETOOTH_FAILED;
  400 +// handler.sendMessage(msg);
  401 + default:
  402 + break;
  403 + }
491 } 404 }
492 - builder.append(ch);  
493 } 405 }
494 - return builder.toString();  
495 - } 406 + };
  407 +
  408 +
  409 + private BroadcastReceiver mStatusReceive = new BroadcastReceiver() {
  410 +
  411 + @Override
  412 + public void onReceive(Context context, Intent intent) {
  413 + switch (intent.getAction()) {
  414 + case BluetoothAdapter.ACTION_STATE_CHANGED:
  415 + int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
  416 + switch (blueState) {
  417 + case BluetoothAdapter.STATE_TURNING_ON:
  418 + Log.e(TAG, "监听到蓝牙已开启");
  419 +// mdialog = LoadingUtil.dialog(BluetoothConnActivity.this, "正在开启蓝牙,请稍后...", false);
  420 +// mdialog.show();
  421 + break;
  422 + case BluetoothAdapter.STATE_ON:
  423 + Log.e(TAG, "监听到蓝牙已启动");
  424 + QMUITipDialogUtil.dismessDialog();
  425 + AlertUtil.showDeftToast(getApplicationContext(), "蓝牙已打开!");
  426 +// getBondBluetoothDeviceData();
  427 + //开始扫描
  428 + break;
  429 + case BluetoothAdapter.STATE_TURNING_OFF:
  430 + break;
  431 + case BluetoothAdapter.STATE_OFF:
  432 + AlertUtil.showDeftToast(getApplicationContext(), "蓝牙未打开!");
  433 + break;
  434 + }
  435 + break;
  436 + }
  437 + }
  438 + };
  439 +
496 } 440 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/ConnBluetoothSuccessActivity.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.content.Intent;
  5 +import android.databinding.DataBindingUtil;
  6 +import android.support.v4.content.ContextCompat;
  7 +import android.support.v7.app.AppCompatActivity;
  8 +import android.os.Bundle;
  9 +import android.view.View;
  10 +
  11 +import com.cnlive.libs.base.util.AlertUtil;
  12 +import com.cnlive.libs.base.util.StatusBarUtil;
  13 +import com.cnlive.libs.base.util.StatusBarUtil2;
  14 +import com.cnlive.strike.xiaojiaspeaker.R;
  15 +import com.cnlive.strike.xiaojiaspeaker.commonInfo.CommInfo;
  16 +import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityConnBluetoothSuccessBinding;
  17 +import com.daimajia.androidanimations.library.Techniques;
  18 +import com.daimajia.androidanimations.library.YoYo;
  19 +import com.daimajia.androidanimations.library.zooming_exits.ZoomOutDownAnimator;
  20 +
  21 +/**
  22 + * 音箱连接成功页面
  23 + *
  24 + * @author ys
  25 + */
  26 +public class ConnBluetoothSuccessActivity extends AppCompatActivity {
  27 + private ActivityConnBluetoothSuccessBinding binding;
  28 +
  29 + @Override
  30 + protected void onCreate(Bundle savedInstanceState) {
  31 + super.onCreate(savedInstanceState);
  32 + binding = DataBindingUtil.setContentView(this, R.layout.activity_conn_bluetooth_success);
  33 + initTopBar();
  34 + initView();
  35 + }
  36 +
  37 + private void initView() {
  38 + //判断是否显示礼物弹窗
  39 + boolean isShow = CommInfo.getIsShowConnGift(this);
  40 + if (isShow) {
  41 + showGift();
  42 + } else {
  43 + hideGift();
  44 + }
  45 + //前往听见中国
  46 + binding.tvGoToListenChina.setOnClickListener(new View.OnClickListener() {
  47 + @Override
  48 + public void onClick(View view) {
  49 + }
  50 + });
  51 + //礼物弹窗关闭
  52 + binding.ivCloseGift.setOnClickListener(new View.OnClickListener() {
  53 + @Override
  54 + public void onClick(View view) {
  55 + YoYo.with(Techniques.ZoomOutDown)
  56 + .duration(700)
  57 + .repeat(0)
  58 + .playOn(binding.llGift);
  59 + binding.llGiftBlack.setVisibility(View.GONE);
  60 + //设置弹窗不在弹出
  61 + CommInfo.setIsShowConnGift(ConnBluetoothSuccessActivity.this, false);
  62 + }
  63 + });
  64 + }
  65 +
  66 + public void showGift() {
  67 + binding.llGiftBlack.setVisibility(View.VISIBLE);
  68 + binding.llGift.setVisibility(View.VISIBLE);
  69 + }
  70 +
  71 + public void hideGift() {
  72 + binding.llGiftBlack.setVisibility(View.GONE);
  73 + binding.llGift.setVisibility(View.GONE);
  74 + }
  75 +
  76 + private void initTopBar() {
  77 + StatusBarUtil.setStatusBarWrite(this);
  78 + StatusBarUtil2.setColor(this, ContextCompat.getColor(this, R.color.white), 0);
  79 + if (null != binding) {
  80 + binding.topbar.setTitle("连接成功");
  81 + //设置返回按钮
  82 + binding.topbar.addLeftImageButton(R.drawable.icon_back, R.id.left_back).setOnClickListener(new View.OnClickListener() {
  83 + @Override
  84 + public void onClick(View view) {
  85 + finish();
  86 + }
  87 + });
  88 + }
  89 + }
  90 +
  91 + public static void startActivity(Activity activity) {
  92 + activity.startActivity(new Intent(activity, ConnBluetoothSuccessActivity.class));
  93 + }
  94 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/DeviceInstructionActivity.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.activity;
  2 +
  3 +import android.app.Activity;
  4 +import android.content.Intent;
  5 +import android.databinding.DataBindingUtil;
  6 +import android.support.v4.content.ContextCompat;
  7 +import android.support.v7.app.AppCompatActivity;
  8 +import android.os.Bundle;
  9 +import android.view.View;
  10 +
  11 +import com.cnlive.libs.base.util.StatusBarUtil;
  12 +import com.cnlive.libs.base.util.StatusBarUtil2;
  13 +import com.cnlive.strike.xiaojiaspeaker.R;
  14 +import com.cnlive.strike.xiaojiaspeaker.databinding.ActivityDeviceInstructionBinding;
  15 +
  16 +/**
  17 + * 设备说明
  18 + *
  19 + * @author ys
  20 + */
  21 +public class DeviceInstructionActivity extends AppCompatActivity {
  22 + private ActivityDeviceInstructionBinding binding;
  23 +
  24 + @Override
  25 + protected void onCreate(Bundle savedInstanceState) {
  26 + super.onCreate(savedInstanceState);
  27 + binding = DataBindingUtil.setContentView(this, R.layout.activity_device_instruction);
  28 + initTopBar();
  29 + }
  30 +
  31 + private void initTopBar() {
  32 + StatusBarUtil.setStatusBarWrite(this);
  33 + StatusBarUtil2.setColor(this, ContextCompat.getColor(this, R.color.white), 0);
  34 + if (null != binding) {
  35 + binding.topbar.setTitle("设备说明");
  36 + //设置返回按钮
  37 + binding.topbar.addLeftImageButton(R.drawable.icon_back, R.id.left_back).setOnClickListener(new View.OnClickListener() {
  38 + @Override
  39 + public void onClick(View view) {
  40 + finish();
  41 + }
  42 + });
  43 + }
  44 + }
  45 +
  46 + public static void startActivity(Activity activity) {
  47 + activity.startActivity(new Intent(activity, DeviceInstructionActivity.class));
  48 + }
  49 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/SelectWifiActivity.java
@@ -49,7 +49,7 @@ public class SelectWifiActivity extends AppCompatActivity { @@ -49,7 +49,7 @@ public class SelectWifiActivity extends AppCompatActivity {
49 wifiUtils = new WifiUtils(this); 49 wifiUtils = new WifiUtils(this);
50 // registerBroadcast(); 50 // registerBroadcast();
51 // getPermissionsWithTip(); 51 // getPermissionsWithTip();
52 - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SelectWifiFragment()).commitAllowingStateLoss(); 52 + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, SelectWifiFragment.newInstance(bleDevice)).commitAllowingStateLoss();
53 } 53 }
54 54
55 55
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/activity/SpeakerMainActivity.java
@@ -155,30 +155,30 @@ public class SpeakerMainActivity extends AppCompatActivity implements WifiChange @@ -155,30 +155,30 @@ public class SpeakerMainActivity extends AppCompatActivity implements WifiChange
155 // } 155 // }
156 // } 156 // }
157 157
158 - adapter.setOnItemClickListener(new WifiRecycleAdapter.onItemClickListener() {  
159 - @Override  
160 - public void onItemClick(int position, final WifiConnModel wifiConnModel) {  
161 - new Thread(new Runnable() {  
162 - @Override  
163 - public void run() {  
164 - try {  
165 - Log.e(TAG, "run: " + i);  
166 - byte[] msgBuffer = null;  
167 - String text = "---------Hello World---------- ";  
168 - String ip = wifiUtils.getConnectedIPAddr();  
169 - Socket socket = new Socket(ip, 9101);  
170 - socket.setSoTimeout(5000);  
171 - PrintStream out = new PrintStream(socket.getOutputStream());  
172 - out.println(00);  
173 - out.flush();  
174 - out.close();  
175 - socket.close();  
176 - } catch (Exception e) {  
177 - e.printStackTrace();  
178 - }  
179 - SystemClock.sleep(5000);  
180 - }  
181 - }).start(); 158 +// adapter.setOnItemClickListener(new WifiRecycleAdapter.onItemClickListener() {
  159 +// @Override
  160 +// public void onItemClick(int position, final WifiConnModel wifiConnModel) {
  161 +// new Thread(new Runnable() {
  162 +// @Override
  163 +// public void run() {
  164 +// try {
  165 +// Log.e(TAG, "run: " + i);
  166 +// byte[] msgBuffer = null;
  167 +// String text = "---------Hello World---------- ";
  168 +// String ip = wifiUtils.getConnectedIPAddr();
  169 +// Socket socket = new Socket(ip, 9101);
  170 +// socket.setSoTimeout(5000);
  171 +// PrintStream out = new PrintStream(socket.getOutputStream());
  172 +// out.println(00);
  173 +// out.flush();
  174 +// out.close();
  175 +// socket.close();
  176 +// } catch (Exception e) {
  177 +// e.printStackTrace();
  178 +// }
  179 +// SystemClock.sleep(5000);
  180 +// }
  181 +// }).start();
182 // selectSSID = wifiConnModel.getScanResult().SSID; 182 // selectSSID = wifiConnModel.getScanResult().SSID;
183 // Log.e(TAG, "onItemClick: "+wifiConnModel.getScanResult() ); 183 // Log.e(TAG, "onItemClick: "+wifiConnModel.getScanResult() );
184 // connErrorCount = 0; 184 // connErrorCount = 0;
@@ -224,8 +224,8 @@ public class SpeakerMainActivity extends AppCompatActivity implements WifiChange @@ -224,8 +224,8 @@ public class SpeakerMainActivity extends AppCompatActivity implements WifiChange
224 // wifiUtils.connectWifi(networkId); 224 // wifiUtils.connectWifi(networkId);
225 // } 225 // }
226 // } 226 // }
227 - }  
228 - }); 227 +// }
  228 +// });
229 } 229 }
230 } 230 }
231 231
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/adapter/AllDeviceAdapter.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.adapter;
  2 +
  3 +import android.content.Context;
  4 +import android.databinding.DataBindingUtil;
  5 +import android.graphics.Color;
  6 +import android.support.annotation.NonNull;
  7 +import android.support.v4.content.ContextCompat;
  8 +import android.support.v7.widget.RecyclerView;
  9 +import android.util.Log;
  10 +import android.view.LayoutInflater;
  11 +import android.view.View;
  12 +import android.view.ViewGroup;
  13 +
  14 +import com.clj.fastble.data.BleDevice;
  15 +import com.cnlive.strike.application.GlideApp;
  16 +import com.cnlive.strike.xiaojiaspeaker.R;
  17 +import com.cnlive.strike.xiaojiaspeaker.databinding.ListItemAllDeviceBinding;
  18 +import com.cnlive.strike.xiaojiaspeaker.databinding.ListItemBluetoothDeviceBinding;
  19 +import com.cnlive.strike.xiaojiaspeaker.model.AllDeviceInfo;
  20 +import com.cnlive.strike.xiaojiaspeaker.model.PopMenuInfo;
  21 +import com.cnlive.strike.xiaojiaspeaker.ui.widget.popmenu.PopMenu;
  22 +
  23 +import java.util.ArrayList;
  24 +import java.util.List;
  25 +
  26 +public class AllDeviceAdapter extends RecyclerView.Adapter {
  27 + private Context context;
  28 + private List<AllDeviceInfo> allDeviceInfos;
  29 + private OnItemClickListener onItemClickListener;
  30 + private OnAddClickListener onAddClickListener;
  31 + private String TAG = "AllDeviceAdapter";
  32 +
  33 + public AllDeviceAdapter(Context context, List<AllDeviceInfo> allDeviceInfos) {
  34 + this.context = context;
  35 + this.allDeviceInfos = allDeviceInfos;
  36 + }
  37 +
  38 + public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  39 + this.onItemClickListener = onItemClickListener;
  40 + }
  41 +
  42 + public void setOnAddClickListener(OnAddClickListener onAddClickListener) {
  43 + this.onAddClickListener = onAddClickListener;
  44 + }
  45 +
  46 + @NonNull
  47 + @Override
  48 + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  49 + LayoutInflater inflater = LayoutInflater.from(context);
  50 + ListItemAllDeviceBinding binding = DataBindingUtil.inflate(inflater, R.layout.list_item_all_device, viewGroup, false);
  51 + return new MyViewHolder(binding);
  52 + }
  53 +
  54 + @Override
  55 + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
  56 + final ListItemAllDeviceBinding binding = ((MyViewHolder) viewHolder).getBinding();
  57 + if (i == allDeviceInfos.size()) {
  58 + //显示添加设备
  59 + binding.llAdd.setVisibility(View.VISIBLE);
  60 + binding.rlRoot.setVisibility(View.GONE);
  61 + } else {
  62 + //隐藏添加设备
  63 + binding.llAdd.setVisibility(View.GONE);
  64 + binding.rlRoot.setVisibility(View.VISIBLE);
  65 + GlideApp.with(context)
  66 + .load(ContextCompat.getDrawable(context, R.drawable.icon_xiaojia))
  67 + .skipMemoryCache(false)
  68 + .placeholder(ContextCompat.getDrawable(context, R.drawable.icon_xiaojia))
  69 + .dontAnimate()
  70 + .into(binding.ivBluetoothDeviceIcon);
  71 + }
  72 +
  73 + }
  74 +
  75 + @Override
  76 + public int getItemCount() {
  77 + return allDeviceInfos.size() + 1;
  78 + }
  79 +
  80 +
  81 + private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
  82 + public ListItemAllDeviceBinding getBinding() {
  83 + return binding;
  84 + }
  85 +
  86 + private ListItemAllDeviceBinding binding;
  87 +
  88 + public MyViewHolder(ListItemAllDeviceBinding binding) {
  89 + super(binding.getRoot());
  90 + this.binding = binding;
  91 + binding.rlRoot.setOnClickListener(this);
  92 + binding.llAdd.setOnClickListener(this);
  93 + }
  94 +
  95 + @Override
  96 + public void onClick(View view) {
  97 + if (R.id.rl_root == view.getId()) {
  98 + if (null != onItemClickListener) {
  99 + onItemClickListener.onItemClick(getAdapterPosition(), allDeviceInfos.get(getAdapterPosition()));
  100 +
  101 + }
  102 + Log.e(TAG, "onClick: " + getAdapterPosition());
  103 + } else if (R.id.ll_add == view.getId()) {
  104 + if (null != onAddClickListener) {
  105 + onAddClickListener.onAddClick();
  106 + }
  107 + Log.e(TAG, "onAddClickListener: " + getAdapterPosition());
  108 + }
  109 + }
  110 +
  111 +// public View.OnClickListener mOnclick = new View.OnClickListener() {
  112 +// @Override
  113 +// public void onClick(View view) {
  114 +// if (R.id.rl_root == view.getId()) {
  115 +// if (null != onItemClickListener) {
  116 +// onItemClickListener.onItemClick(getAdapterPosition(), allDeviceInfos.get(getAdapterPosition()));
  117 +// }
  118 +// } else if (R.id.ll_add == view.getId()) {
  119 +// if (null != onAddClickListener) {
  120 +// onAddClickListener.onAddClick();
  121 +// }
  122 +// }
  123 +// }
  124 +// };
  125 + }
  126 +
  127 + public interface OnItemClickListener {
  128 + void onItemClick(int position, AllDeviceInfo AllDeviceInfo);
  129 + }
  130 +
  131 + public interface OnAddClickListener {
  132 + void onAddClick();
  133 + }
  134 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/adapter/BluetoothDeviceAdapter.java
@@ -55,6 +55,9 @@ import java.util.List; @@ -55,6 +55,9 @@ import java.util.List;
55 55
56 private OnItemClickListener onItemClickListener; 56 private OnItemClickListener onItemClickListener;
57 57
  58 + public void clearData() {
  59 + bluetoothDeviceList.clear();
  60 + }
58 61
59 public void addListData(BleDevice bleDevice) { 62 public void addListData(BleDevice bleDevice) {
60 if (null != bluetoothDeviceList) { 63 if (null != bluetoothDeviceList) {
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/adapter/BluetoothListViewAdapterTest.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.adapter;
  2 +
  3 +import android.bluetooth.BluetoothDevice;
  4 +import android.content.Context;
  5 +import android.databinding.DataBindingUtil;
  6 +import android.support.annotation.NonNull;
  7 +import android.support.v7.widget.RecyclerView;
  8 +import android.view.LayoutInflater;
  9 +import android.view.View;
  10 +import android.view.ViewGroup;
  11 +
  12 +import com.cnlive.strike.xiaojiaspeaker.R;
  13 +import com.cnlive.strike.xiaojiaspeaker.databinding.ListItemBluetoothDeviceBinding;
  14 +import com.cnlive.strike.xiaojiaspeaker.databinding.ListItemWifi1Binding;
  15 +
  16 +import java.util.List;
  17 +
  18 +public class BluetoothListViewAdapterTest extends RecyclerView.Adapter {
  19 + private Context context;
  20 + private List<BluetoothDevice> bluetoothDevices;
  21 + private OnItemClickListener onItemClickListener;
  22 +
  23 + public void updateList(BluetoothDevice bluetoothDevice) {
  24 + bluetoothDevices.add(bluetoothDevice);
  25 + notifyDataSetChanged();
  26 + }
  27 +
  28 + public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  29 + this.onItemClickListener = onItemClickListener;
  30 + }
  31 +
  32 + public BluetoothListViewAdapterTest(Context context, List<BluetoothDevice> bluetoothDevices) {
  33 + this.context = context;
  34 + this.bluetoothDevices = bluetoothDevices;
  35 + }
  36 +
  37 + @NonNull
  38 + @Override
  39 + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  40 + LayoutInflater inflater = LayoutInflater.from(context);
  41 + ListItemBluetoothDeviceBinding binding = DataBindingUtil.inflate(inflater, R.layout.list_item_bluetooth_device, viewGroup, false);
  42 + return new MyViewHolder(binding);
  43 + }
  44 +
  45 + @Override
  46 + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
  47 + ListItemBluetoothDeviceBinding binding = ((MyViewHolder) viewHolder).getBinding();
  48 + binding.tvDeviceName.setText(bluetoothDevices.get(i).getName());
  49 + binding.llRoot.setOnClickListener(new View.OnClickListener() {
  50 + @Override
  51 + public void onClick(View view) {
  52 + if (null != onItemClickListener) {
  53 + onItemClickListener.onClick(i, bluetoothDevices.get(i));
  54 + }
  55 + }
  56 + });
  57 + }
  58 +
  59 + @Override
  60 + public int getItemCount() {
  61 + return bluetoothDevices.size();
  62 + }
  63 +
  64 + private class MyViewHolder extends RecyclerView.ViewHolder {
  65 +
  66 + public ListItemBluetoothDeviceBinding getBinding() {
  67 + return binding;
  68 + }
  69 +
  70 + private ListItemBluetoothDeviceBinding binding;
  71 +
  72 + public MyViewHolder(ListItemBluetoothDeviceBinding binding) {
  73 + super(binding.getRoot());
  74 + this.binding = binding;
  75 + }
  76 + }
  77 +
  78 + public interface OnItemClickListener {
  79 + void onClick(int position, BluetoothDevice bluetoothDevice);
  80 + }
  81 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/adapter/PopMenuAdapter.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.adapter;
  2 +
  3 +import android.content.Context;
  4 +import android.databinding.DataBindingUtil;
  5 +import android.support.annotation.NonNull;
  6 +import android.support.v7.widget.RecyclerView;
  7 +import android.view.LayoutInflater;
  8 +import android.view.View;
  9 +import android.view.ViewGroup;
  10 +
  11 +import com.cnlive.strike.xiaojiaspeaker.R;
  12 +import com.cnlive.strike.xiaojiaspeaker.databinding.ListItemWifi1Binding;
  13 +import com.cnlive.strike.xiaojiaspeaker.databinding.PopItemMenuBinding;
  14 +import com.cnlive.strike.xiaojiaspeaker.model.PopMenuInfo;
  15 +
  16 +import java.util.List;
  17 +
  18 +public class PopMenuAdapter extends RecyclerView.Adapter {
  19 + private Context context;
  20 + private List<PopMenuInfo> popMenuInfoList;
  21 +
  22 + public PopMenuAdapter(Context context, List<PopMenuInfo> popMenuInfoList) {
  23 + this.context = context;
  24 + this.popMenuInfoList = popMenuInfoList;
  25 + }
  26 +
  27 + @NonNull
  28 + @Override
  29 + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  30 + LayoutInflater inflater = LayoutInflater.from(context);
  31 + PopItemMenuBinding binding = DataBindingUtil.inflate(inflater, R.layout.pop_item_menu, viewGroup, false);
  32 + return new MyViewHolder(binding);
  33 + }
  34 +
  35 + @Override
  36 + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
  37 + PopItemMenuBinding binding = ((MyViewHolder) viewHolder).getBinding();
  38 + binding.tvTip.setText(popMenuInfoList.get(i).getTitle());
  39 + if (i == popMenuInfoList.size() - 1) {
  40 + binding.viewLine.setVisibility(View.GONE);
  41 + } else {
  42 + binding.viewLine.setVisibility(View.VISIBLE);
  43 + }
  44 + }
  45 +
  46 + @Override
  47 + public int getItemCount() {
  48 + return popMenuInfoList.size();
  49 + }
  50 +
  51 + private class MyViewHolder extends RecyclerView.ViewHolder {
  52 +
  53 + private PopItemMenuBinding binding;
  54 +
  55 + public PopItemMenuBinding getBinding() {
  56 + return binding;
  57 + }
  58 +
  59 + public MyViewHolder(PopItemMenuBinding binding) {
  60 + super(binding.getRoot());
  61 + this.binding = binding;
  62 + }
  63 + }
  64 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/adapter/WifiRecycleAdapter.java
@@ -102,14 +102,14 @@ public class WifiRecycleAdapter extends RecyclerView.Adapter { @@ -102,14 +102,14 @@ public class WifiRecycleAdapter extends RecyclerView.Adapter {
102 // binding.tvWifiState.setText("正在连接..."); 102 // binding.tvWifiState.setText("正在连接...");
103 // } 103 // }
104 //// 104 ////
105 -// binding.rlRoot.setOnClickListener(new View.OnClickListener() {  
106 -// @Override  
107 -// public void onClick(View view) {  
108 -// if (null != onItemClickListener) {  
109 -// onItemClickListener.onItemClick(position, scanResults.get(position));  
110 -// }  
111 -// }  
112 -// }); 105 + binding.rlRoot.setOnClickListener(new View.OnClickListener() {
  106 + @Override
  107 + public void onClick(View view) {
  108 + if (null != onItemClickListener) {
  109 + onItemClickListener.onItemClick(position, scanResults.get(position));
  110 + }
  111 + }
  112 + });
113 } 113 }
114 114
115 @Override 115 @Override
@@ -154,7 +154,7 @@ public class WifiRecycleAdapter extends RecyclerView.Adapter { @@ -154,7 +154,7 @@ public class WifiRecycleAdapter extends RecyclerView.Adapter {
154 } 154 }
155 155
156 public interface onItemClickListener { 156 public interface onItemClickListener {
157 - void onItemClick(int position, WifiConnModel wifiConnModel); 157 + void onItemClick(int position, ScanResult scanResult);
158 } 158 }
159 159
160 } 160 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/fragment/AllDeviceFragment.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.fragment;
  2 +
  3 +import android.Manifest;
  4 +import android.content.Intent;
  5 +import android.graphics.Color;
  6 +import android.os.Bundle;
  7 +import android.support.annotation.Nullable;
  8 +import android.support.v4.content.ContextCompat;
  9 +import android.support.v7.widget.LinearLayoutManager;
  10 +import android.support.v7.widget.RecyclerView;
  11 +import android.view.Display;
  12 +import android.view.LayoutInflater;
  13 +import android.view.View;
  14 +import android.view.ViewGroup;
  15 +import android.widget.Button;
  16 +import android.widget.LinearLayout;
  17 +import android.widget.PopupWindow;
  18 +import android.widget.RelativeLayout;
  19 +
  20 +import com.cnlive.libs.base.application.AppConfig;
  21 +import com.cnlive.libs.base.frame.fragment.MvpBindingFragment;
  22 +import com.cnlive.libs.base.util.AlertUtil;
  23 +import com.cnlive.libs.base.util.StatusBarUtil;
  24 +import com.cnlive.libs.base.util.StatusBarUtil2;
  25 +import com.cnlive.strike.ui.widget.UIPopup;
  26 +import com.cnlive.strike.xiaojiaspeaker.R;
  27 +import com.cnlive.strike.xiaojiaspeaker.databinding.FragmentAllDeviceBinding;
  28 +import com.cnlive.strike.xiaojiaspeaker.frame.presenter.AllDeviceFragmentPresenter;
  29 +import com.cnlive.strike.xiaojiaspeaker.frame.view.AllDeviceFragmentView;
  30 +import com.cnlive.strike.xiaojiaspeaker.model.PopMenuInfo;
  31 +import com.cnlive.strike.xiaojiaspeaker.ui.activity.BlueToothStep1Activity;
  32 +import com.cnlive.strike.xiaojiaspeaker.ui.adapter.PopMenuAdapter;
  33 +import com.cnlive.strike.xiaojiaspeaker.ui.widget.popmenu.PopMenu;
  34 +import com.qmuiteam.qmui.alpha.QMUIAlphaButton;
  35 +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton;
  36 +import com.qmuiteam.qmui.widget.popup.QMUIPopup;
  37 +
  38 +import java.util.ArrayList;
  39 +import java.util.List;
  40 +
  41 +public class AllDeviceFragment extends MvpBindingFragment<AllDeviceFragmentView, AllDeviceFragmentPresenter, Object, FragmentAllDeviceBinding> {
  42 + private UIPopup qmuiPopup;
  43 +
  44 + public static AllDeviceFragment newInstance() {
  45 + AllDeviceFragment fragment = new AllDeviceFragment();
  46 + return fragment;
  47 + }
  48 +
  49 + @Override
  50 + protected int getLayoutId() {
  51 + return R.layout.fragment_all_device;
  52 + }
  53 +
  54 + @Override
  55 + public void onActivityCreated(@Nullable Bundle savedInstanceState) {
  56 + super.onActivityCreated(savedInstanceState);
  57 + }
  58 +
  59 + QMUIAlphaImageButton button;
  60 +
  61 + @Override
  62 + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  63 + super.onViewCreated(view, savedInstanceState);
  64 + initTopBar();
  65 + if (null != getMvpView()) {
  66 + getMvpView().initView();
  67 + }
  68 + }
  69 +
  70 + private void initTopBar() {
  71 + StatusBarUtil.setStatusBarWrite(getActivity());
  72 + StatusBarUtil2.setColor(getActivity(), ContextCompat.getColor(getActivity(), R.color.white), 0);
  73 + if (null != binding) {
  74 + binding.topbar.setTitle("所有设备");
  75 + //设置返回按钮
  76 + binding.topbar.addLeftImageButton(R.drawable.icon_back, R.id.left_back).setOnClickListener(new View.OnClickListener() {
  77 + @Override
  78 + public void onClick(View view) {
  79 + }
  80 + });
  81 + //添加设备按钮
  82 + button = binding.topbar.addRightImageButton(R.drawable.icon_item_add, R.id.right_add);
  83 + button.setOnClickListener(new View.OnClickListener() {
  84 + @Override
  85 + public void onClick(View view) {
  86 + BlueToothStep1Activity.startActivity(getActivity());
  87 +// AddClick();
  88 + }
  89 + });
  90 + }
  91 + }
  92 +
  93 + private void AddClick() {
  94 + List<PopMenuInfo> popMenuInfoList = new ArrayList<>();
  95 + PopMenuInfo popMenuInfo = new PopMenuInfo();
  96 + popMenuInfo.setTitle("11");
  97 + popMenuInfoList.add(popMenuInfo);
  98 + popMenuInfo = new PopMenuInfo();
  99 + popMenuInfo.setTitle("22");
  100 + popMenuInfoList.add(popMenuInfo);
  101 + popMenuInfo = new PopMenuInfo();
  102 + popMenuInfo.setTitle("33");
  103 + popMenuInfoList.add(popMenuInfo);
  104 +
  105 + PopMenu mPopMenu = new PopMenu.Builder(getActivity())
  106 + .addData(popMenuInfoList)
  107 + .setBackgroundColor(Color.GRAY)
  108 + //.setCancelable(false)
  109 + .setCornerRadius(10f)
  110 + .build();
  111 + mPopMenu.show(button);
  112 + }
  113 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/fragment/SearchDevicefragment.java
1 package com.cnlive.strike.xiaojiaspeaker.ui.fragment; 1 package com.cnlive.strike.xiaojiaspeaker.ui.fragment;
2 2
3 import android.os.Bundle; 3 import android.os.Bundle;
  4 +import android.os.Handler;
4 import android.support.annotation.Nullable; 5 import android.support.annotation.Nullable;
5 import android.support.v4.content.ContextCompat; 6 import android.support.v4.content.ContextCompat;
6 import android.view.View; 7 import android.view.View;
@@ -22,6 +23,7 @@ import com.hannesdorfmann.mosby3.mvp.MvpFragment; @@ -22,6 +23,7 @@ import com.hannesdorfmann.mosby3.mvp.MvpFragment;
22 * @author ys 23 * @author ys
23 */ 24 */
24 public class SearchDevicefragment extends MvpBindingFragment<SearchDevicefragmentView, SearchDevicefragmentPresenter, Object, FragmentSearchDeviceBinding> { 25 public class SearchDevicefragment extends MvpBindingFragment<SearchDevicefragmentView, SearchDevicefragmentPresenter, Object, FragmentSearchDeviceBinding> {
  26 +
25 @Override 27 @Override
26 protected int getLayoutId() { 28 protected int getLayoutId() {
27 return R.layout.fragment_search_device; 29 return R.layout.fragment_search_device;
@@ -71,7 +73,7 @@ public class SearchDevicefragment extends MvpBindingFragment&lt;SearchDevicefragmen @@ -71,7 +73,7 @@ public class SearchDevicefragment extends MvpBindingFragment&lt;SearchDevicefragmen
71 // .setDeviceName(true, names) // 只扫描指定广播名的设备,可选 73 // .setDeviceName(true, names) // 只扫描指定广播名的设备,可选
72 // .setDeviceMac(mac) // 只扫描指定mac的设备,可选 74 // .setDeviceMac(mac) // 只扫描指定mac的设备,可选
73 // .setAutoConnect(isAutoConnect) // 连接时的autoConnect参数,可选,默认false 75 // .setAutoConnect(isAutoConnect) // 连接时的autoConnect参数,可选,默认false
74 - .setScanTimeOut(1000*60) // 扫描超时时间,可选,默认10秒;小于等于0表示不限制扫描时间 76 + .setScanTimeOut(1000 * 60) // 扫描超时时间,可选,默认10秒;小于等于0表示不限制扫描时间
75 .build(); 77 .build();
76 BleManager.getInstance().initScanRule(scanRuleConfig); 78 BleManager.getInstance().initScanRule(scanRuleConfig);
77 //检查蓝牙是否打开 79 //检查蓝牙是否打开
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/fragment/SelectWifiFragment.java
@@ -12,6 +12,7 @@ import android.support.v4.content.ContextCompat; @@ -12,6 +12,7 @@ import android.support.v4.content.ContextCompat;
12 import android.util.Log; 12 import android.util.Log;
13 import android.view.View; 13 import android.view.View;
14 14
  15 +import com.clj.fastble.data.BleDevice;
15 import com.cnlive.libs.base.frame.fragment.MvpBindingFragment; 16 import com.cnlive.libs.base.frame.fragment.MvpBindingFragment;
16 import com.cnlive.libs.base.util.StatusBarUtil; 17 import com.cnlive.libs.base.util.StatusBarUtil;
17 import com.cnlive.libs.base.util.StatusBarUtil2; 18 import com.cnlive.libs.base.util.StatusBarUtil2;
@@ -19,8 +20,21 @@ import com.cnlive.strike.xiaojiaspeaker.R; @@ -19,8 +20,21 @@ import com.cnlive.strike.xiaojiaspeaker.R;
19 import com.cnlive.strike.xiaojiaspeaker.databinding.FragmentSelectWifiBinding; 20 import com.cnlive.strike.xiaojiaspeaker.databinding.FragmentSelectWifiBinding;
20 import com.cnlive.strike.xiaojiaspeaker.frame.presenter.SelectWifiFragmentPresenter; 21 import com.cnlive.strike.xiaojiaspeaker.frame.presenter.SelectWifiFragmentPresenter;
21 import com.cnlive.strike.xiaojiaspeaker.frame.view.SelectWifiFragmentView; 22 import com.cnlive.strike.xiaojiaspeaker.frame.view.SelectWifiFragmentView;
  23 +import com.cnlive.strike.xiaojiaspeaker.netWork.bean.ConfigDeviceNetParam;
  24 +
  25 +import java.io.Serializable;
22 26
23 public class SelectWifiFragment extends MvpBindingFragment<SelectWifiFragmentView, SelectWifiFragmentPresenter, Object, FragmentSelectWifiBinding> { 27 public class SelectWifiFragment extends MvpBindingFragment<SelectWifiFragmentView, SelectWifiFragmentPresenter, Object, FragmentSelectWifiBinding> {
  28 + private String TAG = "SelectWifiFragment";
  29 +
  30 + public static SelectWifiFragment newInstance(BleDevice bleDevice) {
  31 + Bundle bundle = new Bundle();
  32 + bundle.putParcelable("bleDevice", bleDevice);
  33 + SelectWifiFragment fragment = new SelectWifiFragment();
  34 + fragment.setArguments(bundle);
  35 + return fragment;
  36 + }
  37 +
24 @Override 38 @Override
25 protected int getLayoutId() { 39 protected int getLayoutId() {
26 return R.layout.fragment_select_wifi; 40 return R.layout.fragment_select_wifi;
@@ -37,13 +51,20 @@ public class SelectWifiFragment extends MvpBindingFragment&lt;SelectWifiFragmentVie @@ -37,13 +51,20 @@ public class SelectWifiFragment extends MvpBindingFragment&lt;SelectWifiFragmentVie
37 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 51 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
38 super.onViewCreated(view, savedInstanceState); 52 super.onViewCreated(view, savedInstanceState);
39 initTopBar(); 53 initTopBar();
40 - if (null != getMvpView()) {  
41 - getMvpView().initWifiList();  
42 - registerBroadcast(); 54 + if (null != getArguments()) {
  55 + BleDevice bleDevice = (BleDevice) getArguments().get("bleDevice");
  56 + if (null != getMvpView() && null != bleDevice) {
  57 + getMvpView().initWifiList(bleDevice);
  58 + registerBroadcast();
  59 + }
43 } 60 }
44 61
  62 +
  63 +
45 } 64 }
46 65
  66 +
  67 +
47 private void initTopBar() { 68 private void initTopBar() {
48 StatusBarUtil.setStatusBarWrite(getActivity()); 69 StatusBarUtil.setStatusBarWrite(getActivity());
49 StatusBarUtil2.setColor(getActivity(), ContextCompat.getColor(getActivity(), R.color.white), 0); 70 StatusBarUtil2.setColor(getActivity(), ContextCompat.getColor(getActivity(), R.color.white), 0);
@@ -84,12 +105,14 @@ public class SelectWifiFragment extends MvpBindingFragment&lt;SelectWifiFragmentVie @@ -84,12 +105,14 @@ public class SelectWifiFragment extends MvpBindingFragment&lt;SelectWifiFragmentVie
84 String resultAction = intent.getAction(); 105 String resultAction = intent.getAction();
85 //当扫描结果后,进行刷新列表 106 //当扫描结果后,进行刷新列表
86 if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 107 if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
87 - Log.e("aa", "onReceive: SCAN_RESULTS_AVAILABLE_ACTION" ); 108 + Log.e(TAG, "onReceive: SCAN_RESULTS_AVAILABLE_ACTION");
88 //扫描wifi 109 //扫描wifi
89 if (null != getMvpView()) { 110 if (null != getMvpView()) {
90 getMvpView().updateWifiList(); 111 getMvpView().updateWifiList();
91 } 112 }
92 - } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {//wifi连接网络状态变化 113 + } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
  114 + Log.e(TAG, "onReceive: NETWORK_STATE_CHANGED_ACTION");
  115 + //wifi连接网络状态变化
93 NetworkInfo.DetailedState state = ((NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)).getDetailedState(); 116 NetworkInfo.DetailedState state = ((NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)).getDetailedState();
94 } else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {//wifi状态变化 117 } else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {//wifi状态变化
95 int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); 118 int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/widget/TipDialog.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.widget;
  2 +
  3 +import android.app.Dialog;
  4 +import android.content.Context;
  5 +import android.graphics.Typeface;
  6 +import android.os.Bundle;
  7 +import android.support.annotation.NonNull;
  8 +import android.view.LayoutInflater;
  9 +import android.view.View;
  10 +import android.view.ViewGroup;
  11 +import android.view.WindowManager;
  12 +import android.widget.Button;
  13 +import android.widget.LinearLayout;
  14 +import android.widget.TextView;
  15 +
  16 +import com.cnlive.strike.xiaojiaspeaker.R;
  17 +
  18 +
  19 +/**
  20 + * 提示对话框
  21 + *
  22 + * @author ShinnyYang
  23 + * @date 2019/3/27 17:50
  24 + */
  25 +public class TipDialog extends Dialog {
  26 + private Context context;
  27 + private TextView tv_dialog_tip;
  28 + private Button btn_ok;
  29 + private LinearLayout ll_child;
  30 + private View view;
  31 + private DialogInterface okInterface;
  32 + private LinearLayout.LayoutParams layoutParams;
  33 +
  34 + public TipDialog(@NonNull Context context, String tipText, String btnOkText, int okTextColor, DialogInterface okInterface) {
  35 + super(context, R.style.MyDialog);
  36 + this.context = context;
  37 + view = LayoutInflater.from(context).inflate(R.layout.dialog_tip, null);
  38 + initView(view);
  39 + layoutParams = new LinearLayout.LayoutParams((int) (getScreenWidth(context) * 0.75), ViewGroup.LayoutParams.WRAP_CONTENT);
  40 + ll_child.setLayoutParams(layoutParams);
  41 +
  42 + tv_dialog_tip.setText(tipText);
  43 + btn_ok.setText(btnOkText);
  44 + btn_ok.setTextColor(context.getResources().getColor(okTextColor));
  45 + this.okInterface = okInterface;
  46 +
  47 + }
  48 +
  49 + public TipDialog(@NonNull Context context, View customview, int themeResId) {
  50 + super(context, themeResId);
  51 + this.context = context;
  52 + }
  53 +
  54 +
  55 + @Override
  56 + protected void onCreate(Bundle savedInstanceState) {
  57 + super.onCreate(savedInstanceState);
  58 + //显示视图
  59 + this.setContentView(view);
  60 + }
  61 +
  62 + public void setTipTextSize(float size) {
  63 + tv_dialog_tip.setTextSize(size);
  64 + }
  65 +
  66 + public void setTipTextStyle(Typeface typeface) {
  67 + tv_dialog_tip.setTypeface(typeface);
  68 + }
  69 +
  70 + public void setTipMsg(String tipMsg) {
  71 + tv_dialog_tip.setText(tipMsg);
  72 + }
  73 +
  74 + private void initView(View rootView) {
  75 + this.tv_dialog_tip = (TextView) rootView.findViewById(R.id.tv_dialog_tip);
  76 + this.btn_ok = (Button) rootView.findViewById(R.id.btn_ok);
  77 + this.ll_child = (LinearLayout) rootView.findViewById(R.id.ll_child);
  78 + btn_ok.setOnClickListener(new View.OnClickListener() {
  79 + @Override
  80 + public void onClick(View view) {
  81 +
  82 + okInterface.onClick(TipDialog.this);
  83 + }
  84 + });
  85 + }
  86 +
  87 + public interface DialogInterface {
  88 + void onClick(TipDialog dialog);
  89 + }
  90 +
  91 + /**
  92 + * 获取屏幕宽度
  93 + *
  94 + * @param context
  95 + * @return
  96 + */
  97 + public static int getScreenWidth(Context context) {
  98 + WindowManager wm = (WindowManager) context
  99 + .getSystemService(Context.WINDOW_SERVICE);
  100 + int width = wm.getDefaultDisplay().getWidth();
  101 + return width;
  102 + }
  103 +
  104 + /**
  105 + * 获取屏幕高度
  106 + *
  107 + * @param context
  108 + * @return
  109 + */
  110 + public static int getScreenHeight(Context context) {
  111 + WindowManager wm = (WindowManager) context
  112 + .getSystemService(Context.WINDOW_SERVICE);
  113 + int height = wm.getDefaultDisplay().getHeight();
  114 + return height;
  115 + }
  116 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/widget/WifiPwdDialog.java
@@ -4,7 +4,10 @@ import android.app.Dialog; @@ -4,7 +4,10 @@ import android.app.Dialog;
4 import android.content.Context; 4 import android.content.Context;
5 import android.os.Bundle; 5 import android.os.Bundle;
6 import android.support.annotation.NonNull; 6 import android.support.annotation.NonNull;
  7 +import android.support.v4.content.ContextCompat;
7 import android.text.Editable; 8 import android.text.Editable;
  9 +import android.text.InputType;
  10 +import android.text.TextUtils;
8 import android.text.TextWatcher; 11 import android.text.TextWatcher;
9 import android.view.LayoutInflater; 12 import android.view.LayoutInflater;
10 import android.view.View; 13 import android.view.View;
@@ -12,6 +15,7 @@ import android.view.ViewGroup; @@ -12,6 +15,7 @@ import android.view.ViewGroup;
12 import android.view.WindowManager; 15 import android.view.WindowManager;
13 import android.widget.Button; 16 import android.widget.Button;
14 import android.widget.EditText; 17 import android.widget.EditText;
  18 +import android.widget.ImageView;
15 import android.widget.LinearLayout; 19 import android.widget.LinearLayout;
16 import android.widget.TextView; 20 import android.widget.TextView;
17 21
@@ -35,6 +39,8 @@ public class WifiPwdDialog extends Dialog { @@ -35,6 +39,8 @@ public class WifiPwdDialog extends Dialog {
35 private DialogInterface cancelInterface; 39 private DialogInterface cancelInterface;
36 private ConnDialogInterface okInterface; 40 private ConnDialogInterface okInterface;
37 private LinearLayout.LayoutParams layoutParams; 41 private LinearLayout.LayoutParams layoutParams;
  42 + private int rightColor = R.color.color_282828;
  43 + private ImageView iv_pwd;
38 44
39 public WifiPwdDialog(@NonNull Context context, String tipText, String btnCancelText, DialogInterface cancelInterface, String btnOkText, ConnDialogInterface okInterface) { 45 public WifiPwdDialog(@NonNull Context context, String tipText, String btnCancelText, DialogInterface cancelInterface, String btnOkText, ConnDialogInterface okInterface) {
40 super(context, R.style.MyDialog); 46 super(context, R.style.MyDialog);
@@ -51,29 +57,37 @@ public class WifiPwdDialog extends Dialog { @@ -51,29 +57,37 @@ public class WifiPwdDialog extends Dialog {
51 57
52 } 58 }
53 59
  60 + public void setMsgTip(String msg) {
  61 + if (null != tv_dialog_tip) {
  62 + tv_dialog_tip.setText(msg);
  63 + }
  64 + }
  65 +
54 public WifiPwdDialog(@NonNull Context context, View customview, int themeResId) { 66 public WifiPwdDialog(@NonNull Context context, View customview, int themeResId) {
55 super(context, themeResId); 67 super(context, themeResId);
56 this.context = context; 68 this.context = context;
57 } 69 }
58 70
  71 + public void setLeftBtnColor(int textColor) {
  72 + if (null != btn_cancel && null != cancelInterface) {
  73 + btn_cancel.setTextColor(ContextCompat.getColor(context, textColor));
  74 + }
  75 + }
  76 +
  77 + public void setRightBtnColor(int textColor) {
  78 + if (null != btn_ok && null != cancelInterface) {
  79 + this.rightColor = textColor;
  80 + btn_ok.setTextColor(ContextCompat.getColor(context, textColor));
  81 + }
  82 + }
59 83
60 @Override 84 @Override
61 protected void onCreate(Bundle savedInstanceState) { 85 protected void onCreate(Bundle savedInstanceState) {
62 super.onCreate(savedInstanceState); 86 super.onCreate(savedInstanceState);
63 //显示视图 87 //显示视图
64 this.setContentView(view); 88 this.setContentView(view);
65 - }  
66 -  
67 - private void initView(View rootView) {  
68 - this.tv_dialog_tip = (TextView) rootView.findViewById(R.id.tv_dialog_tip);  
69 - this.btn_cancel = (Button) rootView.findViewById(R.id.btn_cancel);  
70 - this.btn_ok = (Button) rootView.findViewById(R.id.btn_ok);  
71 - this.ll_child = (LinearLayout) rootView.findViewById(R.id.ll_child);  
72 - this.et_pwd = (EditText) rootView.findViewById(R.id.et_pwd);  
73 - btn_ok.setClickable(false);  
74 - btn_ok.setFocusable(false);  
75 - btn_ok.setBackground(null);  
76 - btn_ok.setTextColor(context.getResources().getColor(R.color.line)); 89 + this.btn_ok.setClickable(false);
  90 + this.btn_ok.setTextColor(ContextCompat.getColor(context, R.color.line));
77 this.et_pwd.addTextChangedListener(new TextWatcher() { 91 this.et_pwd.addTextChangedListener(new TextWatcher() {
78 @Override 92 @Override
79 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 93 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
@@ -84,13 +98,11 @@ public class WifiPwdDialog extends Dialog { @@ -84,13 +98,11 @@ public class WifiPwdDialog extends Dialog {
84 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 98 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
85 if (charSequence.length() < 8) { 99 if (charSequence.length() < 8) {
86 btn_ok.setClickable(false); 100 btn_ok.setClickable(false);
87 - btn_ok.setFocusable(false);  
88 - btn_ok.setBackground(null);  
89 - btn_ok.setTextColor(context.getResources().getColor(R.color.line)); 101 + btn_ok.setTextColor(ContextCompat.getColor(context, R.color.line));
  102 +
90 } else { 103 } else {
91 btn_ok.setClickable(true); 104 btn_ok.setClickable(true);
92 - btn_ok.setFocusable(true);  
93 - btn_ok.setTextColor(context.getResources().getColor(R.color.black)); 105 + btn_ok.setTextColor(ContextCompat.getColor(context, rightColor));
94 btn_ok.setBackground(context.getResources().getDrawable(R.drawable.selector_dialog_btn_right)); 106 btn_ok.setBackground(context.getResources().getDrawable(R.drawable.selector_dialog_btn_right));
95 } 107 }
96 } 108 }
@@ -100,6 +112,36 @@ public class WifiPwdDialog extends Dialog { @@ -100,6 +112,36 @@ public class WifiPwdDialog extends Dialog {
100 112
101 } 113 }
102 }); 114 });
  115 + //是否显示密码点击
  116 + iv_pwd.setOnClickListener(new View.OnClickListener() {
  117 + @Override
  118 + public void onClick(View view) {
  119 + //当前是加密
  120 + if ("0".equals(iv_pwd.getTag().toString())) {
  121 + //显示明文
  122 + iv_pwd.setTag("1");
  123 + iv_pwd.setBackground(ContextCompat.getDrawable(context, R.drawable.icon_see_pwd));
  124 + //选择状态 显示明文--设置为可见的密码
  125 +// et_pwd.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
  126 + et_pwd.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | InputType.TYPE_CLASS_TEXT);
  127 + //移动光标位置
  128 + if (!TextUtils.isEmpty(et_pwd.getText().toString())) {
  129 + et_pwd.setSelection(et_pwd.getText().toString().length());
  130 + }
  131 + }
  132 + //显示加密
  133 + else {
  134 + iv_pwd.setTag("0");
  135 + iv_pwd.setBackground(ContextCompat.getDrawable(context, R.drawable.icon_no_see_pwd));
  136 + //选择状态 设置为不可见的密码
  137 + et_pwd.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT);
  138 + //移动光标位置
  139 + if (!TextUtils.isEmpty(et_pwd.getText().toString())) {
  140 + et_pwd.setSelection(et_pwd.getText().toString().length());
  141 + }
  142 + }
  143 + }
  144 + });
103 btn_cancel.setOnClickListener(new View.OnClickListener() { 145 btn_cancel.setOnClickListener(new View.OnClickListener() {
104 @Override 146 @Override
105 public void onClick(View view) { 147 public void onClick(View view) {
@@ -118,6 +160,17 @@ public class WifiPwdDialog extends Dialog { @@ -118,6 +160,17 @@ public class WifiPwdDialog extends Dialog {
118 }); 160 });
119 } 161 }
120 162
  163 + private void initView(View rootView) {
  164 + this.tv_dialog_tip = (TextView) rootView.findViewById(R.id.tv_dialog_tip);
  165 + this.btn_cancel = (Button) rootView.findViewById(R.id.btn_cancel);
  166 + this.btn_ok = (Button) rootView.findViewById(R.id.btn_ok);
  167 + this.ll_child = (LinearLayout) rootView.findViewById(R.id.ll_child);
  168 + this.et_pwd = (EditText) rootView.findViewById(R.id.et_pwd);
  169 + this.iv_pwd = (ImageView) rootView.findViewById(R.id.iv_pwd);
  170 + iv_pwd.setTag("0");
  171 +
  172 + }
  173 +
121 public interface DialogInterface { 174 public interface DialogInterface {
122 void onClick(WifiPwdDialog dialog); 175 void onClick(WifiPwdDialog dialog);
123 } 176 }
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/widget/popmenu/ArrowDrawable.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.widget.popmenu;
  2 +
  3 +import android.graphics.Canvas;
  4 +import android.graphics.Color;
  5 +import android.graphics.ColorFilter;
  6 +import android.graphics.Paint;
  7 +import android.graphics.Path;
  8 +import android.graphics.PixelFormat;
  9 +import android.graphics.Rect;
  10 +import android.graphics.drawable.ColorDrawable;
  11 +import android.support.annotation.ColorInt;
  12 +import android.view.Gravity;
  13 +
  14 +/**
  15 + * 三角形箭头图片
  16 + */
  17 +final class ArrowDrawable extends ColorDrawable {
  18 +
  19 + private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  20 + private final int mBackgroundColor;
  21 + private final int mGravity;
  22 +
  23 + private Path mPath;
  24 +
  25 + ArrowDrawable(@ColorInt int foregroundColor, int gravity) {
  26 + mGravity = Util.gravityToArrowDirection(gravity);
  27 + mBackgroundColor = Color.TRANSPARENT;
  28 +
  29 + mPaint.setColor(foregroundColor);
  30 + }
  31 +
  32 + @Override
  33 + protected void onBoundsChange(Rect bounds) {
  34 + super.onBoundsChange(bounds);
  35 + updatePath(bounds);
  36 + }
  37 +
  38 + private synchronized void updatePath(Rect bounds) {
  39 + mPath = new Path();
  40 +
  41 + switch (mGravity) {
  42 + case Gravity.START:
  43 + mPath.moveTo(bounds.width(), bounds.height());
  44 + mPath.lineTo(0, bounds.height() / 2);
  45 + mPath.lineTo(bounds.width(), 0);
  46 + mPath.lineTo(bounds.width(), bounds.height());
  47 + break;
  48 + case Gravity.TOP:
  49 + mPath.moveTo(0, bounds.height());
  50 + mPath.lineTo(bounds.width() / 2, 0);
  51 + mPath.lineTo(bounds.width(), bounds.height());
  52 + mPath.lineTo(0, bounds.height());
  53 + break;
  54 + case Gravity.END:
  55 + mPath.moveTo(0, 0);
  56 + mPath.lineTo(bounds.width(), bounds.height() / 2);
  57 + mPath.lineTo(0, bounds.height());
  58 + mPath.lineTo(0, 0);
  59 + break;
  60 + case Gravity.BOTTOM:
  61 + mPath.moveTo(0, 0);
  62 + mPath.lineTo(bounds.width() / 2, bounds.height());
  63 + mPath.lineTo(bounds.width(), 0);
  64 + mPath.lineTo(0, 0);
  65 + break;
  66 + }
  67 +
  68 + mPath.close();
  69 + }
  70 +
  71 + @Override
  72 + public void draw(Canvas canvas) {
  73 + canvas.drawColor(mBackgroundColor);
  74 + if (mPath == null) {
  75 + updatePath(getBounds());
  76 + }
  77 + canvas.drawPath(mPath, mPaint);
  78 + }
  79 +
  80 + @Override
  81 + public void setAlpha(int alpha) {
  82 + mPaint.setAlpha(alpha);
  83 + }
  84 +
  85 + public void setColor(@ColorInt int color) {
  86 + mPaint.setColor(color);
  87 + }
  88 +
  89 + @Override
  90 + public void setColorFilter(ColorFilter colorFilter) {
  91 + mPaint.setColorFilter(colorFilter);
  92 + }
  93 +
  94 + @Override
  95 + public int getOpacity() {
  96 + if (mPaint.getColorFilter() != null) {
  97 + return PixelFormat.TRANSLUCENT;
  98 + }
  99 +
  100 + switch (mPaint.getColor() >>> 24) {
  101 + case 255:
  102 + return PixelFormat.OPAQUE;
  103 + case 0:
  104 + return PixelFormat.TRANSPARENT;
  105 + }
  106 + return PixelFormat.TRANSLUCENT;
  107 + }
  108 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/widget/popmenu/PopMenu.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.widget.popmenu;
  2 +
  3 +import android.animation.AnimatorSet;
  4 +import android.animation.ObjectAnimator;
  5 +import android.content.Context;
  6 +import android.graphics.Color;
  7 +import android.graphics.PointF;
  8 +import android.graphics.RectF;
  9 +import android.graphics.drawable.GradientDrawable;
  10 +import android.os.Build;
  11 +import android.support.annotation.ColorInt;
  12 +import android.support.annotation.DimenRes;
  13 +import android.support.annotation.NonNull;
  14 +import android.support.annotation.Size;
  15 +import android.support.v7.widget.LinearLayoutManager;
  16 +import android.support.v7.widget.RecyclerView;
  17 +import android.util.DisplayMetrics;
  18 +import android.view.Gravity;
  19 +import android.view.View;
  20 +import android.view.ViewGroup;
  21 +import android.view.ViewTreeObserver;
  22 +import android.view.animation.DecelerateInterpolator;
  23 +import android.widget.ImageView;
  24 +import android.widget.LinearLayout;
  25 +import android.widget.PopupWindow;
  26 +
  27 +import com.cnlive.strike.xiaojiaspeaker.model.PopMenuInfo;
  28 +import com.cnlive.strike.xiaojiaspeaker.ui.adapter.PopMenuAdapter;
  29 +import java.util.ArrayList;
  30 +import java.util.List;
  31 +
  32 +
  33 +/**
  34 + * PopMenu
  35 + */
  36 +public final class PopMenu {
  37 +
  38 + private final int mScreenWidthPixels;
  39 + private int mGravity;
  40 +
  41 + private final PopupWindow mPopupWindow;
  42 + private final int mScreenHeightPixels;
  43 +
  44 + private LinearLayout mContentView;
  45 + private ImageView mArrowView;
  46 +
  47 + private View mAnchorView;
  48 +
  49 + private int mBackgroundColor;
  50 + private RecyclerView mRecyclerView;
  51 +
  52 + private PopMenu.OnItemClickListener mItemClickListener;
  53 + private PopMenuAdapter mAdapter;
  54 + private List<PopMenuInfo> mData = new ArrayList<>();
  55 +
  56 + public interface OnItemClickListener {
  57 +// void onItemClickListener(ActionItem item, int position);
  58 + }
  59 +
  60 + public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  61 + mItemClickListener = onItemClickListener;
  62 + }
  63 +
  64 + public void addData(List<PopMenuInfo> data) {
  65 + mData.addAll(data);
  66 + }
  67 +
  68 + public void addData(PopMenuInfo item) {
  69 + mData.add(item);
  70 + }
  71 +
  72 + public void clearData() {
  73 + mData.clear();
  74 + }
  75 +
  76 + private PopMenu(Builder builder) {
  77 + DisplayMetrics dm = builder.mContext.getResources().getDisplayMetrics();
  78 + mScreenHeightPixels = dm.heightPixels;
  79 + mScreenWidthPixels = dm.widthPixels;
  80 + mPopupWindow = new PopupWindow(builder.mContext);
  81 + mPopupWindow.setBackgroundDrawable(null);
  82 + mPopupWindow.setClippingEnabled(false);
  83 + mPopupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
  84 + mPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
  85 + mPopupWindow.setContentView(getContentView(builder));
  86 + mPopupWindow.setFocusable(true);//让popupwindow获取焦点
  87 + mPopupWindow.setOutsideTouchable(builder.isCancelable);
  88 + }
  89 +
  90 + private View getContentView(final Builder builder) {
  91 + GradientDrawable drawable = new GradientDrawable();
  92 + mBackgroundColor = builder.mBackgroundColor;
  93 + drawable.setColor(mBackgroundColor);
  94 + drawable.setCornerRadius(builder.mCornerRadius);
  95 +
  96 + mRecyclerView = new RecyclerView(builder.mContext);
  97 + mRecyclerView.setLayoutManager(new LinearLayoutManager(builder.mContext));
  98 + mAdapter=new PopMenuAdapter(builder.mContext,mData);
  99 + mData.addAll(builder.mData);
  100 +// mAdapter = new CommonAdapter<ActionItem>(builder.mContext,
  101 +// R.layout.list_item_popmenu, mData) {
  102 +//
  103 +// @Override
  104 +// protected void convert(final ViewHolder holder, final ActionItem item, final int position) {
  105 +// holder.setText(R.id.tv_pop_menu, item.getText());
  106 +// holder.setTextColor(R.id.tv_pop_menu, builder.mTextColor);
  107 +// ImageView iv = holder.getView(R.id.iv_pop_menu);
  108 +// if (builder.mIsShowImage) {
  109 +// if (item.getResId() != 0) {
  110 +// iv.setImageResource(item.getResId());
  111 +// iv.setVisibility(View.VISIBLE);
  112 +// } else {
  113 +// iv.setVisibility(View.INVISIBLE);
  114 +// }
  115 +// } else {
  116 +// iv.setVisibility(View.GONE);
  117 +// }
  118 +// if (mItemClickListener == null)
  119 +// return;
  120 +// holder.getConvertView().setOnClickListener(new View.OnClickListener() {
  121 +// @Override
  122 +// public void onClick(View v) {
  123 +// mItemClickListener.onItemClickListener(item, position);
  124 +// dismiss();
  125 +// }
  126 +// });
  127 +// }
  128 +// };
  129 + mRecyclerView.setAdapter(mAdapter);
  130 +
  131 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
  132 + mRecyclerView.setBackground(drawable);
  133 + } else {
  134 + //noinspection deprecation
  135 + mRecyclerView.setBackgroundDrawable(drawable);
  136 + }
  137 +
  138 + LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0);
  139 + textViewParams.gravity = Gravity.CENTER;
  140 + int cornerRadius = (int) builder.mCornerRadius;
  141 + mRecyclerView.setPadding(cornerRadius, cornerRadius, cornerRadius, cornerRadius);
  142 + mRecyclerView.setLayoutParams(textViewParams);
  143 +
  144 + mArrowView = new ImageView(builder.mContext);
  145 +
  146 + LinearLayout.LayoutParams arrowLayoutParams = new LinearLayout.LayoutParams((int) builder.mArrowWidth, (int) builder.mArrowHeight, 0);
  147 +
  148 + arrowLayoutParams.gravity = Gravity.CENTER;
  149 + mArrowView.setLayoutParams(arrowLayoutParams);
  150 +
  151 + mContentView = new LinearLayout(builder.mContext);
  152 + ViewGroup.LayoutParams contentLayoutParams=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  153 + mContentView.setLayoutParams(contentLayoutParams);
  154 + mContentView.setOrientation(LinearLayout.VERTICAL);
  155 + mContentView.addView(mArrowView);
  156 + mContentView.addView(mRecyclerView);//为了计算高度
  157 + return mContentView;
  158 + }
  159 +
  160 + public boolean isShowing() {
  161 + return mPopupWindow.isShowing();
  162 + }
  163 +
  164 + public void show(final View anchorView) {
  165 + if (!isShowing()) {
  166 + mAnchorView = anchorView;
  167 + mContentView.getViewTreeObserver().addOnGlobalLayoutListener(mLocationLayoutListener);
  168 +
  169 + anchorView.addOnAttachStateChangeListener(mOnAttachStateChangeListener);
  170 + anchorView.post(new Runnable() {
  171 + @Override
  172 + public void run() {
  173 + mPopupWindow.showAsDropDown(anchorView);
  174 + }
  175 + });
  176 + }
  177 + }
  178 +
  179 + public void dismiss() {
  180 + mPopupWindow.dismiss();
  181 + }
  182 +
  183 + private PointF calculateLocation() {
  184 + PointF location = new PointF();
  185 +
  186 + final RectF anchorRect = Util.calculateRectInWindow(mAnchorView);
  187 + final PointF anchorCenter = new PointF(anchorRect.centerX(), anchorRect.centerY());
  188 + switch (mGravity) {
  189 + case Gravity.TOP:
  190 + location.x = anchorCenter.x - mContentView.getWidth() / 2f;
  191 + location.y = anchorRect.top - mContentView.getHeight();
  192 + break;
  193 + case Gravity.BOTTOM:
  194 + location.x = anchorCenter.x - mContentView.getWidth() / 2f;
  195 + location.y = anchorRect.bottom;
  196 + break;
  197 + }
  198 + float marginX = Util.dpToPx(2);
  199 + if (mScreenWidthPixels - location.x - mContentView.getWidth() < marginX) {
  200 + location.x = mScreenWidthPixels - mContentView.getWidth() - marginX;
  201 + } else if (location.x < marginX) {
  202 + location.x = marginX;
  203 + }
  204 + return location;
  205 + }
  206 +
  207 + private final ViewTreeObserver.OnGlobalLayoutListener mLocationLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
  208 + @Override
  209 + public void onGlobalLayout() {
  210 + Util.removeOnGlobalLayoutListener(mContentView, this);
  211 +
  212 + RectF anchorRect = Util.calculateRectOnScreen(mAnchorView);
  213 + if (anchorRect.centerY() <= mScreenHeightPixels >> 1) {
  214 + mGravity = Gravity.BOTTOM;
  215 + } else {
  216 + mGravity = Gravity.TOP;
  217 + }
  218 + mContentView.removeAllViews();
  219 + if (mGravity == Gravity.TOP) {
  220 + mContentView.addView(mRecyclerView);
  221 + mContentView.addView(mArrowView);
  222 + } else {
  223 + mContentView.addView(mArrowView);
  224 + mContentView.addView(mRecyclerView);
  225 + }
  226 + PointF location = calculateLocation();
  227 + mArrowView.setImageDrawable(new ArrowDrawable(mBackgroundColor, mGravity));
  228 + mContentView.getViewTreeObserver().addOnGlobalLayoutListener(mArrowLayoutListener);
  229 + mPopupWindow.setClippingEnabled(true);
  230 + mPopupWindow.update((int) location.x, (int) location.y, mPopupWindow.getWidth(), mPopupWindow.getHeight());
  231 + }
  232 + };
  233 +
  234 + private final ViewTreeObserver.OnGlobalLayoutListener mArrowLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
  235 + @Override
  236 + public void onGlobalLayout() {
  237 + Util.removeOnGlobalLayoutListener(mContentView, this);
  238 +
  239 + RectF anchorRect = Util.calculateRectOnScreen(mAnchorView);
  240 + RectF contentViewRect = Util.calculateRectOnScreen(mContentView);
  241 + float x, y;
  242 + if (mGravity == Gravity.BOTTOM || mGravity == Gravity.TOP) {
  243 + x = mContentView.getPaddingLeft() + Util.dpToPx(2);
  244 + float centerX = (contentViewRect.width() / 2f) - (mArrowView.getWidth() / 2f);
  245 + float newX = centerX - (contentViewRect.centerX() - anchorRect.centerX());
  246 + if (newX > x) {
  247 + if (newX + mArrowView.getWidth() + x > contentViewRect.width()) {
  248 + x = contentViewRect.width() - mArrowView.getWidth() - x;
  249 + } else {
  250 + x = newX;
  251 + }
  252 + }
  253 + y = mArrowView.getTop();
  254 + y = y + (mGravity == Gravity.TOP ? -1 : +1);
  255 + } else {
  256 + y = mContentView.getPaddingTop() + Util.dpToPx(2);
  257 + float centerY = (contentViewRect.height() / 2f) - (mArrowView.getHeight() / 2f);
  258 + float newY = centerY - (contentViewRect.centerY() - anchorRect.centerY());
  259 + if (newY > y) {
  260 + if (newY + mArrowView.getHeight() + y > contentViewRect.height()) {
  261 + y = contentViewRect.height() - mArrowView.getHeight() - y;
  262 + } else {
  263 + y = newY;
  264 + }
  265 + }
  266 + x = mArrowView.getLeft();
  267 + x = x + (mGravity == Gravity.START ? -1 : +1);
  268 + }
  269 + mArrowView.setX(x);
  270 + mArrowView.setY(y);
  271 +
  272 + startAnim(x, y);
  273 + }
  274 + };
  275 +
  276 + private void startAnim(float x, float y) {
  277 + AnimatorSet animatorSet = new AnimatorSet();//组合动画
  278 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(mContentView, "scaleX", 0.2f, 1f);
  279 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(mContentView, "scaleY", 0.2f, 1f);
  280 + ObjectAnimator alpha = ObjectAnimator.ofFloat(mContentView, "alpha", 0.5f, 1f);
  281 + mContentView.setPivotX(x + mArrowView.getWidth() / 2);
  282 + if (mGravity == Gravity.TOP) {
  283 + mContentView.setPivotY(y + mArrowView.getHeight());
  284 + } else {
  285 + mContentView.setPivotY(y);
  286 + }
  287 + animatorSet.setDuration(300);
  288 + animatorSet.setInterpolator(new DecelerateInterpolator());
  289 + animatorSet.play(scaleX).with(scaleY).with(alpha);//两个动画同时开始
  290 + animatorSet.start();
  291 + }
  292 +
  293 + private final View.OnAttachStateChangeListener mOnAttachStateChangeListener = new View.OnAttachStateChangeListener() {
  294 + @Override
  295 + public void onViewAttachedToWindow(View v) {
  296 +
  297 + }
  298 +
  299 + @Override
  300 + public void onViewDetachedFromWindow(View v) {
  301 + dismiss();
  302 + }
  303 + };
  304 +
  305 + public static final class Builder {
  306 +
  307 + private int mBackgroundColor = Color.BLACK;
  308 + public int mTextColor = Color.LTGRAY;
  309 + private boolean isCancelable = true;
  310 +
  311 + private float mCornerRadius;
  312 + private float mArrowHeight;
  313 + private float mArrowWidth;
  314 +
  315 + private Context mContext;
  316 + private List<PopMenuInfo> mData = new ArrayList<>();
  317 + private int mLineColor = Color.GRAY;
  318 + private int mLineSize = 1;
  319 + private boolean mIsShowImage = true;
  320 +
  321 + public Builder(@NonNull Context context) {
  322 + mContext = context;
  323 + }
  324 +
  325 + public Builder setCancelable(boolean cancelable) {
  326 + isCancelable = cancelable;
  327 + return this;
  328 + }
  329 +
  330 + public Builder setBackgroundColor(@ColorInt int color) {
  331 + mBackgroundColor = color;
  332 + return this;
  333 + }
  334 +
  335 + public Builder setTextColor(@ColorInt int color) {
  336 + mTextColor = color;
  337 + return this;
  338 + }
  339 +
  340 + public Builder setLineColor(@ColorInt int color) {
  341 + mLineColor = color;
  342 + return this;
  343 + }
  344 +
  345 + public Builder setLineSize(@Size int size) {
  346 + mLineSize = size;
  347 + return this;
  348 + }
  349 +
  350 + public Builder setShowImage(boolean isShowImage) {
  351 + mIsShowImage = isShowImage;
  352 + return this;
  353 + }
  354 +
  355 + public Builder setCornerRadius(@DimenRes int resId) {
  356 + return setCornerRadius(mContext.getResources().getDimension(resId));
  357 + }
  358 +
  359 + public Builder setCornerRadius(float radius) {
  360 + mCornerRadius = radius;
  361 + return this;
  362 + }
  363 +
  364 + public Builder setArrowHeight(@DimenRes int resId) {
  365 + return setArrowHeight(mContext.getResources().getDimension(resId));
  366 + }
  367 +
  368 + public Builder setArrowHeight(float height) {
  369 + mArrowHeight = height;
  370 + return this;
  371 + }
  372 +
  373 + public Builder setArrowWidth(@DimenRes int resId) {
  374 + return setArrowWidth(mContext.getResources().getDimension(resId));
  375 + }
  376 +
  377 + public Builder setArrowWidth(float width) {
  378 + mArrowWidth = width;
  379 + return this;
  380 + }
  381 +
  382 + public Builder addData(List<PopMenuInfo> items) {
  383 + mData.clear();
  384 + mData.addAll(items);
  385 + return this;
  386 + }
  387 +
  388 + public Builder addData(PopMenuInfo item) {
  389 + mData.add(item);
  390 + return this;
  391 + }
  392 +
  393 + public PopMenu build() {
  394 +
  395 + if (mArrowHeight == 0) {
  396 + mArrowHeight = Util.dpToPx(5);
  397 + }
  398 + if (mArrowWidth == 0) {
  399 + mArrowWidth = Util.dpToPx(12);
  400 + }
  401 + return new PopMenu(this);
  402 + }
  403 +
  404 + }
  405 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/ui/widget/popmenu/Util.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.ui.widget.popmenu;
  2 +
  3 +import android.content.res.Resources;
  4 +import android.graphics.RectF;
  5 +import android.os.Build;
  6 +import android.view.Gravity;
  7 +import android.view.View;
  8 +import android.view.ViewTreeObserver;
  9 +
  10 +/**
  11 + * utils
  12 + */
  13 +final class Util {
  14 +
  15 + public static RectF calculateRectOnScreen(View view) {
  16 + int[] location = new int[2];
  17 + view.getLocationOnScreen(location);
  18 + return new RectF(location[0], location[1], location[0] + view.getMeasuredWidth(), location[1] + view.getMeasuredHeight());
  19 + }
  20 +
  21 + public static RectF calculateRectInWindow(View view) {
  22 + int[] location = new int[2];
  23 + view.getLocationInWindow(location);
  24 + return new RectF(location[0], location[1], location[0] + view.getMeasuredWidth(), location[1] + view.getMeasuredHeight());
  25 + }
  26 +
  27 + public static float pxToDp(float px) {
  28 + return px / Resources.getSystem().getDisplayMetrics().density;
  29 + }
  30 +
  31 + public static float dpToPx(float dp) {
  32 + return dp * Resources.getSystem().getDisplayMetrics().density;
  33 + }
  34 +
  35 + public static int gravityToArrowDirection(int gravity) {
  36 + switch (gravity) {
  37 + case Gravity.START:
  38 + return Gravity.END;
  39 + case Gravity.TOP:
  40 + return Gravity.BOTTOM;
  41 + case Gravity.END:
  42 + return Gravity.START;
  43 + case Gravity.BOTTOM:
  44 + return Gravity.TOP;
  45 + default:
  46 + return gravity;
  47 + }
  48 + }
  49 +
  50 + public static void removeOnGlobalLayoutListener(View view, ViewTreeObserver.OnGlobalLayoutListener listener) {
  51 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
  52 + view.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
  53 + } else {
  54 + view.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
  55 + }
  56 + }
  57 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/util/BlueToothUtil.java
1 package com.cnlive.strike.xiaojiaspeaker.util; 1 package com.cnlive.strike.xiaojiaspeaker.util;
2 2
  3 +import android.text.TextUtils;
  4 +
3 public class BlueToothUtil { 5 public class BlueToothUtil {
4 public static String getSSIDAndPwd(String ssid, String pwd, String uid) { 6 public static String getSSIDAndPwd(String ssid, String pwd, String uid) {
5 StringBuilder builder = new StringBuilder(); 7 StringBuilder builder = new StringBuilder();
@@ -7,8 +9,10 @@ public class BlueToothUtil { @@ -7,8 +9,10 @@ public class BlueToothUtil {
7 builder.append("v1"); 9 builder.append("v1");
8 builder.append('#'); 10 builder.append('#');
9 builder.append(encode(ssid)); 11 builder.append(encode(ssid));
10 - builder.append('#');  
11 - builder.append(encode(pwd)); 12 + if (!TextUtils.isEmpty(pwd)) {
  13 + builder.append('#');
  14 + builder.append(encode(pwd));
  15 + }
12 builder.append('#'); 16 builder.append('#');
13 builder.append(encode(uid)); 17 builder.append(encode(uid));
14 builder.append('#'); 18 builder.append('#');
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/util/MySpHelper.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.util;
  2 +
  3 +import android.content.Context;
  4 +import android.content.SharedPreferences;
  5 +import android.util.Log;
  6 +
  7 +/**
  8 + * sharedPreferencesHelper 可以指定写入模式
  9 + * //todo 其他人写的无法指定写入模式,这就造成,同一个APP的不同进程,访问的sp中的值不一致,造成保活服务没有可判断的标志位
  10 + *
  11 + * @author ShinnyYang
  12 + */
  13 +public class MySpHelper {
  14 + private static final String TAG = "MySpHelper";
  15 + private static MySpHelper sharedPreferencesHelper = null;
  16 + private static int SP_MODE;//指定模式
  17 +
  18 + //单例模式,把Context传进去
  19 + public static MySpHelper getInstance(Context context, int MODE) {
  20 + SP_MODE = MODE;
  21 + if (sharedPreferencesHelper == null) {
  22 + synchronized (MySpHelper.class) {
  23 + if (sharedPreferencesHelper == null) {
  24 + sharedPreferencesHelper = new MySpHelper();
  25 + sharedPreferencesHelper.setContext(context);
  26 + return sharedPreferencesHelper;
  27 + }
  28 + }
  29 + }
  30 +
  31 + return sharedPreferencesHelper;
  32 + }
  33 +
  34 + private Context context;
  35 +
  36 + public void setContext(Context context) {
  37 + this.context = context;
  38 + }
  39 +
  40 + //取Boolean 型数据
  41 + public boolean getBoolean(String key, boolean defValue) {
  42 + try {
  43 + return getSP().getBoolean(key, defValue);
  44 + } catch (NullPointerException exception) {
  45 + Log.d("hcj", "" + exception);
  46 + return defValue;
  47 + }
  48 + }
  49 +
  50 + //存Boolean 型数据
  51 + public void putBoolean(String key, boolean value) {
  52 + try {
  53 + SharedPreferences.Editor editor = getSP().edit();
  54 + editor.putBoolean(key, value);
  55 + editor.commit();
  56 + } catch (NullPointerException exception) {
  57 + Log.d("hcj", "" + exception);
  58 + }
  59 + }
  60 +
  61 + //取Long 型数据
  62 + public long getLong(String key, long defValue) {
  63 + try {
  64 + return getSP().getLong(key, defValue);
  65 + } catch (NullPointerException exception) {
  66 + Log.d("hcj", "" + exception);
  67 + return defValue;
  68 + }
  69 + }
  70 +
  71 + //存Long 型数据
  72 + public void putLong(String key, long value) {
  73 + try {
  74 + SharedPreferences.Editor editor = getSP().edit();
  75 + editor.putLong(key, value);
  76 + editor.commit();
  77 + } catch (NullPointerException exception) {
  78 + Log.d("hcj", "" + exception);
  79 + }
  80 + }
  81 +
  82 + //取整型
  83 + public int getInt(String key, int defaultValue) {
  84 + try {
  85 + return getSP().getInt(key, defaultValue);
  86 + } catch (Exception e) {
  87 + Log.d("hcj", "" + e);
  88 + return defaultValue;
  89 +
  90 + }
  91 + }
  92 +
  93 + //存整型
  94 + public void putInt(String key, int value) {
  95 + try {
  96 + SharedPreferences.Editor editor = getSP().edit();
  97 + editor.putInt(key, value);
  98 + editor.commit();
  99 + } catch (Exception e) {
  100 + Log.d("hcj", "" + e);
  101 + }
  102 + }
  103 +
  104 + //取String
  105 + public String getString(String key, String defValue) {
  106 + try {
  107 + return getSP().getString(key, defValue);
  108 + } catch (NullPointerException e) {
  109 + Log.d("hcj", "" + e);
  110 + return defValue;
  111 + }
  112 + }
  113 +
  114 + //存String
  115 + public void putString(String key, String value) {
  116 + try {
  117 + SharedPreferences.Editor editor = getSP().edit();
  118 + editor.putString(key, value);
  119 + editor.commit();
  120 + } catch (NullPointerException e) {
  121 + Log.d("hcj", "" + e);
  122 + }
  123 + }
  124 +
  125 + //清除数据
  126 + public void clear() {
  127 + try {
  128 + SharedPreferences.Editor editor = getSP().edit();
  129 + editor.clear();
  130 + editor.commit();
  131 + } catch (NullPointerException e) {
  132 + Log.d("hcj", "" + e);
  133 + }
  134 + }
  135 +
  136 + //获得SharedPreferences对象
  137 + private SharedPreferences getSP() {
  138 + return context.getSharedPreferences("xiaojia-sp", SP_MODE);
  139 + }
  140 +
  141 + private SharedPreferences getSP(String name) {
  142 + return context.getSharedPreferences(name, SP_MODE);
  143 + }
  144 +
  145 + public void removeKey(String key) {
  146 + try {
  147 + SharedPreferences.Editor editor = getSP().edit();
  148 + editor.remove(key);
  149 + editor.commit();
  150 + } catch (NullPointerException e) {
  151 + Log.d(TAG, "removeKey:" + e);
  152 + }
  153 + }
  154 +}
module_xiaojiaSoundBox/src/main/java/com/cnlive/strike/xiaojiaspeaker/util/utilcode/CheckUtil.java 0 → 100644
  1 +package com.cnlive.strike.xiaojiaspeaker.util.utilcode;
  2 +
  3 +import android.app.Activity;
  4 +import android.content.Context;
  5 +import android.content.Intent;
  6 +import android.location.LocationManager;
  7 +import android.provider.Settings;
  8 +import android.widget.Toast;
  9 +
  10 +import com.cnlive.strike.xiaojiaspeaker.R;
  11 +
  12 +/**
  13 + * 加检查工具
  14 + *
  15 + * @author ys
  16 + */
  17 +public class CheckUtil {
  18 + /**
  19 + * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
  20 + *
  21 + * @param context
  22 + * @return true 表示开启
  23 + */
  24 + public static final boolean isOPenGps(final Context context) {
  25 + try {
  26 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
  27 + LocationManager locationManager
  28 + = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  29 + // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
  30 + boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
  31 + // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
  32 + boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
  33 + if (gps) {
  34 + return true;
  35 + } else {
  36 + return false;
  37 + }
  38 + } else {
  39 + return true;
  40 + }
  41 + } catch (Exception e) {
  42 + //异常就返回true
  43 + return true;
  44 + }
  45 + }
  46 +
  47 + public static void openGPS(Activity context) {
  48 + //开启GPS
  49 + try {
  50 + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  51 + context.startActivityForResult(intent, 10);
  52 + Toast.makeText(context, context.getString(R.string.open_gps_tip), Toast.LENGTH_LONG).show();
  53 + } catch (Exception e) {
  54 + Toast.makeText(context, "请手动打开GPS", Toast.LENGTH_LONG).show();
  55 + }
  56 + }
  57 +}
module_xiaojiaSoundBox/src/main/res/drawable-hdpi/conn_success_gift.png 0 → 100644

135 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/conn_success_gift_close.png 0 → 100644

1.76 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/icon_conn_success.png 0 → 100644

3.75 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/icon_item_add.png 0 → 100644

426 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/icon_item_right_arrow.png 0 → 100644

476 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/icon_no_see_pwd.png 0 → 100644

688 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/icon_see_pwd.png 0 → 100644

1.27 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/key_instruction.png 0 → 100644

83.4 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/light_instruction.png 0 → 100644

84.4 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/pop_gray_left.png 0 → 100644

1.92 KB

module_xiaojiaSoundBox/src/main/res/drawable-hdpi/pop_gray_right.png 0 → 100644

2.3 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/conn_success_gift.png 0 → 100644

263 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/conn_success_gift_close.png 0 → 100644

1.22 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/icon_conn_success.png 0 → 100644

3.39 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/icon_item_add.png 0 → 100644

274 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/icon_item_right_arrow.png 0 → 100644

461 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/icon_no_see_pwd.png 0 → 100644

872 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/icon_see_pwd.png 0 → 100644

1.42 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/key_instruction.png 0 → 100644

128 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/light_instruction.png 0 → 100644

151 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/pop_gray_left.png 0 → 100644

2.28 KB

module_xiaojiaSoundBox/src/main/res/drawable-xhdpi/pop_gray_right.png 0 → 100644

2.44 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/conn_success_gift.png 0 → 100644

469 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/conn_success_gift_close.png 0 → 100644

4.04 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/icon_conn_success.png 0 → 100644

8.42 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/icon_item_add.png 0 → 100644

796 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/icon_item_right_arrow.png 0 → 100644

816 Bytes

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/icon_no_see_pwd.png 0 → 100644

1.63 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/icon_see_pwd.png 0 → 100644

2.87 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/key_instruction.png 0 → 100644

246 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/light_instruction.png 0 → 100644

266 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/pop_gray_left.png 0 → 100644

4.54 KB

module_xiaojiaSoundBox/src/main/res/drawable-xxhdpi/pop_gray_right.png 0 → 100644

6.1 KB

module_xiaojiaSoundBox/src/main/res/drawable/layer_tran.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <item android:id="@+id/shape_id">
  4 + <!-- 正三角 -->
  5 + <rotate
  6 + android:fromDegrees="45"
  7 + android:pivotX="-40%"
  8 + android:pivotY="80%"
  9 + android:toDegrees="45">
  10 + <shape android:shape="rectangle">
  11 + <solid android:color="#80000000" />
  12 + </shape>
  13 + </rotate>
  14 + </item>
  15 +</layer-list>
0 \ No newline at end of file 16 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/drawable/selector_tip_dialog_btn_bottom.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<selector xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <item android:drawable="@color/transparent" android:state_pressed="false" />
  4 + <item android:drawable="@drawable/shape_tip_dialog_btn_bottom_press" android:state_pressed="true" />
  5 +
  6 +</selector>
0 \ No newline at end of file 7 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/drawable/shape_5_radius_white_bg.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <corners android:radius="5dp" />
  4 + <solid android:color="@color/white" />
  5 +</shape>
0 \ No newline at end of file 6 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/drawable/shape_menu_bg.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <solid android:color="#80000000" />
  4 + <corners
  5 + android:bottomLeftRadius="4dp"
  6 + android:bottomRightRadius="4dp"
  7 + android:topLeftRadius="4dp"
  8 + android:topRightRadius="4dp" />
  9 + <stroke
  10 + android:width="0.5dp"
  11 + android:color="#80000000" />
  12 +</shape>
0 \ No newline at end of file 13 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/drawable/shape_tip_dialog_btn_bottom_press.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<shape xmlns:android="http://schemas.android.com/apk/res/android">
  3 + <corners
  4 + android:bottomLeftRadius="20dp"
  5 + android:bottomRightRadius="20dp" />
  6 + <solid android:color="@color/line" />
  7 +</shape>
0 \ No newline at end of file 8 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/activity_all_device.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout>
  3 +
  4 + <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5 + xmlns:app="http://schemas.android.com/apk/res-auto"
  6 + xmlns:tools="http://schemas.android.com/tools"
  7 + android:layout_width="match_parent"
  8 + android:layout_height="match_parent"
  9 + android:orientation="vertical"
  10 + tools:context=".ui.activity.AllDeviceActivity">
  11 +
  12 + <RelativeLayout
  13 + android:id="@+id/fragment_container"
  14 + android:layout_width="match_parent"
  15 + android:layout_height="match_parent"></RelativeLayout>
  16 +
  17 + </RelativeLayout>
  18 +</layout>
0 \ No newline at end of file 19 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/activity_conn_bluetooth_success.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + xmlns:app="http://schemas.android.com/apk/res-auto"
  4 + xmlns:tools="http://schemas.android.com/tools">
  5 +
  6 + <FrameLayout
  7 + android:layout_width="match_parent"
  8 + android:layout_height="match_parent">
  9 +
  10 + <LinearLayout
  11 + android:layout_width="match_parent"
  12 + android:layout_height="match_parent"
  13 + android:orientation="vertical"
  14 + tools:context=".ui.activity.ConnBluetoothSuccessActivity">
  15 +
  16 + <com.qmuiteam.qmui.widget.QMUITopBar
  17 + android:id="@+id/topbar"
  18 + android:layout_width="match_parent"
  19 + android:layout_height="?attr/qmui_topbar_height" />
  20 +
  21 + <LinearLayout
  22 + android:layout_width="match_parent"
  23 + android:layout_height="0dp"
  24 + android:layout_weight="1.5"
  25 + android:focusable="true"
  26 + android:gravity="center"
  27 + android:orientation="vertical">
  28 +
  29 + <ImageView
  30 + android:layout_width="65dp"
  31 + android:layout_height="65dp"
  32 + android:background="@drawable/icon_conn_success" />
  33 +
  34 + <TextView
  35 + android:layout_width="wrap_content"
  36 + android:layout_height="wrap_content"
  37 + android:layout_marginTop="20dp"
  38 + android:text="@string/conn_success"
  39 + android:textColor="@color/btn_green"
  40 + android:textSize="20sp"
  41 + android:textStyle="bold" />
  42 + </LinearLayout>
  43 +
  44 + <LinearLayout
  45 + android:layout_width="match_parent"
  46 + android:layout_height="0dp"
  47 + android:layout_weight="1"
  48 + android:orientation="vertical">
  49 +
  50 + <TextView
  51 + android:layout_width="wrap_content"
  52 + android:layout_height="wrap_content"
  53 + android:layout_gravity="center_horizontal"
  54 + android:text="@string/to_sound_say_tip"
  55 + android:textColor="@color/color_999999"
  56 + android:textSize="16sp"
  57 + android:textStyle="bold" />
  58 +
  59 + <TextView
  60 + android:layout_width="216dp"
  61 + android:layout_height="wrap_content"
  62 + android:layout_gravity="center_horizontal"
  63 + android:layout_marginLeft="20dp"
  64 + android:layout_marginTop="30sp"
  65 + android:background="@drawable/pop_gray_right"
  66 + android:gravity="center"
  67 + android:text="@string/xiaojia_say_story_tip"
  68 + android:textColor="@color/white"
  69 + android:textSize="12sp" />
  70 +
  71 + <TextView
  72 + android:layout_width="216dp"
  73 + android:layout_height="wrap_content"
  74 + android:layout_gravity="center_horizontal"
  75 + android:layout_marginTop="20sp"
  76 + android:layout_marginRight="30dp"
  77 + android:background="@drawable/pop_gray_left"
  78 + android:gravity="center"
  79 + android:text="@string/xiaojia_listen_to_music_tip"
  80 + android:textColor="@color/white"
  81 + android:textSize="12sp" />
  82 + </LinearLayout>
  83 +
  84 + <LinearLayout
  85 + android:layout_width="match_parent"
  86 + android:layout_height="0dp"
  87 + android:layout_weight="0.8"
  88 + android:gravity="center"
  89 + android:orientation="vertical">
  90 +
  91 + <View
  92 + android:layout_width="match_parent"
  93 + android:layout_height="1dp"
  94 + android:layout_marginLeft="10dp"
  95 + android:layout_marginRight="10dp"
  96 + android:background="@color/line" />
  97 +
  98 + <TextView
  99 + android:layout_width="wrap_content"
  100 + android:layout_height="wrap_content"
  101 + android:layout_gravity="center_horizontal"
  102 + android:layout_marginTop="15dp"
  103 + android:text="@string/also_to_listen_china"
  104 + android:textColor="@color/color_999999"
  105 + android:textSize="12sp" />
  106 +
  107 + <TextView
  108 + android:id="@+id/tv_go_to_listen_china"
  109 + android:layout_width="wrap_content"
  110 + android:layout_height="wrap_content"
  111 + android:layout_gravity="center_horizontal"
  112 + android:layout_marginTop="15dp"
  113 + android:text="@string/go_to_liaten_china"
  114 + android:textColor="@color/btn_green"
  115 + android:textSize="13sp" />
  116 + </LinearLayout>
  117 + </LinearLayout>
  118 + <!-- 礼物弹框-->
  119 + <LinearLayout
  120 + android:id="@+id/ll_gift_black"
  121 + android:layout_width="match_parent"
  122 + android:layout_height="match_parent"
  123 + android:background="#80000000"></LinearLayout>
  124 +
  125 + <LinearLayout
  126 + android:id="@+id/ll_gift"
  127 + android:layout_width="match_parent"
  128 + android:layout_height="match_parent"
  129 + android:clickable="true"
  130 + android:gravity="center"
  131 + android:orientation="vertical">
  132 +
  133 + <ImageView
  134 + android:layout_width="370dp"
  135 + android:layout_height="339dp"
  136 + android:background="@drawable/conn_success_gift" />
  137 +
  138 + <ImageView
  139 + android:id="@+id/iv_close_gift"
  140 + android:layout_width="35dp"
  141 + android:layout_height="35dp"
  142 + android:layout_marginTop="20dp"
  143 + android:background="@drawable/conn_success_gift_close" />
  144 + </LinearLayout>
  145 + </FrameLayout>
  146 +</layout>
0 \ No newline at end of file 147 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/activity_device_instruction.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout>
  3 +
  4 + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5 + xmlns:app="http://schemas.android.com/apk/res-auto"
  6 + xmlns:tools="http://schemas.android.com/tools"
  7 + android:layout_width="match_parent"
  8 + android:layout_height="match_parent"
  9 + android:background="@color/color_F2F2F2"
  10 + android:orientation="vertical"
  11 + tools:context=".ui.activity.DeviceInstructionActivity">
  12 +
  13 + <com.qmuiteam.qmui.widget.QMUITopBar
  14 + android:id="@+id/topbar"
  15 + android:layout_width="match_parent"
  16 + android:layout_height="?attr/qmui_topbar_height" />
  17 +
  18 + <ScrollView
  19 + android:layout_width="match_parent"
  20 + android:layout_height="wrap_content">
  21 +
  22 + <LinearLayout
  23 + android:layout_width="match_parent"
  24 + android:layout_height="wrap_content"
  25 + android:orientation="vertical">
  26 +
  27 + <TextView
  28 + android:layout_width="wrap_content"
  29 + android:layout_height="wrap_content"
  30 + android:layout_margin="10dp"
  31 + android:text="按键图示说明"
  32 + android:textColor="@color/color_282828"
  33 + android:textSize="18sp"
  34 + android:textStyle="bold" />
  35 +
  36 + <LinearLayout
  37 + android:layout_width="match_parent"
  38 + android:layout_height="wrap_content"
  39 + android:layout_marginLeft="10dp"
  40 + android:layout_marginRight="10dp"
  41 + android:layout_marginBottom="20dp"
  42 + android:background="@drawable/shape_5_radius_white_bg"
  43 + android:gravity="center">
  44 +
  45 + <ImageView
  46 + android:layout_width="316dp"
  47 + android:layout_height="298dp"
  48 + android:background="@drawable/key_instruction" />
  49 + </LinearLayout>
  50 +
  51 + <TextView
  52 + android:layout_width="wrap_content"
  53 + android:layout_height="wrap_content"
  54 + android:layout_margin="10dp"
  55 + android:text="环形灯效果说明"
  56 + android:textColor="@color/color_282828"
  57 + android:textSize="18sp"
  58 + android:textStyle="bold" />
  59 +
  60 + <ImageView
  61 + android:layout_width="match_parent"
  62 + android:layout_height="348dp"
  63 + android:layout_gravity="center_horizontal"
  64 + android:layout_marginLeft="10dp"
  65 + android:layout_marginRight="10dp"
  66 + android:layout_marginBottom="20dp"
  67 + android:adjustViewBounds="true"
  68 + android:background="@drawable/light_instruction"
  69 + android:maxHeight="348dp"
  70 + android:scaleType="fitXY" />
  71 + </LinearLayout>
  72 + </ScrollView>
  73 + </LinearLayout>
  74 +</layout>
0 \ No newline at end of file 75 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/dialog_tip.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="wrap_content"
  5 + android:gravity="center_horizontal">
  6 +
  7 +
  8 + <LinearLayout
  9 + android:id="@+id/ll_child"
  10 + android:layout_width="match_parent"
  11 + android:layout_height="wrap_content"
  12 + android:background="@drawable/free_dialog_bg"
  13 + android:orientation="vertical"
  14 + android:paddingTop="10dp">
  15 +
  16 + <TextView
  17 + android:id="@+id/tv_dialog_tip"
  18 + android:layout_width="wrap_content"
  19 + android:layout_height="wrap_content"
  20 + android:layout_gravity="center"
  21 + android:layout_marginLeft="10dp"
  22 + android:layout_marginRight="10dp"
  23 + android:gravity="center"
  24 + android:minHeight="75dp"
  25 + android:text="标题"
  26 + android:lineSpacingExtra="5dp"
  27 + android:textColor="@color/black"
  28 + android:textSize="17sp" />
  29 +
  30 +
  31 + <View
  32 + android:layout_width="match_parent"
  33 + android:layout_height="1dp"
  34 + android:layout_marginTop="3dp"
  35 + android:background="@color/line" />
  36 +
  37 + <LinearLayout
  38 + android:layout_width="match_parent"
  39 + android:layout_height="40dp"
  40 + android:orientation="horizontal">
  41 +
  42 +
  43 + <LinearLayout
  44 + android:layout_width="0dp"
  45 + android:layout_height="match_parent"
  46 + android:layout_gravity="center"
  47 + android:layout_weight="1"
  48 + android:gravity="center">
  49 +
  50 + <Button
  51 + android:id="@+id/btn_ok"
  52 + android:layout_width="match_parent"
  53 + android:layout_height="match_parent"
  54 + android:layout_gravity="center"
  55 + android:background="@drawable/selector_tip_dialog_btn_bottom"
  56 + android:text="好的"
  57 + android:textColor="@color/btn_green"
  58 + android:textSize="15sp" />
  59 + </LinearLayout>
  60 +
  61 +
  62 + </LinearLayout>
  63 + </LinearLayout>
  64 +</LinearLayout>
module_xiaojiaSoundBox/src/main/res/layout/dialog_wifi_pwd.xml
@@ -25,22 +25,48 @@ @@ -25,22 +25,48 @@
25 android:textSize="17sp" 25 android:textSize="17sp"
26 android:textStyle="bold" /> 26 android:textStyle="bold" />
27 27
28 - <EditText  
29 - android:id="@+id/et_pwd" 28 + <FrameLayout
30 android:layout_width="match_parent" 29 android:layout_width="match_parent"
31 - android:layout_height="wrap_content"  
32 - android:layout_gravity="center"  
33 - android:layout_marginLeft="20dp"  
34 - android:layout_marginTop="20dp"  
35 - android:layout_marginRight="20dp"  
36 - android:layout_marginBottom="20dp"  
37 - android:background="@drawable/shape_et_wifi_bg"  
38 - android:gravity="center"  
39 - android:hint="请输入密码"  
40 - android:paddingTop="10dp"  
41 - android:paddingBottom="10dp"  
42 - android:textColor="@color/black"  
43 - android:textSize="12sp" /> 30 + android:layout_height="wrap_content">
  31 +
  32 + <LinearLayout
  33 + android:layout_width="match_parent"
  34 + android:layout_height="wrap_content"
  35 + android:gravity="center">
  36 +
  37 + <EditText
  38 + android:id="@+id/et_pwd"
  39 + android:layout_width="0dp"
  40 + android:layout_height="wrap_content"
  41 + android:layout_gravity="center"
  42 + android:layout_marginLeft="20dp"
  43 + android:layout_marginTop="20dp"
  44 + android:layout_marginRight="20dp"
  45 + android:layout_marginBottom="20dp"
  46 + android:layout_weight="1"
  47 + android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@."
  48 + android:gravity="left|center_vertical"
  49 + android:hint="请输入WIFI密码"
  50 + android:inputType="textWebPassword"
  51 + android:maxLines="1"
  52 + android:paddingTop="10dp"
  53 + android:paddingRight="30dp"
  54 + android:paddingBottom="20dp"
  55 + android:tag="0"
  56 + android:textColor="@color/black"
  57 + android:textSize="12sp" />
  58 +
  59 +
  60 + </LinearLayout>
  61 +
  62 + <ImageView
  63 + android:id="@+id/iv_pwd"
  64 + android:layout_width="20dp"
  65 + android:layout_height="13dp"
  66 + android:layout_gravity="center_vertical|right"
  67 + android:layout_marginRight="30dp"
  68 + android:background="@drawable/icon_no_see_pwd" />
  69 + </FrameLayout>
44 70
45 <View 71 <View
46 android:layout_width="match_parent" 72 android:layout_width="match_parent"
@@ -91,8 +117,9 @@ @@ -91,8 +117,9 @@
91 android:layout_height="match_parent" 117 android:layout_height="match_parent"
92 android:layout_gravity="center" 118 android:layout_gravity="center"
93 android:background="@drawable/selector_dialog_btn_right" 119 android:background="@drawable/selector_dialog_btn_right"
  120 + android:clickable="false"
94 android:text="否" 121 android:text="否"
95 - android:textColor="@color/black" 122 + android:textColor="@color/line"
96 android:textSize="15sp" 123 android:textSize="15sp"
97 android:textStyle="bold" /> 124 android:textStyle="bold" />
98 </LinearLayout> 125 </LinearLayout>
module_xiaojiaSoundBox/src/main/res/layout/fragment_all_device.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout>
  3 +
  4 + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5 + android:layout_width="match_parent"
  6 + android:layout_height="match_parent"
  7 + android:background="@color/color_F2F2F2"
  8 + android:orientation="vertical">
  9 +
  10 + <com.qmuiteam.qmui.widget.QMUITopBar
  11 + android:id="@+id/topbar"
  12 + android:layout_width="match_parent"
  13 + android:layout_height="?attr/qmui_topbar_height" />
  14 +
  15 + <android.support.v7.widget.RecyclerView
  16 + android:id="@+id/rv_all_device"
  17 + android:layout_width="match_parent"
  18 + android:layout_height="match_parent"
  19 + android:paddingTop="10dp" />
  20 + </LinearLayout>
  21 +</layout>
0 \ No newline at end of file 22 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/fragment_search_device.xml
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
5 android:layout_width="match_parent" 5 android:layout_width="match_parent"
6 android:layout_height="match_parent" 6 android:layout_height="match_parent"
7 - android:background="@color/white" 7 + android:background="@color/color_F2F2F2"
8 android:orientation="vertical"> 8 android:orientation="vertical">
9 9
10 <com.qmuiteam.qmui.widget.QMUITopBar 10 <com.qmuiteam.qmui.widget.QMUITopBar
@@ -31,7 +31,7 @@ @@ -31,7 +31,7 @@
31 android:id="@+id/ll_loading" 31 android:id="@+id/ll_loading"
32 android:layout_width="match_parent" 32 android:layout_width="match_parent"
33 android:layout_height="match_parent" 33 android:layout_height="match_parent"
34 - android:background="@color/white" 34 + android:background="@color/color_F2F2F2"
35 android:gravity="center" 35 android:gravity="center"
36 android:visibility="gone"> 36 android:visibility="gone">
37 37
module_xiaojiaSoundBox/src/main/res/layout/fragment_select_wifi.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 -<layout> 2 +<layout xmlns:app="http://schemas.android.com/apk/res-auto">
3 3
4 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
5 android:layout_width="match_parent" 5 android:layout_width="match_parent"
@@ -17,21 +17,60 @@ @@ -17,21 +17,60 @@
17 android:layout_height="0dp" 17 android:layout_height="0dp"
18 android:layout_weight="3"> 18 android:layout_weight="3">
19 19
20 - <android.support.v7.widget.RecyclerView  
21 - android:id="@+id/rv_wifi"  
22 - android:layout_width="match_parent"  
23 - android:layout_height="match_parent"  
24 - android:paddingTop="10dp" /> 20 +
  21 +<!-- <com.scwang.smartrefresh.layout.SmartRefreshLayout-->
  22 +<!-- android:id="@+id/refresh_layout"-->
  23 +<!-- android:layout_width="match_parent"-->
  24 +<!-- android:layout_height="match_parent"-->
  25 +<!-- app:srlEnablePreviewInEditMode="false">-->
  26 +
  27 +<!-- <com.scwang.smartrefresh.layout.header.ClassicsHeader-->
  28 +<!-- android:layout_width="match_parent"-->
  29 +<!-- android:layout_height="wrap_content"-->
  30 +<!-- app:srlAccentColor="@color/color_282828" />-->
  31 +
  32 + <FrameLayout
  33 + android:layout_width="match_parent"
  34 + android:layout_height="match_parent">
  35 +
  36 + <android.support.v7.widget.RecyclerView
  37 + android:id="@+id/rv_wifi"
  38 + android:layout_width="match_parent"
  39 + android:layout_height="match_parent"
  40 + android:paddingTop="10dp" />
  41 +
  42 + <LinearLayout
  43 + android:id="@+id/ll_loading"
  44 + android:layout_width="match_parent"
  45 + android:layout_height="match_parent"
  46 + android:background="@color/color_F2F2F2"
  47 + android:gravity="center"
  48 + android:visibility="gone">
  49 +
  50 + <com.wang.avi.AVLoadingIndicatorView
  51 + android:id="@+id/av_loading"
  52 + android:layout_width="50dp"
  53 + android:layout_height="50dp"
  54 + android:clickable="false"
  55 + android:focusableInTouchMode="false"
  56 + app:indicatorColor="@color/btn_green"
  57 + app:indicatorName="BallSpinFadeLoaderIndicator" />
  58 + </LinearLayout>
  59 + </FrameLayout>
  60 +<!-- </com.scwang.smartrefresh.layout.SmartRefreshLayout>-->
  61 +
  62 +
25 </LinearLayout> 63 </LinearLayout>
26 64
27 <LinearLayout 65 <LinearLayout
28 android:layout_width="match_parent" 66 android:layout_width="match_parent"
29 android:layout_height="0dp" 67 android:layout_height="0dp"
30 android:layout_weight="0.5" 68 android:layout_weight="0.5"
31 - android:gravity="center"> 69 + android:gravity="center"
  70 + android:visibility="gone">
32 71
33 <Button 72 <Button
34 - android:id="@+id/btn_bond_device" 73 + android:id="@+id/btn_next"
35 android:layout_width="match_parent" 74 android:layout_width="match_parent"
36 android:layout_height="40dp" 75 android:layout_height="40dp"
37 android:layout_margin="20dp" 76 android:layout_margin="20dp"
module_xiaojiaSoundBox/src/main/res/layout/list_item_all_device.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 +
  5 + <FrameLayout
  6 + android:layout_width="match_parent"
  7 + android:layout_height="120dp"
  8 + android:background="@drawable/round_rectangle_bg">
  9 +
  10 + <RelativeLayout
  11 + android:id="@+id/rl_root"
  12 + android:layout_width="match_parent"
  13 + android:layout_height="match_parent"
  14 + android:clickable="true"
  15 + android:focusable="true"
  16 + android:gravity="center_vertical"
  17 + android:paddingBottom="10dp">
  18 +
  19 + <ImageView
  20 + android:id="@+id/iv_bluetoothDevice_icon"
  21 + android:layout_width="70dp"
  22 + android:layout_height="70dp"
  23 + android:layout_centerVertical="true"
  24 + android:layout_marginLeft="10dp"
  25 + android:layout_marginRight="10dp"
  26 + android:layout_marginBottom="20dp" />
  27 +
  28 +
  29 + <LinearLayout
  30 + android:layout_width="wrap_content"
  31 + android:layout_height="match_parent"
  32 + android:layout_toLeftOf="@id/iv_arrow"
  33 + android:layout_toRightOf="@id/iv_bluetoothDevice_icon"
  34 + android:gravity="center_vertical"
  35 + android:orientation="vertical">
  36 +
  37 + <TextView
  38 + android:id="@+id/tv_device_name"
  39 + android:layout_width="wrap_content"
  40 + android:layout_height="wrap_content"
  41 + android:layout_marginBottom="10dp"
  42 + android:ellipsize="end"
  43 + android:maxLines="1"
  44 + android:textColor="@color/color_282828"
  45 + android:textSize="17dp"
  46 + android:textStyle="bold" />
  47 +
  48 + <TextView
  49 + android:id="@+id/tv_device_state"
  50 + android:layout_width="wrap_content"
  51 + android:layout_height="wrap_content"
  52 + android:layout_centerVertical="true"
  53 + android:layout_marginTop="10dp"
  54 + android:textColor="@color/color_999999"
  55 + android:textSize="14dp" />
  56 + </LinearLayout>
  57 +
  58 + <ImageView
  59 + android:id="@+id/iv_arrow"
  60 + android:layout_width="10dp"
  61 + android:layout_height="16dp"
  62 + android:layout_alignParentRight="true"
  63 + android:layout_centerVertical="true"
  64 + android:layout_marginRight="20dp"
  65 + android:background="@drawable/icon_item_right_arrow" />
  66 +
  67 + </RelativeLayout>
  68 + <!-- -->
  69 + <LinearLayout
  70 + android:id="@+id/ll_add"
  71 + android:layout_width="match_parent"
  72 + android:layout_height="match_parent"
  73 + android:gravity="center"
  74 + android:paddingBottom="10dp">
  75 +
  76 + <ImageView
  77 + android:layout_width="16dp"
  78 + android:layout_height="16dp"
  79 + android:background="@drawable/icon_item_add" />
  80 +
  81 + <TextView
  82 + android:layout_width="wrap_content"
  83 + android:layout_height="wrap_content"
  84 + android:layout_marginLeft="10dp"
  85 + android:text="添加设备"
  86 + android:textColor="@color/color_282828"
  87 + android:textSize="17sp" />
  88 + </LinearLayout>
  89 + </FrameLayout>
  90 +
  91 +</layout>
0 \ No newline at end of file 92 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/pop_item_menu.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout>
  3 +
  4 + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5 + android:layout_width="wrap_content"
  6 + android:layout_height="wrap_content"
  7 + android:gravity="center_vertical"
  8 + android:minWidth="100dp"
  9 + android:orientation="vertical">
  10 +
  11 + <LinearLayout
  12 + android:layout_width="wrap_content"
  13 + android:layout_height="wrap_content">
  14 +
  15 + <ImageView
  16 + android:id="@+id/iv_icon"
  17 + android:layout_width="20dp"
  18 + android:layout_height="20dp" />
  19 +
  20 + <TextView
  21 + android:id="@+id/tv_tip"
  22 + android:layout_width="wrap_content"
  23 + android:layout_height="wrap_content"
  24 + android:layout_marginLeft="10dp"
  25 + android:gravity="center_vertical"
  26 + android:minHeight="35dp"
  27 + android:textColor="@color/color_282828" />
  28 + </LinearLayout>
  29 +
  30 + <View
  31 + android:id="@+id/view_line"
  32 + android:layout_width="match_parent"
  33 + android:layout_height="1dp"
  34 + android:background="@color/line" />
  35 +
  36 + </LinearLayout>
  37 +</layout>
0 \ No newline at end of file 38 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/layout/pop_menu.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="wrap_content"
  4 + android:layout_height="match_parent"
  5 + android:orientation="vertical">
  6 +
  7 + <View
  8 + android:id="@+id/view_jiao"
  9 + android:layout_width="20dp"
  10 + android:layout_height="20dp"
  11 + android:layout_marginLeft="2dp"
  12 + android:background="@drawable/layer_tran" />
  13 +
  14 + <android.support.v7.widget.RecyclerView
  15 + android:id="@+id/rv_list"
  16 + android:layout_width="wrap_content"
  17 + android:layout_height="wrap_content"
  18 + android:layout_below="@id/view_jiao"
  19 + android:layout_marginTop="-1dp" />
  20 +</RelativeLayout>
0 \ No newline at end of file 21 \ No newline at end of file
module_xiaojiaSoundBox/src/main/res/values/ids.xml
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <resources> 2 <resources>
3 <item name="left_back" type="id" /> 3 <item name="left_back" type="id" />
  4 + <item name="right_add" type="id" />
  5 +
4 </resources> 6 </resources>
module_xiaojiaSoundBox/src/main/res/values/strings.xml
@@ -16,5 +16,12 @@ @@ -16,5 +16,12 @@
16 <string name="md_dialog_cancel">取消</string> 16 <string name="md_dialog_cancel">取消</string>
17 <string name="md_dialog_content_head">我们需要以下权限为你工作,请点击“确定”开启权限</string> 17 <string name="md_dialog_content_head">我们需要以下权限为你工作,请点击“确定”开启权限</string>
18 <string name="btn_next_step">下一步</string> 18 <string name="btn_next_step">下一步</string>
  19 + <string name="conn_success">连接成功</string>
  20 + <string name="to_sound_say_tip">您可以对“小家音箱”说</string>
  21 + <string name="xiaojia_say_story_tip">“小家、小家,讲个故事”</string>
  22 + <string name="xiaojia_listen_to_music_tip">“小家、小家,放首歌听听”</string>
  23 + <string name="also_to_listen_china">也可以去“听见中国”听听有趣的故事</string>
  24 + <string name="go_to_liaten_china">前往听见中国 >></string>
  25 + <string name="open_gps_tip">为确保功能正常使用,请开启GPS!</string>
19 26
20 </resources> 27 </resources>