Commit 2046d2c0 authored by Vũ Quốc Trọng's avatar Vũ Quốc Trọng

Initial commit

parents
Pipeline #750 failed with stages

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

*.iml
/.gradle
/.idea
/build
This diff is collapsed.
# EzvizSDK
[点击查看萤石官网集成文档](https://open.ys7.com/doc/zh/book/4.x/android-sdk.html)
apply plugin: 'com.android.library'
apply from: "../app-common/build_common.gradle"
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
minSdkVersion 21
//noinspection ExpiredTargetSdkVersion
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
assets.srcDirs = ['assets']
}
}
lintOptions {
abortOnError false
}
}
dependencies {
// compileOnly fileTree(dir: COMMON_LIB_PATH, include: ['*.jar'])
api 'com.ezviz.sdk:ezviz-sdk:4.16.1'
// implementation files('..\\ezviz-sdk\\libs\\configwifi.jar')
// if (BUILD_TYPE == "for_config_wifi"){
// compileOnly project(path: ':configwifi')
// }else{
// compileOnly project(path: ':ezviz-sdk')
// }
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
dependencies {
implementation "com.alibaba:arouter-api:$arrouter_api_version"
kapt "com.alibaba:arouter-compiler:$arouter_compiler_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="ezviz.ezopensdkcommon">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<application
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".configwifi.ManualConnectDeviceHotspotActivity"
android:screenOrientation="portrait"/>
<activity
android:name=".configwifi.ManualInputDeviceHotspotInfoActivity"
android:screenOrientation="portrait" />
<activity
android:name=".configwifi.AutoWifiPrepareStepOneActivity"
android:screenOrientation="portrait" />
<activity
android:name=".configwifi.AutoWifiNetConfigActivity"
android:screenOrientation="portrait" />
<activity
android:name=".configwifi.AutoWifiResetActivity"
android:screenOrientation="portrait" />
<activity
android:name=".configwifi.ManualChooseConfigWifiWayActivity"
android:screenOrientation="portrait" />
<activity
android:name=".configwifi.ConfigWifiExecutingActivity"
android:screenOrientation="portrait" />
</application>
</manifest>
\ No newline at end of file
package com.ezviz.demo.common
import ezviz.ezopensdkcommon.common.BaseApplication
/**
* 此处简要说明此文件用途
* Created by zhuwen6 on 2020/4/12
*/
object FolderPathManager {
fun getOriginStreamFolder(): String {
return "${BaseApplication.mInstance.externalCacheDir}/Streams"
}
}
\ No newline at end of file
package ezviz.ezopensdkcommon.common;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import com.alibaba.android.arouter.launcher.ARouter;
import ezviz.ezopensdkcommon.debug.LogFileUtil;
public class BaseApplication extends Application {
public static Application mInstance = null;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
// 初始化ARouter
ARouter.openDebug();
ARouter.openLog();
ARouter.init(this);
// 初始化日志文件进程
if (isMainProcess()){
LogFileUtil.startSaveLogToFile(getApplicationContext());
}
}
@Override
public void onTerminate() {
super.onTerminate();
if (isMainProcess()){
LogFileUtil.stopSaveLogToFile();
}
}
/**
* 获取当前进程名
*/
private String getCurrentProcessName() {
int pid = android.os.Process.myPid();
String processName = "";
ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) {
if (process.pid == pid) {
processName = process.processName;
}
}
return processName;
}
/**
* 包名判断是否为主进程
*/
private boolean isMainProcess() {
return getApplicationContext().getPackageName().equals(getCurrentProcessName());
}
public static void restartApp(Context context){
final Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
if (intent != null){
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
System.exit(0);
}
}
}
package ezviz.ezopensdkcommon.common;
import android.annotation.TargetApi;
import android.content.Context;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.CompoundButton;
public class CheckTextButton extends CompoundButton {
private boolean mToggleEnable = true;
public CheckTextButton(Context context) {
this(context, null);
}
public CheckTextButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CheckTextButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
@TargetApi(14)
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setClassName(CheckTextButton.class.getName());
}
@Override
@TargetApi(14)
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(CheckTextButton.class.getName());
}
public void setToggleEnable(boolean toggleEnable) {
this.mToggleEnable = toggleEnable;
}
@Override
public void toggle() {
if (mToggleEnable)
super.toggle();
}
}
\ No newline at end of file
package ezviz.ezopensdkcommon.common;
public class Config {
// 日志开关
public static boolean LOGGING = true;
}
package ezviz.ezopensdkcommon.common;
public class IntentConstants {
/**
* 使用配网sdk
*/
public static final String USING_CONFIG_WIFI_SDK = "using_config_wifi_sdk";
/**
* 使用完整sdk
*/
public static final String USING_FULL_EZVIZ_SDK = "using_full_ezviz_sdk";
public static final String EXTRA_SUPPORT_AP= "support_Ap";
public static final String EXTRA_SUPPORT_SMART_CONFIG = "support_Wifi";
public static final String EXTRA_SUPPORT_SOUND_WAVE = "support_sound_wave";
public static final String SELECTED_PRESENTER_TYPE = "selected_presenter_type";
public static final String DEVICE_SERIAL = "SerialNo";
public static final String DEVICE_VERIFY_CODE = "very_code";
public static final String ROUTER_WIFI_PASSWORD = "wifi_password";
public static final String ROUTER_WIFI_SSID = "wifi_ssid";
public static final String DEVICE_HOTSPOT_SSID = "device_hotspot_ssid";
public static final String DEVICE_HOTSPOT_PWD = "device_hotspot_password";
public static final String USE_MANUAL_AP_CONFIG = "USE_MANUAL_AP_CONFIG";
}
package ezviz.ezopensdkcommon.common;
import android.util.Log;
public class LogUtil {
public static void debugLog(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
// com.tencent.mars.xlog.Log.d(tag, content);
Log.i(tag, content);
}
}
public static void errorLog(String tag, String content) {
// error日志直接打印出来,不检查标志位
Log.e(tag, content);
// com.tencent.mars.xlog.Log.e(tag, content);
}
public static void infoLog(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
Log.i(tag, content);
// com.tencent.mars.xlog.Log.i(tag, content);
}
}
public static void verboseLog(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
Log.v(tag, content);
// com.tencent.mars.xlog.Log.v(tag, content);
}
}
public static void warnLog(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
Log.w(tag, content);
// com.tencent.mars.xlog.Log.w(tag, content);
}
}
public static void debugLog(String tag, String content, Exception e) {
//托管给xlog
if (Config.LOGGING) {
Log.d(tag, content, e);
// com.tencent.mars.xlog.Log.d(tag, content,e);
}
}
public static void errorLog(String tag, String content, Exception e) {
// error日志直接打印出来,不检查标志位
Log.e(tag, content, e);
// com.tencent.mars.xlog.Log.e(tag, content,e);
//
}
public static void warnLog(String tag, String content, Exception e) {
//托管给xlog
if (Config.LOGGING) {
Log.w(tag, content, e);
// com.tencent.mars.xlog.Log.w(tag, content,e.getCause());
}
}
public static void warnLog(String tag, Exception ex) {
//托管给xlog
if (Config.LOGGING) {
Log.w(tag, ex);
// com.tencent.mars.xlog.Log.w(tag, "warnLog",ex.getCause());
}
}
public static void d(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
Log.d(tag, content);
// com.tencent.mars.xlog.Log.d(tag, content);
//
}
}
public static void e(String tag, String content) {
// error日志直接打印出来,不检查标志位
Log.e(tag, content);
// com.tencent.mars.xlog.Log.e(tag, content);
}
public static void i(String tag, String content) {
// info日志直接打印出来,不检查标志位
Log.i(tag, content);
// com.tencent.mars.xlog.Log.i(tag, content);
}
public static void v(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
Log.v(tag, content);
// com.tencent.mars.xlog.Log.v(tag, content);
//
}
}
public static void w(String tag, String content) {
//托管给xlog
if (Config.LOGGING) {
Log.w(tag, content);
// com.tencent.mars.xlog.Log.w(tag, content);
//
}
}
public static void d(String tag, String content, Exception e) {
//托管给xlog
if (Config.LOGGING) {
Log.d(tag, content, e);
// com.tencent.mars.xlog.Log.d(tag, content,e.getCause());
//
}
}
public static void printErrStackTrace(String tag, Throwable throwable) {
//托管给xlog
if (Config.LOGGING && throwable != null && throwable.getMessage() != null) {
// com.tencent.mars.xlog.Log.printErrStackTrace(tag, throwable,"printErrStackTrace");
Log.d(tag, throwable.getMessage());
}
}
public static void printErrStackTrace(String tag, Throwable throwable,String format,Object... obj) {
//托管给xlog
if (Config.LOGGING) {
// com.tencent.mars.xlog.Log.printErrStackTrace(tag, throwable,format,obj);
Log.d(tag, throwable.getMessage());
}
}
public static void e(String tag, String content, Exception e) {
// error日志直接打印出来,不检查标志位
Log.e(tag, content, e);
// com.tencent.mars.xlog.Log.e(tag, content,e.getCause());
}
public static void w(String tag, String content, Exception e) {
//托管给xlog
if (Config.LOGGING) {
Log.w(tag, content, e);
// com.tencent.mars.xlog.Log.w(tag, content,e.getCause());
//
}
}
public static void w(String tag, Exception ex) {
//托管给xlog
if (Config.LOGGING) {
Log.w(tag, ex);
// com.tencent.mars.xlog.Log.w(tag, "w",ex.getCause());
//
}
}
}
package ezviz.ezopensdkcommon.common;
public class RouteNavigator {
public final static String ADD_DEVICE_PAGE = "/app/add/AddDeviceToAccountActivity";
public final static String CONFIG_WIFI_MAIN_PAGE = "/configwifidemo/MainActivity";
}
package ezviz.ezopensdkcommon.common;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TaskManager {
private ExecutorService mExecutorService;
public TaskManager(){
mExecutorService = Executors.newCachedThreadPool();
}
public void submit(Runnable task){
mExecutorService.submit(task);
}
}
package ezviz.ezopensdkcommon.common;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import ezviz.ezopensdkcommon.R;
public class WaitDialog extends Dialog {
private Context mContext;
private TextView mWaitTv = null;
private String mWaitingTxt = null;
public WaitDialog(Context context, int theme) {
super(context, theme);
mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wait_dialog);
mWaitTv = (TextView) findViewById(R.id.wait_tv);
if (mWaitingTxt != null && !mWaitingTxt.isEmpty()) {
mWaitTv.setVisibility(View.VISIBLE);
mWaitTv.setText(mWaitingTxt);
} else {
mWaitTv.setVisibility(View.GONE);
}
}
public void setWaitText(String text) {
mWaitingTxt = text;
if (mWaitTv == null) {
return;
}
if (mWaitingTxt != null && !mWaitingTxt.isEmpty()) {
mWaitTv.setVisibility(View.VISIBLE);
mWaitTv.setText(text);
} else {
mWaitTv.setVisibility(View.GONE);
}
}
@Override
public void show() {
if (mContext != null && !((Activity) mContext).isFinishing()) {
try {
super.show();
} catch (Exception e) {
}
}
}
@Override
public void dismiss() {
if (mContext != null && !((Activity) mContext).isFinishing()) {
try {
super.dismiss();
} catch (Exception e) {
}
}
}
@Override
public void cancel() {
if (mContext != null && !((Activity) mContext).isFinishing()) {
try {
super.cancel();
} catch (Exception e) {
}
}
}
}
package ezviz.ezopensdkcommon.configwifi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.ezviz.sdk.configwifi.WiFiUtils;
import com.ezviz.sdk.configwifi.ap.ConnectionDetector;
import com.hikvision.wifi.configuration.BaseUtil;
import ezviz.ezopensdkcommon.R;
import ezviz.ezopensdkcommon.common.IntentConstants;
import ezviz.ezopensdkcommon.common.RootActivity;
import ezviz.ezopensdkcommon.common.TitleBar;
public class AutoWifiNetConfigActivity extends RootActivity {
public static final String WIFI_PASSWORD = "wifi_password";
public static final String WIFI_SSID = "wifi_ssid";
public static final String DEVICE_TYPE = "device_type";
private Button btnNext;
private TextView tvSSID;
private EditText edtPassword;
private TextView tvTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.auto_wifi_net_config);
initTitleBar();
findViews();
initUI();
setListener();
}
private void initTitleBar() {
TitleBar mTitleBar = findViewById(R.id.title_bar);
tvTitle = mTitleBar.setTitle(R.string.auto_wifi_cer_config_title1);
mTitleBar.addBackButton(new OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
private void showWifiRequiredDialog() {
new AlertDialog.Builder(this).setTitle(R.string.auto_wifi_dialog_title_wifi_required)
.setMessage(R.string.please_open_wifi_network)
.setNegativeButton(R.string.auto_wifi_dialog_btn_wifi, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
dialog.dismiss();
// 跳转wifi设置界面
startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
}
}).setPositiveButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
onBackPressed();
}
}).setCancelable(false).create().show();
}
@Override
protected void onResume() {
super.onResume();
if (ConnectionDetector.getConnectionType(this) != ConnectionDetector.WIFI) {
tvSSID.setText(R.string.unknow_ssid);
showWifiRequiredDialog();
} else {
updateWifiInfo();
}
}
private void updateWifiInfo(){
// 优先使用getCurrentWifiSsid方法获取wifi名
String wifiName = WiFiUtils.getCurrentWifiSsid(this);
// 如上述方式无效,则使用getWifiSSID方法进行获取
if (!isValidWifiSSID(wifiName)){
wifiName = BaseUtil.getWifiSSID(this);
}
if (isValidWifiSSID(wifiName)){
tvSSID.setText(wifiName);
}
}
private boolean isValidWifiSSID(String wifiName){
return !TextUtils.isEmpty(wifiName) && !"<unknown ssid>".equalsIgnoreCase(wifiName);
}
private void findViews() {
btnNext = findViewById(R.id.btnNext);
tvSSID = findViewById(R.id.tvSSID);
edtPassword = findViewById(R.id.edtPassword);
}
private void initUI() {
tvTitle.setText(R.string.auto_wifi_cer_config_title2);
String password = "";
edtPassword.setText(password);
}
private void setListener() {
btnNext.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
goToChooseConfigWifiWay();
}
});
}
private void goToChooseConfigWifiWay(){
Intent toConfigIntent = new Intent(mContext, ManualChooseConfigWifiWayActivity.class);
toConfigIntent.putExtras(getIntent());
toConfigIntent.putExtra(IntentConstants.ROUTER_WIFI_SSID, tvSSID.getText().toString());
toConfigIntent.putExtra(IntentConstants.ROUTER_WIFI_PASSWORD, TextUtils.isEmpty(edtPassword.getText().toString())
? "smile" : edtPassword.getText().toString());
startActivity(toConfigIntent);
}
}
package ezviz.ezopensdkcommon.configwifi;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import ezviz.ezopensdkcommon.R;
import ezviz.ezopensdkcommon.common.RootActivity;
import ezviz.ezopensdkcommon.common.TitleBar;
public class AutoWifiPrepareStepOneActivity extends RootActivity implements OnClickListener {
private Button btnNext;
private String deviceType;
private TextView topTip;
private Button btnIntroduce;
private ImageView imageBg;
private AnimationDrawable aminBg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.auto_wifi_prepare_step_on);
initTitleBar();
initUI();
}
private void initTitleBar() {
TitleBar mTitleBar = (TitleBar) findViewById(R.id.title_bar);
mTitleBar.setTitle(R.string.auto_wifi_step_one_title);
mTitleBar.addBackButton(new OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
@Override
protected void onResume() {
super.onResume();
}
private void initUI() {
topTip = (TextView) findViewById(R.id.topTip);
imageBg = (ImageView) findViewById(R.id.imageBg);
btnNext = (Button) findViewById(R.id.btnNext);
btnIntroduce = (Button) findViewById(R.id.btnIntroduce);
btnNext.setOnClickListener(this);
btnIntroduce.setOnClickListener(this);
topTip.setText(getString(R.string.tip_heard_voice));
imageBg.setImageResource(R.drawable.video_camera1_3);
btnNext.setText(R.string.autowifi_heard_voice);
btnIntroduce.setText(R.string.autowifi_not_heard_voice);
}
@Override
public void onClick(View v) {
Intent intent = null;
int id = v.getId();
if (id == R.id.btnNext){
intent = new Intent(this, AutoWifiNetConfigActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
}else if(id == R.id.btnIntroduce){
intent = new Intent(this, AutoWifiResetActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
}
// switch (v.getId()) {
// case R.id.btnNext:
// intent = new Intent(this, AutoWifiNetConfigActivity.class);
// intent.putExtras(getIntent());
// startActivity(intent);
// break;
// case R.id.btnIntroduce:
// intent = new Intent(this, AutoWifiResetActivity.class);
// intent.putExtras(getIntent());
// startActivity(intent);
// break;
// default:
// break;
// }
}
@Override
protected void onDestroy() {
if (aminBg != null) {
aminBg.stop();
aminBg = null;
}
super.onDestroy();
}
}
package ezviz.ezopensdkcommon.configwifi;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import ezviz.ezopensdkcommon.R;
import ezviz.ezopensdkcommon.common.RootActivity;
import ezviz.ezopensdkcommon.common.TitleBar;
//import com.videogo.main.CustomApplication;
public class AutoWifiResetActivity extends RootActivity implements OnClickListener {
private View btnNext;
private TextView topTip;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ((CustomApplication) getApplication()).addSingleActivity(AutoWifiResetActivity.class.getName(), this);
// 页面统计
super.onCreate(savedInstanceState);
setContentView(R.layout.auto_wifi_reset);
initTitleBar();
initUI();
}
private void initTitleBar() {
TitleBar mTitleBar = (TitleBar) findViewById(R.id.title_bar);
mTitleBar.setTitle(R.string.device_reset_title);
mTitleBar.addBackButton(new OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
@Override
protected void onResume() {
super.onResume();
}
private void initUI() {
topTip = (TextView) findViewById(R.id.topTip);
btnNext = findViewById(R.id.btnNext);
topTip.setText(R.string.device_reset_tip);
btnNext.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = null;
int id = v.getId();
if (id == R.id.btnNext){
intent = new Intent(this, AutoWifiNetConfigActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
}
// switch (v.getId()) {
// case R.id.btnNext:
// intent = new Intent(this, AutoWifiNetConfigActivity.class);
// intent.putExtras(getIntent());
// startActivity(intent);
// break;
// default:
// break;
// }
}
}
package ezviz.ezopensdkcommon.configwifi;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.facade.callback.NavCallback;
import com.alibaba.android.arouter.launcher.ARouter;
import com.ezviz.sdk.configwifi.EZConfigWifiErrorEnum;
import ezviz.ezopensdkcommon.R;
import ezviz.ezopensdkcommon.common.IntentConstants;
import ezviz.ezopensdkcommon.common.LogUtil;
import ezviz.ezopensdkcommon.common.RootActivity;
import ezviz.ezopensdkcommon.common.RouteNavigator;
public class ConfigWifiExecutingActivity extends RootActivity implements ConfigWifiExecutingActivityPresenter.Callback{
private final static String TAG = ConfigWifiExecutingActivity.class.getSimpleName();
private ConfigWifiExecutingActivityPresenter mPresenter;
private View mConfigResultView;
private View mConfigSuccessView;
private View mConfigFailView;
private TextView mConfigErrorInfoTv;
private String mAllErrorInfo;
public static void launch(Context context, Intent intent){
Intent newIntent = new Intent(context, ConfigWifiExecutingActivity.class);
newIntent.putExtras(intent);
newIntent.putExtra(IntentConstants.USE_MANUAL_AP_CONFIG, true);
context.startActivity(newIntent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_config_wifi_executing);
mPresenter = ConfigWifiExecutingActivityPresenter.getPresenter(getIntent()
.getStringExtra(IntentConstants.SELECTED_PRESENTER_TYPE));
if (mPresenter == null){
LogUtil.e(TAG, "failed to init!");
return;
}
initUI();
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
showExecutingUi();
startConfig();
}
});
}
@Override
protected void onStop() {
super.onStop();
showToast(getString(R.string.app_common_stop_config_wifi_while_switched_to_background));
exitPage();
}
/**
* 重试
*/
public void onClickRetryConfigWifi(View view) {
showExecutingUi();
startConfig();
}
/**
* 配网成功,根据使用sdk不同,跳转到对应页面
*/
public void onClickToConfigAnother(View view) {
// 如果是在使用配网sdk,则跳转到配网开始页
if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
ARouter.getInstance().build(RouteNavigator.CONFIG_WIFI_MAIN_PAGE)
.navigation(this, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
exitPage();
}
@Override
public void onLost(Postcard postcard) {
// do nothing
}
});
}
}
@Override
public void onBackPressed() {
exitPage();
}
public void onClickExit(View view) {
exitPage();
}
private void exitPage(){
stopConfig();
finish();
}
@Override
public void onConnectedToWifi() {
LogUtil.i(TAG, "onConnectedToWifi");
// 仅使用配网sdk时,才展示配网成功的ui
if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
showConfigSuccessUi();
}
}
@Override
public void onConnectedToPlatform() {
LogUtil.i(TAG, "onConnectedToPlatform");
ARouter.getInstance().build(RouteNavigator.ADD_DEVICE_PAGE)
.withString(IntentConstants.DEVICE_SERIAL, getIntent().getStringExtra(IntentConstants.DEVICE_SERIAL))
.withString(IntentConstants.DEVICE_VERIFY_CODE, getIntent().getStringExtra(IntentConstants.DEVICE_VERIFY_CODE))
.withFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
.navigation(this, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
exitPage();
}
@Override
public void onLost(Postcard postcard) {
// do nothing
}
});
}
@Override
public void onConfigInfo(int info) {
}
@Override
public void onConfigError(int code, String msg) {
String errorInfo = "***" + "error code is: " + code + ", error msg is: " + msg + "\n";
LogUtil.e(TAG, errorInfo);
// 仅展示新定义的错误码
for (EZConfigWifiErrorEnum error : EZConfigWifiErrorEnum.values()){
if (code == error.code){
if (mAllErrorInfo == null){
mAllErrorInfo = "" + errorInfo;
}else{
mAllErrorInfo += errorInfo;
}
break;
}
}
// 用户拒绝连接设备热点则认为配网失败
if (code == EZConfigWifiErrorEnum.USER_REFUSED_CONNECTION_REQUEST.code){
failedToConfig();
}
}
@Override
public void onTimeout() {
failedToConfig();
}
private void failedToConfig(){
stopConfig();
switch (mPresenter.getType()){
case ConfigWifiTypeConstants.CONFIG_WIFI_SDK_AP:
case ConfigWifiTypeConstants.FULL_SDK_AP:
ManualConnectDeviceHotspotActivity.Companion.launch(this, getIntent());
break;
default:
showConfigFailUi();
break;
}
}
private void startConfig(){
if (mPresenter != null){
mPresenter.setCallback(this);
mPresenter.startConfigWifi(getApplication(), getIntent());
}
}
private void stopConfig(){
if (mPresenter != null){
mPresenter.setCallback(null);
mPresenter.stopConfigWifi();
}
}
private void initUI() {
mConfigResultView = findViewById(R.id.app_common_vg_config_result);
mConfigSuccessView = findViewById(R.id.app_common_config_result_success);
mConfigFailView = findViewById(R.id.app_common_config_result_fail);
mConfigErrorInfoTv = findViewById(R.id.app_common_all_config_error_info);
}
private void showExecutingUi(){
runOnUiThread(new Runnable() {
@Override
public void run() {
mConfigResultView.setVisibility(View.GONE);
mConfigSuccessView.setVisibility(View.GONE);
mConfigFailView.setVisibility(View.GONE);
mAllErrorInfo = null;
}
});
}
private void showConfigSuccessUi(){
runOnUiThread(new Runnable() {
@Override
public void run() {
mConfigResultView.setVisibility(View.VISIBLE);
mConfigSuccessView.setVisibility(View.VISIBLE);
mConfigFailView.setVisibility(View.GONE);
mAllErrorInfo = null;
}
});
}
private void showConfigFailUi(){
runOnUiThread(new Runnable() {
@Override
public void run() {
mConfigErrorInfoTv.setText(mAllErrorInfo);
mConfigResultView.setVisibility(View.VISIBLE);
mConfigSuccessView.setVisibility(View.GONE);
mConfigFailView.setVisibility(View.VISIBLE);
mAllErrorInfo = null;
}
});
}
}
package ezviz.ezopensdkcommon.configwifi;
import android.app.Application;
import android.content.Intent;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
public abstract class ConfigWifiExecutingActivityPresenter {
private static List<ConfigWifiExecutingActivityPresenter> mAvailablePresenterList = new ArrayList<>();
protected Callback mCallback;
protected String mType;
public String getType(){
return mType;
}
public void setCallback(Callback mCallback) {
this.mCallback = mCallback;
}
public static void addPresenter(ConfigWifiExecutingActivityPresenter presenter){
// 移除同类presenter,避免互相干扰
clearPresenter(presenter.mType);
mAvailablePresenterList.add(presenter);
}
public static ConfigWifiExecutingActivityPresenter getPresenter(String type){
for (ConfigWifiExecutingActivityPresenter presenter: mAvailablePresenterList){
if (!TextUtils.isEmpty(type) && type.equals(presenter.mType)){
return presenter;
}
}
return null;
}
private static void clearPresenter(String type){
List<ConfigWifiExecutingActivityPresenter> mFoundList = new ArrayList<>();
for (ConfigWifiExecutingActivityPresenter presenter: mAvailablePresenterList){
if (!TextUtils.isEmpty(type) && type.equals(presenter.mType)){
mFoundList.add(presenter);
}
}
mAvailablePresenterList.removeAll(mFoundList);
}
public abstract void startConfigWifi(Application app, Intent configParam);
public abstract void stopConfigWifi();
public interface Callback{
void onConnectedToWifi();
/**
* 设备已经上线,仅供完整SDK使用
*/
void onConnectedToPlatform();
void onConfigInfo(int info);
void onConfigError(int code, String msg);
void onTimeout();
}
}
package ezviz.ezopensdkcommon.configwifi;
public class ConfigWifiTypeConstants {
public final static String FULL_SDK_AP = "FULL_SDK_AP";
public final static String FULL_SDK_SMART_CONFIG = "FULL_SDK_SMART_CONFIG";
public final static String FULL_SDK_SOUND_WAVE = "FULL_SDK_SOUND_WAVE";
public final static String CONFIG_WIFI_SDK_AP = "CONFIG_WIFI_SDK_AP";
public final static String CONFIG_WIFI_SDK_SMART_CONFIG = "CONFIG_WIFI_SDK_SMART_CONFIG";
public final static String CONFIG_WIFI_SDK_SOUND_WAVE = "CONFIG_WIFI_SDK_SOUND_WAVE";
}
package ezviz.ezopensdkcommon.configwifi;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import ezviz.ezopensdkcommon.R;
import ezviz.ezopensdkcommon.common.IntentConstants;
import ezviz.ezopensdkcommon.common.LogUtil;
import ezviz.ezopensdkcommon.common.RootActivity;
import ezviz.ezopensdkcommon.common.TitleBar;
public class ManualChooseConfigWifiWayActivity extends RootActivity {
private final String TAG = ManualChooseConfigWifiWayActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manual_choose_config_wifi_way);
initTitleBar();
initUi();
}
protected void initUi() {
showAvailableConfigWays();
}
private void showAvailableConfigWays() {
boolean isUsingFullSdk = getIntent().getBooleanExtra(IntentConstants.USING_FULL_EZVIZ_SDK, false);
View toApView = findViewById(R.id.btn_to_ap);
if (toApView != null){
if (isUsingFullSdk){
toApView.setVisibility(getIntent().getBooleanExtra(IntentConstants.EXTRA_SUPPORT_AP, false) ? View.VISIBLE : View.GONE);
}
toApView.setOnClickListener(mChooseConfigWifiListener);
}
View toSmartConfigView = findViewById(R.id.btn_to_smart_config);
if (toSmartConfigView != null){
if (isUsingFullSdk){
toSmartConfigView.setVisibility(getIntent().getBooleanExtra(IntentConstants.EXTRA_SUPPORT_SMART_CONFIG, false) ? View.VISIBLE : View.GONE);
}
toSmartConfigView.setOnClickListener(mChooseConfigWifiListener);
}
View toSoundWaveView = findViewById(R.id.btn_to_sound_wave);
if (toSoundWaveView != null){
if (isUsingFullSdk){
toSoundWaveView.setVisibility(getIntent().getBooleanExtra(IntentConstants.EXTRA_SUPPORT_SOUND_WAVE, false) ? View.VISIBLE : View.GONE);
}
toSoundWaveView.setOnClickListener(mChooseConfigWifiListener);
}
}
private View.OnClickListener mChooseConfigWifiListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent toConfigIntent = new Intent();
toConfigIntent.putExtras(getIntent());
String presenterType = null;
ComponentName componentName = null;
int id = v.getId();
if (id == R.id.btn_to_ap){
if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
presenterType = ConfigWifiTypeConstants.CONFIG_WIFI_SDK_AP;
componentName = new ComponentName(mContext, ManualInputDeviceHotspotInfoActivity.class);
}else{
presenterType = ConfigWifiTypeConstants.FULL_SDK_AP;
componentName = new ComponentName(mContext, ConfigWifiExecutingActivity.class);
}
}else if(id == R.id.btn_to_smart_config){
if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
presenterType = ConfigWifiTypeConstants.CONFIG_WIFI_SDK_SMART_CONFIG;
}else{
presenterType = ConfigWifiTypeConstants.FULL_SDK_SMART_CONFIG;
}
componentName = new ComponentName(mContext, ConfigWifiExecutingActivity.class);
toConfigIntent.putExtra(IntentConstants.EXTRA_SUPPORT_SOUND_WAVE, false);
}else if(id == R.id.btn_to_sound_wave){
if (getIntent().getBooleanExtra(IntentConstants.USING_CONFIG_WIFI_SDK, false)){
presenterType = ConfigWifiTypeConstants.CONFIG_WIFI_SDK_SOUND_WAVE;
}else{
presenterType = ConfigWifiTypeConstants.FULL_SDK_SOUND_WAVE;
}
componentName = new ComponentName(mContext, ConfigWifiExecutingActivity.class);
toConfigIntent.putExtra(IntentConstants.EXTRA_SUPPORT_SMART_CONFIG, false);
}else{
toConfigIntent = null;
}
if (toConfigIntent != null){
toConfigIntent.putExtra(IntentConstants.SELECTED_PRESENTER_TYPE, presenterType);
toConfigIntent.setComponent(componentName);
startActivity(toConfigIntent);
}else{
LogUtil.e(TAG, "not find any suitable config wifi way!");
}
}
};
private void initTitleBar() {
TitleBar titleBar = (TitleBar) findViewById(R.id.title_bar);
if (titleBar != null){
titleBar.setTitle(getString(R.string.choose_config_wifi_way));
titleBar.addBackButton(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
}
}
}
@file:Suppress("UNUSED_PARAMETER")
package ezviz.ezopensdkcommon.configwifi
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils
import android.view.View
import com.ezviz.sdk.configwifi.WiFiUtils
import com.hikvision.wifi.configuration.BaseUtil
import ezviz.ezopensdkcommon.R
import ezviz.ezopensdkcommon.common.IntentConstants.*
import ezviz.ezopensdkcommon.common.RootActivity
import kotlinx.android.synthetic.main.activity_manual_connect_device_hotspot.*
class ManualConnectDeviceHotspotActivity : RootActivity() {
private var mSSID: String? = null
private var mPWD: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manual_connect_device_hotspot)
initUi()
}
override fun initUi() {
super.initUi()
intent?.apply {
val prefix = "EZVIZ_"
mSSID = getStringExtra(DEVICE_HOTSPOT_SSID)
if(TextUtils.isEmpty(mSSID)){
mSSID = prefix + getStringExtra(DEVICE_SERIAL)
}
mPWD = getStringExtra(DEVICE_HOTSPOT_PWD)
if(TextUtils.isEmpty(mPWD)){
mPWD = prefix + getStringExtra(DEVICE_VERIFY_CODE)
}
tv_ssid.text = getString(R.string.device_hotspot_ssid) + mSSID
tv_pwd.text = getString(R.string.device_hotspot_pwd) + mPWD
}
}
override fun onResume() {
super.onResume()
checkWifiInfo()
}
private fun checkWifiInfo() { // 优先使用getCurrentWifiSsid方法获取wifi名
var wifiName = WiFiUtils.getCurrentWifiSsid(this)
// 如上述方式无效,则使用getWifiSSID方法进行获取
if (!isValidWifiSSID(wifiName)) {
wifiName = BaseUtil.getWifiSSID(this)
}
val isConnected = isValidWifiSSID(wifiName)
showToast("Connected to device hotspot: $isConnected")
if (isConnected) {
intent?.apply {
putExtra(USE_MANUAL_AP_CONFIG, true)
ConfigWifiExecutingActivity.launch(mContext, this)
}
}
}
private fun isValidWifiSSID(wifiName: String): Boolean {
return mSSID != null && mSSID.equals(wifiName)
}
fun onclickGoToWifiSetting(view: View) {
val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
startActivity(intent)
}
companion object {
fun launch(context: Context, intent: Intent?) {
val newIntent = Intent(context, ManualConnectDeviceHotspotActivity::class.java)
newIntent.putExtras(intent!!)
newIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(newIntent)
}
}
}
\ No newline at end of file
package ezviz.ezopensdkcommon.configwifi
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import ezviz.ezopensdkcommon.R
import ezviz.ezopensdkcommon.common.IntentConstants
import ezviz.ezopensdkcommon.common.RootActivity
import kotlinx.android.synthetic.main.activity_manual_input_device_hotspot_info.*
class ManualInputDeviceHotspotInfoActivity : RootActivity() {
private val mEzvizDeviceHotspotPrefix = "EZVIZ_"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manual_input_device_hotspot_info)
// app_common_device_hotspot_name.setText("")
}
fun onClickNext(view: View){
var deviceHotspotName = app_common_device_hotspot_name.text.toString()
var deviceHotspotPwd = app_common_device_hotspot_pwd.text.toString()
if (TextUtils.isEmpty(deviceHotspotName)){
deviceHotspotName = mEzvizDeviceHotspotPrefix + intent.getStringExtra(IntentConstants.DEVICE_SERIAL)
}
// if (TextUtils.isEmpty(deviceHotspotPwd)){
// deviceHotspotPwd = mEzvizDeviceHotspotPrefix + intent.getStringExtra(IntentConstants.DEVICE_VERIFY_CODE)
// }
val jumpIntent = Intent(this, ConfigWifiExecutingActivity::class.java)
jumpIntent.putExtras(intent)
jumpIntent.putExtra(IntentConstants.DEVICE_HOTSPOT_SSID, deviceHotspotName)
jumpIntent.putExtra(IntentConstants.DEVICE_HOTSPOT_PWD, deviceHotspotPwd)
startActivity(jumpIntent)
}
}
package ezviz.ezopensdkcommon.debug;
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 将当前app的指定日志级别的log写入到目标文件
* 请务必保证app具有以下权限
<!--日志读取权限-->
<uses-permission android:name="android.permission.READ_LOGS" />
<!--sd卡写入权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
*/
public class LogFileService {
private final static String TAG = "@@@" + LogFileService.class.getSimpleName();
private static boolean started = false;
public static boolean isStarted(){
return started;
}
public static void start(String logFileNameWithPath){
Log.w(TAG, "start()");
final File logFile = new File(logFileNameWithPath);
// step1: 检查日志文件写入功能是否已经开启
if (started){
Log.e(TAG, "LogFileService has started, do not call LogFileService.start() again!");
return;
}
// step2: 检查并创建日志文件所在目录
if (logFile.isDirectory() && !logFile.delete()){
Log.e(TAG, "logFile exist, but is a directory!");
return;
}
File logFileFolder = logFile.getParentFile();
boolean exist = logFileFolder.exists();
if (!exist){
exist = logFileFolder.mkdirs();
}
if (!exist){
Log.e(TAG, "logFileFolder can not be created!");
return;
}
new Thread(new Runnable() {
@Override
public void run() {
started = true;
try {
int currentPid = android.os.Process.myPid();
Log.w(TAG, "save log of pid" + "(" + currentPid + ")" + " to log file"+
"(" + logFile.getPath() +")");
// 日志来源
String logcatCommand = "logcat *:D --pid=" + currentPid;
Log.w(TAG, "logcatCommand is: " + logcatCommand);
Process process = Runtime.getRuntime().exec(logcatCommand);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
// 日志输出
FileOutputStream fos = new FileOutputStream(logFile, true);
String line;
Log.w(TAG, "start to write log");
while (started) {
if ((line = bufferedReader.readLine()) != null){
fos.write((line + "\n").getBytes());
fos.flush();
}
}
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public static void stop(){
Log.w(TAG, "stop()");
if (started){
started = false;
Log.w(TAG, "stop to write log");
}
}
}
package ezviz.ezopensdkcommon.debug;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import ezviz.ezopensdkcommon.demo.DemoConfig;
public class LogFileUtil {
private final static String TAG = "@@@" + LogFileUtil.class.getSimpleName();
/**
* 保存日志文件:启动
*/
public static void startSaveLogToFile(Context context){
// 检查存储权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
Log.e(TAG, "startSaveLogToFile failed: lack of Manifest.permission.WRITE_EXTERNAL_STORAGE");
return;
}
final String logFileNameWithPath = DemoConfig.getDemoFolder() + "/log.txt";
LogFileService.start(logFileNameWithPath);
}
/**
* 保存日志文件:停止
*/
public static void stopSaveLogToFile(){
LogFileService.stop();
}
/**
* 保存日志文件:获取当前状态
*/
public static boolean isSavingLogToFile(){
return LogFileService.isStarted();
}
}
package ezviz.ezopensdkcommon.demo;
import android.os.Environment;
import ezviz.ezopensdkcommon.common.BaseApplication;
public class DemoConfig {
/**
* 是否打开调试页面
*/
public static final boolean isNeedJumpToTestPage = false;
/**
* 文件保存位置
*/
private static final String DEMO_FOLDER = BaseApplication.mInstance.getExternalCacheDir() + "/0_OpenSDK";
public static String getDemoFolder(){
return DEMO_FOLDER;
}
public static String getRecordsFolder(){
return DEMO_FOLDER + "/Records";
}
public static String getCapturesFolder(){
return DEMO_FOLDER + "/Captures";
}
public static String getStreamsFolder(){
return DEMO_FOLDER + "/Streams";
}
}
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="60"
android:fromDegrees="-4"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="3"
android:repeatMode="restart"
android:toDegrees="4" />
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/query_loding1"
android:duration="150">
</item>
<item
android:drawable="@drawable/query_loding2"
android:duration="150">
</item>
<item
android:drawable="@drawable/query_loding3"
android:duration="150">
</item>
<item
android:drawable="@drawable/query_loding4"
android:duration="150">
</item>
<item
android:drawable="@drawable/query_loding5"
android:duration="150">
</item>
</animation-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/download8"
android:duration="150">
</item>
</animation-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="25"
android:toYDelta="100%p" />
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0" />
</set>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--
根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
根标签下,通过item标签对动画中的每一个图片进行声明
android:duration 表示展示所用的该图片的时间长度
-->
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item android:drawable="@drawable/play_full_multiple" android:duration="500"></item>
<item android:drawable="@drawable/play_full_multiple2" android:duration="500"></item>
<item android:drawable="@drawable/play_full_multiple3" android:duration="500"></item>
<item android:drawable="@drawable/play_full_multiple4" android:duration="500"></item>
<item android:drawable="@drawable/play_full_multiple5" android:duration="500"></item>
</animation-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1200"
android:fromDegrees="0.0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="720.0" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#adadad"/>
<item android:color="#ff0000"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/event_message_play_btn" android:state_pressed="true"/>
<item android:drawable="@color/transparent"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:color="#1b9ee2"/>
<item android:state_pressed="true" android:color="#1b9ee2"/>
<item android:color="@color/common_text"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/gray_text"/>
<item android:state_pressed="true" android:color="@color/white"/>
<item android:color="@color/message_button_text"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/white" />
<item android:state_enabled="false" android:color="@color/quality_focused_color"/>
<item android:state_pressed="true" android:color="@color/quality_focused_color"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#adadad"/>
<item android:color="#3aa3ee"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/white"/>
<item android:state_focused="true" android:color="@color/white"/>
<item android:state_pressed="true" android:color="@color/white"/>
<item android:color="@color/black_text"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#5c5b5b"/>
<item android:state_pressed="true" android:color="#5c5b5b"/>
<item android:color="#fff"/>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#44000000"
android:endColor="#00000000"
android:angle="90"
/>
</shape>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment