Commit b626afdd by cuiliang.shi

init

1 parent 6ef6497d
Showing with 3043 additions and 0 deletions
No preview for this file type
No preview for this file type
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/global_dialog" />
<option value="$PROJECT_DIR$/loadtoast" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="10">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="9">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion '28'
defaultConfig {
applicationId "com.toscl.turingos"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "0.1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk {
abiFilters "armeabi","armeabi-v7a"
}
}
lintOptions {
abortOnError false
}
android.applicationVariants.all { variant ->
variant.outputs.all {
// _${defaultConfig.versionName}
outputFileName = "TuringOS_${defaultConfig.versionName}.apk"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['./jni']
}
}
repositories {
flatDir {
dirs 'libs'
}
}
aaptOptions {
noCompress "dat"
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:25.2.0'
implementation 'io.reactivex.rxjava2:rxjava:2.1.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
implementation 'com.nispok:snackbar:2.11.0'
androidTestImplementation 'junit:junit:4.12'
implementation(name: 'iot-release', ext: 'aar')
implementation(name: 'asr-release', ext: 'aar')
implementation(name: 'authority-release', ext: 'aar')
implementation(name: 'music-release', ext: 'aar')
implementation(name: 'semantic-release', ext: 'aar')
implementation(name: 'tts-release', ext: 'aar')
implementation(name: 'turingmusic_mg', ext: 'aar')
implementation(name: 'sdkhttp', ext: 'aar')
implementation(name: 'common-release', ext: 'aar')
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
implementation 'com.zhy:okhttputils:2.6.2'
implementation 'net.zetetic:android-database-sqlcipher:3.5.4'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.1'
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation project(path: ':global_dialog')
implementation project(path: ':loadtoast')
}
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
The file could not be displayed because it is too large.
No preview for this file type
# 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
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":6,"versionName":"1.0.5","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
The file could not be displayed because it is too large.
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"0.1","enabled":true,"outputFile":"TuringOS_0.1.apk","fullName":"release","baseName":"release"},"path":"TuringOS_0.1.apk","properties":{}}]
\ No newline at end of file
package com.toscl.turingos;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.toscl.baiherobot", appContext.getPackageName());
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.toscl.turingos">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar"
tools:ignore="GoogleAppIndexingWarning">
<activity
android:windowSoftInputMode="stateAlwaysHidden"
android:theme="@style/AppTheme.Launcher"
android:name="com.toscl.turingos.MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="TURING_APPKEY"
android:value="@string/turing_appkey" />
<meta-data
android:name="TURING_SECRET"
android:value="@string/turing_secret" />
</application>
</manifest>
\ No newline at end of file
package com.toscl.turingos;
import android.text.TextUtils;
import android.util.Log;
import com.toscl.turingos.util.FunctionConstants;
import com.toscl.turingos.util.OSDataTransformUtil;
import com.turing.asr.callback.AsrListener;
import com.turing.asr.engine.AsrManager;
import com.turing.asr.function.bean.ASRErrorMessage;
import com.turing.semantic.SemanticManager;
import com.turing.semantic.entity.Behavior;
import com.turing.semantic.listener.OnHttpRequestListener;
import com.turing.tts.TTSListener;
import com.turing.tts.TTSManager;
import java.util.List;
public class Base {
private com.turing.asr.callback.AsrListener AsrListener;
private com.turing.tts.TTSListener TTSListener;
private OnHttpRequestListener mSemanticListener;
private boolean isDopost = false;//是否进行请求
private boolean isTTs = false;//是否tts
private Base() {
}
private static class SingletonHolder {
private static final Base INSTANCE = new Base();
}
public static Base getInstance() {
return SingletonHolder.INSTANCE;
}
protected void setAsrListener(com.turing.asr.callback.AsrListener AsrListener) {
this.AsrListener = AsrListener;
}
protected void setTTSListener(com.turing.tts.TTSListener TTSListener) {
this.TTSListener = TTSListener;
}
protected void setSemanticListener(OnHttpRequestListener semanticListener) {
this.mSemanticListener = semanticListener;
}
protected OnHttpRequestListener getSemanticListener() {
return mSemanticListener;
}
protected com.turing.asr.callback.AsrListener getAsrListener() {
return AsrListener;
}
protected com.turing.tts.TTSListener getTTSListener() {
return TTSListener;
}
protected com.turing.asr.callback.AsrListener asrListener = new AsrListener() {
@Override
public void onResults(List<String> list, boolean b) {
if (AsrListener != null) {
AsrListener.onResults(list, b);
}
if (!b){
return;
}
if (isDopost) {
if (list != null && list.size() != 0 && !TextUtils.isEmpty(list.get(0))) {
doPost(list.get(0));
}
}
}
@Override
public void onStartRecord() {
if (AsrListener != null) {
AsrListener.onStartRecord();
}
}
@Override
public void onEndOfRecord() {
if (AsrListener != null) {
AsrListener.onEndOfRecord();
}
}
@Override
public void onError(ASRErrorMessage errorMessage) {
if (AsrListener != null) {
AsrListener.onError(errorMessage);
}
}
@Override
public void onVolumeChange(int i) {
if (AsrListener != null) {
AsrListener.onVolumeChange(i);
}
}
};
protected OnHttpRequestListener semanticListener = new OnHttpRequestListener() {
@Override
public void onSuccess(String s) {
if (mSemanticListener != null) {
mSemanticListener.onSuccess(s);
}
Behavior behavior = OSDataTransformUtil.getBehavior(s);
if (behavior.getIntent().getCode() == 201601){
isTTs = false;
}else{
isTTs = true;
}
// if (isTTs) {
// readTts(s);
// }
}
@Override
public void onError(int i, String s) {
if (mSemanticListener != null) {
mSemanticListener.onError(i, s);
}
}
@Override
public void onCancel() {
}
};
protected com.turing.tts.TTSListener ttsCallBack = new TTSListener() {
@Override
public void onSpeakBegin(String s) {
if (TTSListener != null) {
TTSListener.onSpeakBegin(s);
}
}
@Override
public void onSpeakPaused() {
if (TTSListener != null) {
TTSListener.onSpeakPaused();
}
}
@Override
public void onSpeakResumed() {
if (TTSListener != null) {
TTSListener.onSpeakResumed();
}
}
@Override
public void onSpeakCompleted() {
if (TTSListener != null) {
TTSListener.onSpeakCompleted();
}
}
@Override
public void onSpeakFailed() {
}
};
/**
* 录音
**/
protected void record() {
AsrManager.getInstance().startAsr(asrListener);
}
/**
* 语义
**/
protected void doPost(String content) {
//设置从云端返回数据读取的超时时间
SemanticManager.getInstance().setReadTimeout(15 * 1000);
//设置发送数据到云端写入的超时时间
SemanticManager.getInstance().setWriteTimeout(15 * 1000);
//设置连接超时时间
SemanticManager.getInstance().setConnectTimeout(15 * 1000);
SemanticManager.getInstance().requestSemantic(content, semanticListener);
}
/**
* 读
**/
protected void readTts(String str) {
try {
String tts = (String) OSDataTransformUtil.getResultBean(str).getValues().getText();
int code = OSDataTransformUtil.getIntent(str).getCode();
Log.d("readTts", "readTts = ");
if (FunctionConstants.mediaCodeList.contains(code)) {
return;
}
if (FunctionConstants.musicCodeList.contains(code)){
return;
}
TTSManager.getInstance().startTTS(tts, ttsCallBack);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 用于设置
**/
protected void setActionBo(boolean isdo, boolean isTt) {
this.isDopost = isdo;
this.isTTs = isTt;
}
/**
* asr+语义+tts
**/
public void getAll(com.turing.asr.callback.AsrListener asrClientListener, OnHttpRequestListener semanticClientListener, com.turing.tts.TTSListener ttsClientListener) {
setAsrListener(asrClientListener);
setSemanticListener(semanticClientListener);
setTTSListener(ttsClientListener);
setActionBo(true, true);
AsrManager.getInstance().stop();
TTSManager.getInstance().stopTTS();
record();
}
}
package com.toscl.turingos;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
public class CommomDialog extends Dialog implements View.OnClickListener{
private TextView contentTxt;
private TextView titleTxt;
private TextView submitTxt;
private TextView cancelTxt;
private Context mContext;
private String content;
private OnCloseListener listener;
private String positiveName;
private String negativeName;
private String title;
public CommomDialog(Context context) {
super(context);
this.mContext = context;
}
public CommomDialog(Context context, String content) {
super(context, R.style.dialog);
this.mContext = context;
this.content = content;
}
public CommomDialog(Context context, int themeResId, String content) {
super(context, themeResId);
this.mContext = context;
this.content = content;
}
public CommomDialog(Context context, int themeResId, String content, OnCloseListener listener) {
super(context, themeResId);
this.mContext = context;
this.content = content;
this.listener = listener;
}
protected CommomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
this.mContext = context;
}
public CommomDialog setTitle(String title){
this.title = title;
return this;
}
public CommomDialog setPositiveButton(String name){
this.positiveName = name;
return this;
}
public CommomDialog setNegativeButton(String name){
this.negativeName = name;
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_commom);
setCanceledOnTouchOutside(false);
initView();
}
private void initView(){
contentTxt = (TextView)findViewById(R.id.content);
titleTxt = (TextView)findViewById(R.id.title);
submitTxt = (TextView)findViewById(R.id.submit);
submitTxt.setOnClickListener(this);
cancelTxt = (TextView)findViewById(R.id.cancel);
cancelTxt.setOnClickListener(this);
contentTxt.setText(content);
if(!TextUtils.isEmpty(positiveName)){
submitTxt.setText(positiveName);
}
if(!TextUtils.isEmpty(negativeName)){
cancelTxt.setText(negativeName);
}
if(!TextUtils.isEmpty(title)){
titleTxt.setText(title);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.cancel:
if(listener != null){
listener.onClick(this, false);
}
this.dismiss();
break;
case R.id.submit:
if(listener != null){
listener.onClick(this, true);
}
break;
}
}
public interface OnCloseListener{
void onClick(Dialog dialog, boolean confirm);
}
}
\ No newline at end of file
package com.toscl.turingos;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.Transformation;
public class MusicButton extends AppCompatImageView {
public static final int STATE_PLAYING =1;//正在播放
public static final int STATE_PAUSE =2;//暂停
public static final int STATE_STOP =3;//停止
public int state;
private float angle;//记录RotateAnimation中受插值器数值影响的角度
private float angle2;//主要用来记录暂停时停留的角度,即View初始旋转角度
private int viewWidth;
private int viewHeight;
private MusicAnim musicAnim;
public MusicButton(Context context) {
super(context);
init();
}
public MusicButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MusicButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
state = STATE_STOP;
angle = 0;
angle2 = 0;
viewWidth = 400;
viewHeight = 400;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
viewWidth = getMeasuredWidth();
viewHeight = getMeasuredHeight();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.rotate(angle2,viewWidth/2,viewHeight/2);
super.onDraw(canvas);
}
public class MusicAnim extends RotateAnimation {
public MusicAnim(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
super(fromDegrees, toDegrees, pivotX, pivotY);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
angle = interpolatedTime * 360;
}
}
public void playMusic(){
if(state == STATE_PLAYING){
angle2 = (angle2 + angle)%360;//可以取余也可以不取,看实际的需求
musicAnim.cancel();
state = STATE_PAUSE;
invalidate();
}else {
musicAnim = new MusicAnim(0,360,viewWidth/2,viewHeight/2);
musicAnim.setDuration(3000);
musicAnim.setInterpolator(new LinearInterpolator());//动画时间线性渐变
musicAnim.setRepeatCount(ObjectAnimator.INFINITE);
startAnimation(musicAnim);
state = STATE_PLAYING;
}
}
public void stopMusic(){
angle2 = 0;
clearAnimation();
state = STATE_STOP;
invalidate();
}
}
\ No newline at end of file
package com.toscl.turingos;
import android.app.Service;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.toscl.turingos.util.ContentBean;
import com.toscl.turingos.util.MusicHandler;
import com.toscl.turingos.util.TuringMusic;
import com.toscl.turingos.view.ScrollEditText;
import com.turing.asr.callback.InitialListener;
import com.turing.asr.engine.AsrManager;
import com.turing.authority.authentication.AuthenticationListener;
import com.turing.authority.authentication.SdkInitializer;
import com.turing.semantic.entity.Behavior;
import com.turing.tts.TTSInitListener;
import com.turing.tts.TTSManager;
import com.util.LogUtil;
public class TuringOsService extends Service {
private String TAG = "TuringOsService";
@Override
public IBinder onBind(Intent intent) {
return new TuringOsBinder();
}
public class TuringOsBinder extends Binder {
public TuringOsService getService(){
return TuringOsService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
initSDK();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
private void initSDK() {
ApplicationInfo appInfo = null;
try {
appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
String TURING_APPKEY = appInfo.metaData.getString("TURING_APPKEY");
String TURING_SECRET = appInfo.metaData.getString("TURING_SECRET");
SdkInitializer.init(this, TURING_APPKEY, TURING_SECRET, authenticationListener);
}
private AuthenticationListener authenticationListener = new AuthenticationListener() {
@Override
public void onSuccess() {
TTSManager.getInstance().init(getApplicationContext(), new TTSInitListener() {
@Override
public void onSuccess() {
TTSManager.getInstance().setEnhancerEnable(true);
LogUtil.e(TAG, "TTS init success");
}
@Override
public void onFailed(int i, String s) {
LogUtil.e(TAG, "TTS init failed errorCode=" + i + " errorMsg=" + s);
}
});
AsrManager.getInstance().init(getApplicationContext(), new InitialListener() {
@Override
public void onInitialSuccess() {
LogUtil.e(TAG, "ASR init success");
}
@Override
public void onInitialError(int errorCode, String asrErrorMessage) {
LogUtil.e(TAG, "ASR init failed errorCode=" + errorCode + " errorMsg=" + asrErrorMessage);
}
});
}
@Override
public void onError(final int errorCode, final String s) {
Log.e(TAG, "errorCode=" + errorCode + " errorMsg=" + s);
}
};
}
package com.toscl.turingos.util;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import java.util.List;
public class ApiResultCode {
private static String TAG = "ApiResultCode";
public static void callPhone(String phoneNum, Context context) {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + phoneNum);
intent.setData(data);
context.startActivity(intent);
}
public static void doStartApplicationWithPackageName(String packageName, Context context){
//通过包名获取此App详细信息
PackageInfo packageInfo =null;
try {
packageInfo = context.getPackageManager().getPackageInfo(packageName,0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if(packageInfo ==null){
return ;
}
//创建一个类别为CATRGORY_LAUNCHER的该包名的Intent
Intent resolveIntent =new Intent(Intent.ACTION_MAIN,null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageInfo.packageName);
//通过getPackageManager()的queryIntentActivitires方法去遍历
List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(resolveIntent,0);
for(ResolveInfo resolveInfo:resolveInfos){
if(resolveInfo!=null){
String pkgName =resolveInfo.activityInfo.name;
String className =resolveInfo.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
//设置CompoentName
ComponentName cn =new ComponentName(packageName,className);
intent.setComponent(cn);
context.startActivity(intent);
}
}
}
}
package com.toscl.turingos.util;
import android.content.Intent;
import android.graphics.drawable.Drawable;
public class AppInfo {
private String appLabel;
private Drawable appIcon;
private Intent intent;
private String pkgName;
public AppInfo() {
}
public String getAppLabel() {
return appLabel;
}
public void setAppLabel(String appName) {
this.appLabel = appName;
}
public Drawable getAppIcon() {
return appIcon;
}
public void setAppIcon(Drawable appIcon) {
this.appIcon = appIcon;
}
public Intent getIntent() {
return intent;
}
public void setIntent(Intent intent) {
this.intent = intent;
}
public String getPkgName() {
return pkgName;
}
public void setPkgName(String pkgName) {
this.pkgName = pkgName;
}
@Override
public String toString() {
return pkgName + ", label:" + appLabel;
}
}
package com.toscl.turingos.util;
import android.os.Parcel;
import android.os.Parcelable;
public class ContentBean implements Parcelable {
private String text;//文本
private int emotion = 1;//意图
private int code;//功能
private String viewFlag;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.text);
dest.writeInt(this.emotion);
dest.writeInt(this.code);
dest.writeString(this.viewFlag);
}
public ContentBean() {
}
protected ContentBean(Parcel in) {
this.text = in.readString();
this.emotion = in.readInt();
this.code = in.readInt();
this.viewFlag = in.readString();
}
public static final Creator<ContentBean> CREATOR = new Creator<ContentBean>() {
@Override
public ContentBean createFromParcel(Parcel source) {
return new ContentBean(source);
}
@Override
public ContentBean[] newArray(int size) {
return new ContentBean[size];
}
};
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getEmotion() {
return emotion;
}
public void setEmotion(int emotion) {
this.emotion = emotion;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getViewFlag() {
return viewFlag;
}
public void setViewFlag(String viewFlag) {
this.viewFlag = viewFlag;
}
@Override
public String toString() {
return "ContentBean{" +
"text='" + text + '\'' +
", emotion=" + emotion +
", code=" + code +
", viewFlag='" + viewFlag + '\'' +
'}';
}
}
package com.toscl.turingos.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class FunctionConstants {
public static HashMap<Integer, String> codeMap;
public static List<Integer> mediaCodeList;
public static List<Integer> musicCodeList;
public static final int STORY_CODE = 200201;
public static final int SONG_CODE = 200101;
public static final int ANIMA_CODE = 200301;
public static final int NATURE_CODE = 200302;
public static final int MUSICAL_CODE = 200303;
public static final int SHOUT_CODE = 404003;
/**
* 聊天的功能
**/
public final static int CHAT_FUNCTION = 100000;
static {
codeMap = new HashMap();
mediaCodeList = new ArrayList<>();
musicCodeList = new ArrayList<>();
codeMap.put(CHAT_FUNCTION, "互动聊天");
codeMap.put(200205, "知识问答-十万个为什么");
codeMap.put(201401, "知识问答-天气预报");
codeMap.put(200702, "知识问答-时间查询");
codeMap.put(201501, "知识问答-计算");
codeMap.put(200401, "诗词");
codeMap.put(201711, "英语学习-中英互译");
codeMap.put(ANIMA_CODE, "声音演示-动物叫声");
codeMap.put(MUSICAL_CODE, "声音演示-乐器的声音");
codeMap.put(NATURE_CODE, "声音演示-大自然的声音");
codeMap.put(STORY_CODE, "内容互动-故事点播、随机播放");
codeMap.put(201002, "播放切换、停止");
codeMap.put(900101, "设备操作-休眠设置");
codeMap.put(900110, "设备操作");
codeMap.put(300101, "运动控制");
codeMap.put(200501, "拍照");
codeMap.put(200701, "跳舞");
codeMap.put(200710, "闹钟");
codeMap.put(200802, "打电话");
codeMap.put(201601, "打开APP");
codeMap.put(SHOUT_CODE, "谁在叫");
codeMap.put(100102, "英文对话");
codeMap.put(200209, "维基百科");
codeMap.put(201204, "笑话");
codeMap.put(200211, "脑筋急转弯");
codeMap.put(200212, "顺口溜");
codeMap.put(200207, "绕口令");
codeMap.put(100302, "知识库/FAQ");
codeMap.put(SONG_CODE, "声音演示-唱歌");
mediaCodeList.add(ANIMA_CODE);
mediaCodeList.add(MUSICAL_CODE);
mediaCodeList.add(NATURE_CODE);
mediaCodeList.add(STORY_CODE);
mediaCodeList.add(SHOUT_CODE);
musicCodeList.add(SONG_CODE);
}
}
package com.toscl.turingos.util;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import com.toscl.turingos.R;
import com.turing.music.LogUtil;
import com.turing.music.MusicManager;
import com.turing.music.OnPlayerStateListener;
import com.turing.music.OnSearchListener;
import com.turing.music.bean.MusicEntity;
import com.turing.tts.TTSManager;
import java.util.List;
public class MusicHandler extends Handler {
private static final String TAG = MusicHandler.class.getSimpleName();
public OnPlayerStateListener mOnMiGuPlayStateListener = null;
public Context context;
public static final int MSG_PREPARE_MIGU = 1;
public static final int MSG_PREPARE_TURING = 2;
public static final int MSG_TTS_FINISH = 3;
public static final int MSG_MIGU_PREPARED = 4;
public static final int MSG_TURING_PREPARED = 5;
//TimeOut
public static final int MSG_MIGU_TIMEOUT = 16;
public static final int MSG_TURING_TIMEOUT = 17;
//delay time
public static final int TIME_MIGU_DELAY = 3000;
public static final int TIME_TURING_DELAY = 3000;
//migu search
public static final int MSG_MIGU_SEARCH = 50;
//prepare failed
public static final int MSG_MIGU_PREPARE_FAILED = 70;
public static final int MSG_TURING_PREPARE_FAILED = 71;
private MusicEntity musicEntity;
private String keyword;
private String url;
private boolean isTTSFinished = true;
private boolean isMiguPrepared = false;
private boolean isTuringPrepared = false;
private boolean isAllPrepareFailed = false;
public TuringMusic.MusicStateListener mOnTuringPlayStateListener;
/**
* -> finish play
* <p>
* ->success -> checkTTSFinish
* -> not finish isPrepared
* <p>
* TTS Begin -> migu search -> migu prepare
* <p>
* ->finish play
* -> success cancalTimeOut
* ->not finish isPrepared
* <p>
* onFailed -> Turing Prepare -> checkTimeOut -> checkTTSFinish
* <p>
* <p>
* -> onFailed checkTimeOut
*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_MIGU_SEARCH:
LogUtil.d(TAG, "MSG_MIGU_SEARCH");
Bundle data = msg.getData();
keyword = data.getString("name");
url = data.getString("url");
miguSearch(keyword);
isTTSFinished = false;
isMiguPrepared = false;
isTuringPrepared = false;
isAllPrepareFailed = false;
musicEntity = null;
break;
case MSG_PREPARE_MIGU:
LogUtil.d(TAG, "MSG_PREPARE_MIGU");
miguPrepare();
break;
case MSG_PREPARE_TURING:
isTTSFinished = false;
isTuringPrepared = false;
isAllPrepareFailed = false;
LogUtil.d(TAG, "MSG_PREPARE_TURING");
data = msg.getData();
url = data.getString("url");
turingPrepare(url);
break;
case MSG_TTS_FINISH:
LogUtil.d(TAG, "MSG_TTS_FINISH");
isTTSFinished = true;
if (musicEntity != null && isMiguPrepared) {
//调用咪咕音乐播放
MusicManager.getInstance().setOnPlayStateListener(mOnMiGuPlayStateListener);
MusicManager.getInstance().play(musicEntity);
return;
}
if (isTuringPrepared) {
TuringMusic.getInstance().play();
return;
}
//两种都prepared失败
if (isAllPrepareFailed) {
musicTimeout();
}
break;
case MSG_MIGU_PREPARED:
LogUtil.d(TAG, "MSG_MIGU_PREPARED");
isMiguPrepared = true;
if (isTTSFinished) {
MusicManager.getInstance().play(musicEntity);
}
break;
case MSG_TURING_PREPARED:
LogUtil.d(TAG, "MSG_TURING_PREPARED");
LogUtil.d(TAG, "isTTSFinished =" + isTTSFinished);
isTuringPrepared = true;
if (isTTSFinished) {
TuringMusic.getInstance().play();
}
break;
case MSG_MIGU_TIMEOUT:
LogUtil.d(TAG, "MSG_MIGU_TIMEOUT");
MusicManager.getInstance().setOnPlayStateListener(null);
break;
case MSG_TURING_TIMEOUT:
LogUtil.d(TAG, "MSG_TURING_TIMEOUT");
break;
case MSG_MIGU_PREPARE_FAILED:
LogUtil.d(TAG, "MSG_MIGU_PREPARE_FAILED");
LogUtil.d(TAG, "URL = " + url);
turingPrepare(url);
break;
case MSG_TURING_PREPARE_FAILED:
TuringMusic.getInstance().reset();
LogUtil.d(TAG, "MSG_TURING_PREPARE_FAILED");
//错误处理
if (isTTSFinished) {
musicTimeout();
}
isAllPrepareFailed = true;
break;
default:
break;
}
}
private void musicTimeout() {
TTSManager.getInstance().startTTS(context.getString(R.string.network_error), null);
}
public void miguSearch(String keyWord) {
MusicManager.getInstance().search(keyWord, new OnSearchListener() {
@Override
public void onSuccess(List<MusicEntity> list) {
if (list == null || list.size() == 0) {
sendEmptyMessage(MSG_MIGU_PREPARE_FAILED);
return;
}
musicEntity = list.get(0);
sendEmptyMessage(MSG_MIGU_PREPARED);
}
@Override
public void onFailed(int i, String s) {
sendEmptyMessage(MSG_MIGU_PREPARE_FAILED);
}
});
}
public void miguPrepare() {
if (musicEntity == null) {
sendEmptyMessage(MSG_MIGU_PREPARE_FAILED);
return;
}
sendEmptyMessageDelayed(MSG_MIGU_TIMEOUT, TIME_MIGU_DELAY);
MusicManager.getInstance().setOnPlayStateListener(new OnPlayerStateListener() {
@Override
public void onStart() {
removeMessages(MSG_MIGU_TIMEOUT);
if (!isTTSFinished) {
MusicManager.getInstance().pause();
sendEmptyMessage(MSG_MIGU_PREPARED);
}
}
@Override
public void onComplete() {
}
@Override
public void onError(int i, String s) {
removeMessages(MSG_MIGU_TIMEOUT);
sendEmptyMessage(MSG_MIGU_PREPARE_FAILED);
}
@Override
public void onBufferingUpdate(int i) {
}
});
MusicManager.getInstance().play(musicEntity);
}
public void turingPrepare(String url) {
LogUtil.d(TAG, "turingPrepare");
if (TextUtils.isEmpty(url)) {
sendEmptyMessage(MSG_TURING_PREPARE_FAILED);
return;
}
TuringMusic.getInstance().setMusicStateListener(mOnTuringPlayStateListener);
TuringMusic.getInstance().prepare(url, new TuringMusic.PrepareListener() {
@Override
public void onSuccess() {
LogUtil.d(TAG, "turingPrepare onSuccess");
sendEmptyMessage(MSG_TURING_PREPARED);
}
@Override
public void onFailed() {
LogUtil.d(TAG, "turingPrepare onFailed");
sendEmptyMessage(MSG_TURING_PREPARE_FAILED);
}
});
}
}
package com.toscl.turingos.util;
import com.google.gson.Gson;
import com.turing.semantic.entity.Behavior;
import com.turing.semantic.entity.Behaviors;
import com.turing.semantic.entity.UploadDeviceInfoResponse;
public class OSDataTransformUtil {
private final static String TAG = OSDataTransformUtil.class.getSimpleName();
public static Behavior getBehavior(String json) {
Gson gson = new Gson();
Behaviors behaviors = null;
behaviors = gson.fromJson(json, Behaviors.class);
Behavior mData = behaviors.getBehaviors().get(0);
return mData;
}
/**
* 获得intent
*
* @param json json
* @return OSIntentBean
**/
public static Behavior.IntentInfo getIntent(String json) {
Behavior.IntentInfo intentInfo = null;
Behavior behavior = getBehavior(json);
intentInfo = behavior.getIntent();
return intentInfo;
}
/**
* 获得result的结果
*
* @param json string
* @return OSResultsBean
**/
public static Behavior.ResponseResult getResultBean(String json) {
Behavior.ResponseResult responseResult = null;
try {
Behavior behavior = getBehavior(json);
if (behavior != null && behavior.getResults() != null && !behavior.getResults().isEmpty()) {
responseResult = behavior.getResults().get(0);
}
} catch (Exception e) {
}
return responseResult;
}
/**
* 获得emotion的结果
*
* @param json json
* @return OsEmotion
**/
public static Behavior.Emotion getOsEmtion(String json) {
Behavior.Emotion emotion = null;
try {
Behavior behavior = getBehavior(json);
emotion = behavior.getEmotion();
} catch (Exception e) {
}
return emotion;
}
/**
* 获取上传通讯录与APP列表的结果
*
* @param json
* @return
*/
public static UploadDeviceInfoResponse getUploadDeviceInfoResponse(String json) {
Gson gson = new Gson();
UploadDeviceInfoResponse uploadDeviceInfoResponse = null;
uploadDeviceInfoResponse = gson.fromJson(json, UploadDeviceInfoResponse.class);
return uploadDeviceInfoResponse;
}
}
package com.toscl.turingos.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import java.util.Set;
public class PreferencesUtil {
private static PreferencesUtil sDevicePreferences;
private final SharedPreferences mSharePferences;
private final SharedPreferences.Editor mEditor;
private final String TAG = "PreferencesUtil";
private final boolean DEBUG = true;
private PreferencesUtil(Context context) {
mSharePferences = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
mEditor = mSharePferences.edit();
}
public static synchronized PreferencesUtil getInstance(Context context) {
if (null == sDevicePreferences) {
sDevicePreferences = new PreferencesUtil(context.getApplicationContext());
}
return sDevicePreferences;
}
public void putInt(final String key, final int value) {
if (DEBUG) {
Log.d(TAG, "putInt key:" + key + ", value: " + value);
}
mEditor.putInt(key, value);
mEditor.commit();
}
public void putLong(final String key, final long value) {
mEditor.putLong(key, value);
mEditor.commit();
}
public void putString(final String key, final String value) {
if (DEBUG) {
Log.d(TAG, "putString key:" + key + ", value: " + value);
}
mEditor.putString(key, value);
mEditor.commit();
}
public void putFloat(final String key, final float value) {
mEditor.putFloat(key, value);
mEditor.commit();
}
public void putBoolean(final String key, final boolean value) {
if (DEBUG) {
Log.d(TAG, "putBoolean key:" + key + ", value: " + value);
}
mEditor.putBoolean(key, value);
mEditor.commit();
}
public void putStringSet(final String key, final Set<String> values) {
mEditor.putStringSet(key, values);
mEditor.commit();
}
public int getInt(final String key, final int defaultValue) {
int value = mSharePferences.getInt(key, defaultValue);
if (DEBUG) {
Log.d(TAG, "getInt key:" + key + ", defaultValue: " + defaultValue + ", value: " + value);
}
return value;
}
public long getLong(final String key, final long defaultValue) {
return mSharePferences.getLong(key, defaultValue);
}
public String getString(final String key, final String defaultValue) {
String value = mSharePferences.getString(key, defaultValue);
if (DEBUG) {
Log.d(TAG, "getString key:" + key + ", defaultValue: " + defaultValue + ", value: " + value);
}
return value;
}
public float getFloat(final String key, final float defaultValue) {
return mSharePferences.getFloat(key, defaultValue);
}
public boolean getBoolean(final String key, final boolean defaultValue) {
boolean value = mSharePferences.getBoolean(key, defaultValue);
if (DEBUG){
Log.d(TAG, "getBoolean key:" + key + ", defaultValue: " + defaultValue + ", value: " + value);
}
return value;
}
public Set<String> getStringSet(final String key) {
return mSharePferences.getStringSet(key, null);
}
}
package com.toscl.turingos.util;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SkillsSlotUtil {
private static String TAG = "SkillsSlotUtil";
public static Map<String, String> getContacts(Context context) {
//联系人的Uri,也就是content://com.android.contacts/contacts
Uri uri = ContactsContract.Contacts.CONTENT_URI;
//指定获取_id和display_name两列数据,display_name即为姓名
String[] projection = new String[]{
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
//根据Uri查询相应的ContentProvider,cursor为获取到的数据集
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
String[] arr = new String[cursor.getCount()];
Map<String, String> contactMap = new HashMap<>();
int i = 0;
if (cursor != null && cursor.moveToFirst()) {
do {
Long id = cursor.getLong(0);
//获取姓名
String name = cursor.getString(1);
//指定获取NUMBER这一列数据
String[] phoneProjection = new String[]{
ContactsContract.CommonDataKinds.Phone.NUMBER
};
arr[i] = id + " , 姓名:" + name;
//根据联系人的ID获取此人的电话号码
Cursor phonesCusor = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
phoneProjection,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
null,
null);
String num = "";
//因为每个联系人可能有多个电话号码,所以需要遍历
if (phonesCusor != null && phonesCusor.moveToFirst()) {
do {
num = phonesCusor.getString(0);
arr[i] += " , 电话号码:" + num;
} while (phonesCusor.moveToNext());
}
contactMap.put(name, num);
Log.d(TAG, "contact - arr[i]:" + arr[i]);
i++;
} while (cursor.moveToNext());
}
return contactMap;
}
// 获得所有启动Activity的信息,类似于Launch界面
public void queryAppInfo(Context context) {
PackageManager pm = context.getPackageManager(); // 获得PackageManager对象
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通过查询,获得所有ResolveInfo对象.
List<ResolveInfo> resolveInfos = pm
.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);
// 调用系统排序 , 根据name排序
// 该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序
Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(pm));
// if (mlistAppInfo != null) {
// mlistAppInfo.clear();
for (ResolveInfo reInfo : resolveInfos) {
String activityName = reInfo.activityInfo.name; // 获得该应用程序的启动Activity的name
String pkgName = reInfo.activityInfo.packageName; // 获得应用程序的包名
String appLabel = (String) reInfo.loadLabel(pm); // 获得应用程序的Label
Drawable icon = reInfo.loadIcon(pm); // 获得应用程序图标
// 为应用程序的启动Activity 准备Intent
Intent launchIntent = new Intent();
launchIntent.setComponent(new ComponentName(pkgName,
activityName));
// 创建一个AppInfo对象,并赋值
AppInfo appInfo = new AppInfo();
appInfo.setAppLabel(appLabel);
appInfo.setPkgName(pkgName);
appInfo.setAppIcon(icon);
appInfo.setIntent(launchIntent);
// mlistAppInfo.add(appInfo); // 添加至列表中
Log.i("cx", appLabel + " activityName---" + activityName
+ " pkgName---" + pkgName);
}
// }
}
public static Map<String, String> queryFilterAppInfo(Context context) {
PackageManager pm = context.getPackageManager();
Map<String, String> appMap = new HashMap<>();
List<ApplicationInfo> list = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(list, new ApplicationInfo.DisplayNameComparator(pm)); //排序
List<AppInfo> appInfos = new ArrayList<>();// 保存过滤查到的结果
for (ApplicationInfo app : list) {
Log.d(TAG, "" + getAppInfo(app, context));
appMap.put(getAppInfo(app, context).getAppLabel(), getAppInfo(app, context).getPkgName());
appInfos.add(getAppInfo(app, context));
}
//mlistAppInfo = appInfos;
return appMap;
}
// 构造一个AppInfo对象,并赋值
private static AppInfo getAppInfo(ApplicationInfo app, Context context) {
AppInfo appInfo = new AppInfo();
PackageManager pm = context.getPackageManager();
appInfo.setAppLabel((String) app.loadLabel(pm));
appInfo.setAppIcon(app.loadIcon(pm));
appInfo.setPkgName(app.packageName);
return appInfo;
}
private void doStartApplicationWithPackageName(String packageName, Context context) {
//通过包名获取此App详细信息
PackageInfo packageInfo = null;
try {
packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (packageInfo == null) {
return;
}
//创建一个类别为CATRGORY_LAUNCHER的该包名的Intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageInfo.packageName);
//通过getPackageManager()的queryIntentActivitires方法去遍历
List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(resolveIntent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
if (resolveInfo != null) {
String pkgName = resolveInfo.activityInfo.name;
String className = resolveInfo.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
//设置CompoentName
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
context.startActivity(intent);
}
}
}
}
package com.toscl.turingos.util;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import com.turing.music.LogUtil;
import java.io.IOException;
public class TuringMusic {
private static final String TAG = TuringMusic.class.getSimpleName();
private static TuringMusic mTuringMusic = new TuringMusic();
private MediaPlayer mMediaPlayer = new MediaPlayer();
private boolean isPrepared = false;
private MusicStateListener mMusicStateListener;
private PrepareListener mMusicPrepareListener;
private static final int MSG_PREPARE_FAILED = 1;
private static final int DELAY_PREPARE_FAILED = 6000;
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_PREPARE_FAILED:
mMediaPlayer.reset();
if (mMusicPrepareListener != null) {
mMusicPrepareListener.onFailed();
}
break;
default:
break;
}
}
};
public boolean isPrepared() {
return isPrepared;
}
public MusicStateListener getMusicStateListener() {
return mMusicStateListener;
}
public void setMusicStateListener(MusicStateListener mMusicStateListener) {
this.mMusicStateListener = mMusicStateListener;
}
private TuringMusic() {
}
public static TuringMusic getInstance() {
return mTuringMusic;
}
private MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "onPrepared");
handler.removeMessages(MSG_PREPARE_FAILED);
isPrepared = true;
if (mMusicPrepareListener != null) {
mMusicPrepareListener.onSuccess();
}
}
};
private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d(TAG, "onError = " + what);
if (mMusicStateListener != null) {
mMusicStateListener.onError(what);
}
return false;
}
};
public void play() {
mMediaPlayer.start();
if (mMusicStateListener != null) {
mMusicStateListener.onStart();
}
}
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
public void pause(){
mMediaPlayer.pause();
if (mMusicStateListener != null) {
mMusicStateListener.onPause();
}
}
public void stop() {
mMediaPlayer.stop();
if (mMusicStateListener != null) {
mMusicStateListener.onStop();
}
}
private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d(TAG, "onCompletion listener = " + mMusicStateListener);
if (mMusicStateListener != null) {
mMusicStateListener.onComplete();
}
}
};
public void prepare(String url, PrepareListener prepareListener) {
this.mMusicPrepareListener = prepareListener;
mMediaPlayer.reset();
mMediaPlayer.setOnErrorListener(mOnErrorListener);
mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
try {
mMediaPlayer.setDataSource(url);
LogUtil.d(TAG, "set datasource");
} catch (IOException e1) {
LogUtil.d(TAG, "set datasource failed");
e1.printStackTrace();
}
mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
mMediaPlayer.prepareAsync();
LogUtil.d(TAG, "prepareAsync");
handler.sendEmptyMessageDelayed(MSG_PREPARE_FAILED, DELAY_PREPARE_FAILED);
}
public void reset() {
isPrepared = false;
mMediaPlayer.reset();
}
public interface MusicStateListener {
void onPause();
void onStart();
void onStop();
void onComplete();
void onError(int errorCode);
}
public interface PrepareListener {
void onSuccess();
void onFailed();
}
}
package com.toscl.turingos.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Checkable;
import com.toscl.turingos.R;
/**
* Created by DuanJiaNing on 2017/6/15.
* 【播放】
* 【暂停】
* 控件由如下几部分组成:
* 1 暂停状态下的三角形,直接继承自 SkipView
* 2 播放状态下的双竖线
*/
public class PlayView extends SkipView implements Checkable {
//true 表示正在播放,此时应显示双竖线(暂停)
private boolean isPlaying = false;
//双竖线间距
private int pauseLineDistance;
//一条竖线的宽度
private int pauseLineWidth;
//竖线的高度(两条竖线的外观时完全一样的)
private int pauseLineHeight;
//双竖线圆角
private int pauseLineRadius;
//双竖线颜色
private int pauseLineColor;
//双竖线是否空心,此时可通过 pauseLineStroke 指定描边宽度
private boolean pauseLineHollow;
private int pauseLineStroke;
public interface OnCheckedChangeListener {
/**
* 选中状态改变时回调
*/
void onCheckedChanged(PlayView view, boolean checked);
}
private OnCheckedChangeListener checkedChangeListener;
public void setOnCheckedChangeListener(OnCheckedChangeListener l) {
if (l != null)
this.checkedChangeListener = l;
}
public PlayView(Context context) {
super(context);
}
public PlayView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public PlayView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PlayView, defStyleAttr, 0);
pauseLineDistance = array.getDimensionPixelSize(R.styleable.PlayView_pauseLineDistance, 0);
pauseLineWidth = array.getDimensionPixelSize(R.styleable.PlayView_pauseLineWidth, 0);
pauseLineHeight = array.getDimensionPixelSize(R.styleable.PlayView_pauseLineHeight, 951228);
pauseLineRadius = array.getDimensionPixelSize(R.styleable.PlayView_pauseLineRadius, triangleRadius);
pauseLineColor = array.getColor(R.styleable.PlayView_pauseLineColor, solidColor);
pauseLineHollow = array.getBoolean(R.styleable.PlayView_pauseLineHollow, false);
isPlaying = array.getBoolean(R.styleable.PlayView_checked, false);
pauseLineStroke = array.getDimensionPixelSize(R.styleable.PlayView_pauseLineStroke, strokeWidth);
//设置为 0 ,两条竖线间距和高宽转由 pauseLineDistance , pauseLineWidth 和 pauseLineHeight 控制
distance = 0;
innerLineWidth = 0;
innerLineHeight = 0;
array.recycle();
//
// if (pauseLineHeight <= 0)
// pauseLineHeight = radius * 3 / 4;
//
// if (pauseLineWidth <= 0)
// pauseLineWidth = radius / 10;
//
// if (pauseLineDistance <= 0)
// pauseLineDistance = radius * 2 / 5;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (pauseLineHeight <= 0)
pauseLineHeight = radius * 3 / 4;
else if (pauseLineHeight == 951228)
pauseLineHeight = triangleHeight;
if (pauseLineWidth <= 0)
pauseLineWidth = radius / 10;
if (pauseLineDistance <= 0)
pauseLineDistance = radius * 2 / 5;
//赋值不合理,进行重置(这不是此控件预期的展现形式,应根据整体比例合理赋值)
//只对上限进行处理
if (pauseLineHeight > radius * 2)
pauseLineHeight = radius * 2;
if (pauseLineWidth > radius)
pauseLineWidth = radius;
if (pauseLineDistance > radius * 2)
pauseLineDistance = radius * 2;
}
@Override
public void drawInside(Canvas canvas) {
if (isPlaying) {
drawLine(canvas);
} else {
super.drawTriangle(canvas);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
int ex = (int) event.getX();
int ey = (int) event.getY();
if (ex >= 0 && ey >= 0 && ex <= getWidth() && ey <= getHeight()) {
toggle();
}
}
return super.onTouchEvent(event);
}
@Override
protected void drawLine(Canvas canvas) {
if (pauseLineHollow) {
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(pauseLineStroke);
} else
paint.setStyle(Paint.Style.FILL);
paint.setColor(pauseLineColor);
//绘制双竖线
float left = mCenterX - pauseLineDistance / 2 - pauseLineWidth;
float top = mCenterY - pauseLineHeight / 2;
float right = left + pauseLineWidth;
float bottom = top + pauseLineHeight;
RectF rectF = new RectF(left, top, right, bottom);
canvas.drawRoundRect(rectF, pauseLineRadius, pauseLineRadius, paint);
float l = right + pauseLineDistance;
float t = top;
float r = l + pauseLineWidth;
float b = bottom;
RectF rf = new RectF(l, t, r, b);
canvas.drawRoundRect(rf, pauseLineRadius, pauseLineRadius, paint);
}
@Override
public void setChecked(boolean checked) {
setPlayStatus(checked);
}
@Override
public boolean isChecked() {
return isPlaying;
}
//反转状态
@Override
public void toggle() {
isPlaying = !isPlaying;
if (checkedChangeListener != null)
checkedChangeListener.onCheckedChanged(this, isPlaying);
invalidate();
}
public boolean isPlaying() {
return isPlaying;
}
public void setPlayStatus(boolean playStatus) {
this.isPlaying = playStatus;
invalidate();
}
public int getPauseLineDistance() {
return pauseLineDistance;
}
public int getPauseLineWidth() {
return pauseLineWidth;
}
public int getPauseLineHeight() {
return pauseLineHeight;
}
public int getPauseLineRadius() {
return pauseLineRadius;
}
public int getPauseLineColor() {
return pauseLineColor;
}
public boolean isPauseLineHollow() {
return pauseLineHollow;
}
public int getPauseLineStroke() {
return pauseLineStroke;
}
public void setPauseLineDistance(int pauseLineDistance) {
this.pauseLineDistance = pauseLineDistance;
invalidate();
}
public void setPauseLineWidth(int pauseLineWidth) {
this.pauseLineWidth = pauseLineWidth;
invalidate();
}
public void setPauseLineHeight(int pauseLineHeight) {
this.pauseLineHeight = pauseLineHeight;
invalidate();
}
public void setPauseLineRadius(int pauseLineRadius) {
this.pauseLineRadius = pauseLineRadius;
invalidate();
}
public void setPauseLineColor(int pauseLineColor) {
this.pauseLineColor = pauseLineColor;
invalidate();
}
public void setPauseLineHollow(boolean pauseLineHollow) {
this.pauseLineHollow = pauseLineHollow;
invalidate();
}
public void setPauseLineStroke(int pauseLineStroke) {
this.pauseLineStroke = pauseLineStroke;
invalidate();
}
}
package com.toscl.turingos.view;
import android.content.Context;
import android.text.Layout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
/**
* Created by Javine on 2016/8/26 0026.
* 支持EditText中内容上下滑动,解决与ScrollView滑动冲突的问题
*/
public class ScrollEditText extends android.support.v7.widget.AppCompatEditText {
private final int MOVE_SLOP = 20; //移动距离临界
//滑动距离的最大边界
private int mOffsetHeight;
//是否到顶或者到底的标志
private boolean mBottomFlag = false;
private boolean isCanScroll = false;//标记内容是否触发了滚动
private float lastY = 0;
public ScrollEditText(Context context) {
this(context,null);
}
public ScrollEditText(Context context, AttributeSet attrs) {
super(context,attrs);
}
public ScrollEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int paddingTop;
int paddingBottom;
int mHeight;
int mLayoutHeight;
//获得内容面板
Layout mLayout = getLayout();
mLayoutHeight = mLayout.getHeight();
paddingTop = getTotalPaddingTop();
paddingBottom = getTotalPaddingBottom();
//获得控件的实际高度
mHeight = getHeight();
//计算滑动距离的边界(H_content - H_view = H_scroll)
mOffsetHeight = mLayoutHeight + paddingTop + paddingBottom - mHeight;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
//手指按下事件,重置状态
mBottomFlag = false;
isCanScroll = false;
lastY=0;
}
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = super.onTouchEvent(event);
//如果是需要拦截,则再拦截,这个方法会在onScrollChanged方法之后再调用一次
if (!mBottomFlag)
getParent().requestDisallowInterceptTouchEvent(true);
if (event.getAction() == MotionEvent.ACTION_MOVE){
if (lastY == 0){
lastY = event.getRawY();
}
//条件:手指move了一段距离,但是onScrollChanged函数未调用,说明文字无法滚动了,则将触摸处理权交还给ParentView
if (Math.abs(lastY - event.getRawY()) > MOVE_SLOP){
if (!isCanScroll){
getParent().requestDisallowInterceptTouchEvent(false);
}
}
}
return result;
}
@Override
protected void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) {
super.onScrollChanged(horiz, vert, oldHoriz, oldVert);
isCanScroll = true;
Log.d("Javine","onScrolled "+vert + "offset:" + mOffsetHeight);
if (vert == mOffsetHeight || vert == 0) {
//这里将处理权交还给父控件
getParent().requestDisallowInterceptTouchEvent(false);
mBottomFlag = true;
}else{
mBottomFlag = false;
}
}
public boolean ismBottomFlag(){
return mBottomFlag;
}
}
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>
<?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="@mipmap/voice_empty"
android:duration="350">
</item>
<item
android:drawable="@mipmap/voice_full"
android:duration="350">
</item>
</animation-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:bottomLeftRadius="8dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:bottomRightRadius="8dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:radius="8dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_record_gray" android:state_pressed="true"/>
<item android:drawable="@mipmap/ic_record_blue" android:state_focused="true"/>
<item android:drawable="@mipmap/ic_record_gray"/>
</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_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#358BC4"/>
<corners android:radius="5dp"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<solid android:color="#358BC4"/>
<corners android:radius="5dp"/>
</shape>
</item>
</selector>
\ No newline at end of file
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
<!-- The background color, preferably the same as your normal theme -->
<item android:drawable="@android:color/white"/>
<!-- Your product logo - 144dp color version of your app icon -->
<item>
<bitmap
android:src="@mipmap/main_item_icon_robot"
android:gravity="center"/>
</item>
</layer-list>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#880E0E0E"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text=""
android:textSize="10sp" />
</RelativeLayout>
<com.toscl.turingos.view.ScrollEditText
android:id="@+id/iat_text"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="top|left"
android:focusable="false"
android:hint=""
android:paddingBottom="10dp"
android:textSize="20sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:layout_marginTop="10dp"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<Button
android:clickable="true"
android:id="@+id/iat_recognize"
android:layout_width="45dp"
android:layout_height="49dp"
android:layout_weight="1"
android:background="@drawable/selector_record_bg"
android:focusable="true"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:gravity="center"
android:id="@+id/ai_music"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/music_background">
<com.toscl.turingos.view.PlayView
android:layout_width="wrap_content"
android:id="@+id/playview"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_rowWeight="1"
android:onClick="play"
android:padding="10dp"
android:rotation="180"
android:clickable="true"
android:focusable="true"
app:checked="true"
app:pauseLineColor="@color/colorAccent"
app:pauseLineDistance="18dp"
app:pauseLineHeight="45dp"
app:pauseLineWidth="8dp"
app:radius="50dp"
app:solidColor="@color/colorAccent"
app:triangleColor="@color/colorAccent"
app:triangleHeight="40dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/ai_bg"
android:clickable="true"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black_hint">
</RelativeLayout>
<RelativeLayout
android:id="@+id/ai_wrapper"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center"
android:layout_width="match_parent"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:paddingTop="10dp"
android:paddingBottom="20dp"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/ai"
android:textSize="23sp"
android:text="倾听中"/>
<ImageView
android:id="@+id/ai_pic"
android:layout_width="wrap_content"
android:layout_height="80sp"
android:src="@drawable/anim_record"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="16sp"
android:text="百合机器人为你服务"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:voiceView="http://schemas.android.com/apk/res-auto"
android:background="@mipmap/voice_bg"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="12dp"
android:layout_marginTop="12dp"
android:text="提示"
android:textSize="16sp"
android:visibility="gone"
android:textColor="@color/black"/>
<TextView
android:id="@+id/content"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:lineSpacingExtra="3dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="20dp"
android:layout_marginRight="40dp"
android:layout_marginBottom="30dp"
android:text="签到成功,获得200积分"
android:textSize="12sp"
android:textColor="@color/font_common_1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:visibility="gone"
android:orientation="horizontal">
<TextView
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_dialog_left_white"
android:layout_weight="1.0"
android:gravity="center"
android:text="取消"
android:textSize="12sp"
android:textColor="@color/font_common_2"/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/commom_background"/>
<TextView
android:id="@+id/submit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_dialog_right_white"
android:gravity="center"
android:layout_weight="1.0"
android:text="确定"
android:textSize="12sp"
android:textColor="@color/font_blue"/>
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--圆的半径。长宽任一者指定具体长度时,该值失效,将自动计算出-->
<attr name="radius" format="dimension" />
<!-- 阴影的半径-->
<attr name="shadowRadius" format="dimension" />
<!-- 空心时描边的宽度-->
<attr name="strokeWidth" format="dimension" />
<!--填充颜色-->
<attr name="solidColor" format="color" />
<!--背景圆是否空心-->
<attr name="hollow" format="boolean" />
<declare-styleable name="MediaView">
<attr name="radius" />
<attr name="shadowRadius" />
<attr name="strokeWidth" />
<attr name="solidColor" />
<attr name="hollow" />
</declare-styleable>
<!-- 内三角的颜色-->
<attr name="triangleColor" format="color" />
<!-- 内部竖线的宽度-->
<attr name="innerLineWidth" format="dimension" />
<!--内部竖线的高度,不赋值或赋值为 0 让控件自己计算-->
<attr name="innerLineHeight" format="dimension" />
<!-- 内部竖线的圆角大小-->
<attr name="innerLineRadius" format="dimension" />
<!--竖线与三角形间距-->
<attr name="distance" format="dimension" />
<!--内部三角形的圆角大小-->
<attr name="triangleRadius" format="dimension" />
<!--内部的三角形是否空心-->
<attr name="triangleHollow" format="boolean" />
<!-- 内部三角形空心时的描边宽度-->
<attr name="triangleStroke" format="dimension" />
<!-- 三角形与 y 轴平行边的长度,不赋值或赋值为 0 让控件自己计算-->
<attr name="triangleHeight" format="dimension" />
<!-- 三角形与 x 轴平行过左边顶点的线段长度,不赋值或赋值为 0 让控件自己计算(以等边三角形计算)-->
<attr name="triangleWidth" format="dimension" />
<declare-styleable name="SkipView">
<attr name="distance" />
<attr name="innerLineRadius" />
<attr name="innerLineWidth" />
<attr name="innerLineHeight" />
<attr name="triangleRadius" />
<attr name="triangleColor" />
<attr name="triangleHeight" />
<attr name="triangleHollow" />
<attr name="triangleStroke" />
<attr name="triangleWidth" />
</declare-styleable>
<!--暂停时两条竖线的间距-->
<attr name="pauseLineDistance" format="dimension" />
<!--暂停时竖线的宽度-->
<attr name="pauseLineWidth" format="dimension" />
<!--暂停时竖线的高度-->
<attr name="pauseLineHeight" format="dimension" />
<!-- 暂停线的圆角大小-->
<attr name="pauseLineRadius" format="dimension" />
<!--暂停线的颜色-->
<attr name="pauseLineColor" format="color" />
<!--暂停线是否空心(描边)-->
<attr name="pauseLineHollow" format="boolean" />
<!--暂停线空心时描边宽度-->
<attr name="pauseLineStroke" format="dimension" />
<!--是否选中(播放状态)true为正在播放,此时显示可暂停状态-->
<attr name="checked" format="boolean" />
<declare-styleable name="PlayView">
<attr name="pauseLineDistance" />
<attr name="pauseLineWidth" />
<attr name="pauseLineHeight" />
<attr name="pauseLineRadius" />
<attr name="pauseLineColor" />
<attr name="pauseLineHollow" />
<attr name="pauseLineStroke" />
<attr name="checked" />
</declare-styleable>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="white">#FFFFFF</color>
<color name="ai">#1A7AB5</color>
<color name="black">#000000</color>
<color name="black_hint">#ac060606</color>
<color name="font_common_1">#424242</color>
<color name="font_common_2">#a1a1a1</color>
<color name="font_blue">#42369a</color>
<color name="font_green">#00cccc</color>
<color name="commom_background">#f3f3f3</color>
<color name="music_background">#00131010</color>
<color name="color_1">#ab003a</color>
<color name="color_2">#f5b811</color>
<color name="color_3">#097ce1</color>
<color name="color_4">#df2a0a</color>
<color name="color_5">#6e2dfc</color>
</resources>
<resources>
<string name="app_name">小M</string>
<string name="turing_appkey">19693c9351fb41c9bb7b5b2695fd890b</string>
<string name="turing_secret">goV639J27FRW8Y9F</string>
<string name="network_error">网络慢.缓冲失败</string>
</resources>
<resources>
<!--
&lt;!&ndash; Base application theme. &ndash;&gt;
<style name="AppTheme" parent="@android:style/Theme.Translucent">
&lt;!&ndash; Customize your theme here. &ndash;&gt;
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>-->
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.Launcher">
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@color/float_transparent</item>
</style>
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!--边框-->
<item name="android:windowIsFloating">true</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsTranslucent">false</item>
<!--半透明-->
<item name="android:windowNoTitle">true</item>
<!--无标题-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--背景透明-->
<item name="android:backgroundDimEnabled">true</item>
<!--模糊-->
</style>
</resources>
package com.toscl.turingos;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.android.library'
version = VERSION_NAME
group = GROUP
android {
compileSdkVersion 25
buildToolsVersion '28'
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation 'com.pnikosis:materialish-progress:1.0'
}
//apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'
\ No newline at end of file
/**
* Automatically generated file. DO NOT MODIFY
*/
package cn.pedant.SweetAlert;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "cn.pedant.SweetAlert";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 2;
public static final String VERSION_NAME = "1.1";
}
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* gradle plugin from the resource data it found. It
* should not be modified by hand.
*/
package android.support.v4;
public final class R {
}
No preview for this file type
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
No preview for this file type
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!