Commit b13432ea by 罗翻

去除library

parent 0bfe590d
Showing with 15 additions and 4069 deletions
......@@ -12,6 +12,7 @@
<option value="$PROJECT_DIR$/annotation_lib" />
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/apt" />
<option value="$PROJECT_DIR$/baselibrary" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
......
......@@ -5,6 +5,7 @@
<module fileurl="file://$PROJECT_DIR$/annotation_lib/annotation_lib.iml" filepath="$PROJECT_DIR$/annotation_lib/annotation_lib.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/apt/apt.iml" filepath="$PROJECT_DIR$/apt/apt.iml" />
<module fileurl="file://$PROJECT_DIR$/baselibrary/baselibrary.iml" filepath="$PROJECT_DIR$/baselibrary/baselibrary.iml" />
<module fileurl="file://$PROJECT_DIR$/dayu.iml" filepath="$PROJECT_DIR$/dayu.iml" />
</modules>
</component>
......
<?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.library'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:design:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
//mutidex
compile 'com.android.support:multidex:1.0.2'
//ARouter
// compile "com.alibaba:arouter-api:$arouter_api_version"
// annotationProcessor "c、om.alibaba:arouter-compiler:$arouter_api_version"
//eventBus
compile 'org.greenrobot:eventbus:3.1.1'
//retrofit
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.5'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
annotationProcessor project(':apt')
compile project(':annotation_lib')
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\AndroidSDK/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# 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
#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------
#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-adaptclassstrings
-keepattributes InnerClasses, EnclosingMethod, Signature, *Annotation*,Exceptions
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------
#---------------------------------默认保留区---------------------------------
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers class * extends android.app.Activity{
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep public class * extends android.view.View{
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep class **.R$* {
*;
}
-keepclassmembers class * {
void *(**On*Event);
}
#----------------------------------------------------------------------------
#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, jav.lang.String);
}
-keepclassmembers class * extends android.webkit.WebChromeClient{
public void openFileChooser(...);
}
#-------------------------------------------定制化区域----------------------------------------------
#---------------------------------1.实体类---------------------------------
-keep class com.dayu.bigfish.bean.** { *; }
-keep class com.dayu.bigfish.base.** { *; }
#-------------------------------------------------------------------------
#---------------------------------2.第三方包-------------------------------
#retrofit
-dontwarn okio.**
-dontwarn com.google.**
-dontwarn javax.annotation.**
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault
-dontwarn okio.**
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-dontwarn javax.inject.**
# OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
#############################################
# RxJava RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
# Gson
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod
#PictureSelector 2.0
-keep class com.luck.picture.lib.** { *; }
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#BaseRecyclerViewAdapterHelper
-keep class com.chad.library.adapter.** {
*;
}
-keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter
-keep public class * extends com.chad.library.adapter.base.BaseViewHolder
-keepclassmembers class **$** extends com.chad.library.adapter.base.BaseViewHolder {
<init>(...);
}
#greendao
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use Rx:
-dontwarn rx.**
#环信
-keep class com.hyphenate.** {*;}
-dontwarn com.hyphenate.**
#高德地图
-keep class com.amap.api.location.**{*;}
-keep class com.amap.api.fence.**{*;}
-keep class com.autonavi.aps.amapapi.model.**{*;}
#友盟
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keep public class com.dayu.bigfish.R$*{
public static final int *;
}
-keep class com.umeng.error.UMError{ public *; }
-keep class com.umeng.error.UMErrorCatch{public *; }
-keep class com.umeng.error.UMErrorDataManger{ public *; }
-keep class com.umeng.error.BatteryUtils{ public *; }
#eventbus
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
#---------------------------------3.与js互相调用的类------------------------
#---------------------------------4.反射相关的类和方法-----------------------
package com.dayu.base;
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() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.dayu.base.test", appContext.getPackageName());
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dayu.base" />
package com.dayu.base.api;
import android.net.ParseException;
import com.dayu.base.R;
import com.dayu.base.common.BaseApplication;
import com.google.gson.JsonParseException;
import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import java.net.ConnectException;
import retrofit2.HttpException;
import static com.dayu.base.api.APIException.ERROR.SERVER_ERROR;
/**
* Created by luofan on 2017/11/15.
*/
public class APIException {
public static final int UNAUTHORIZED = 401;
public static final int FORBIDDEN = 403;
public static final int NOT_FOUND = 404;
public static final int REQUEST_TIMEOUT = 408;
public static final int INTERNAL_SERVER_ERROR = 500;
public static final int BAD_GATEWAY = 502;
public static final int SERVICE_UNAVAILABLE = 503;
public static final int GATEWAY_TIMEOUT = 504;
public static ResponeThrowable APIException(Throwable e) {
ResponeThrowable ex;
if (e instanceof HttpException) {
HttpException httpException = (HttpException) e;
ex = new ResponeThrowable(e, ERROR.HTTP_ERROR);
switch (httpException.code()) {
case FORBIDDEN:
ex.message = BaseApplication.getContext().getString(R.string.error_token);
ex.code = FORBIDDEN;
break;
case UNAUTHORIZED:
case NOT_FOUND:
case REQUEST_TIMEOUT:
ex.message = BaseApplication.getContext().getString(R.string.error_time_out);
ex.code = REQUEST_TIMEOUT;
break;
case GATEWAY_TIMEOUT:
case INTERNAL_SERVER_ERROR:
ex.message = BaseApplication.getContext().getString(R.string.error_connect);
ex.code = INTERNAL_SERVER_ERROR;
break;
case BAD_GATEWAY:
case SERVICE_UNAVAILABLE:
default:
ex.message = BaseApplication.getContext().getString(R.string.error_internet);
break;
}
return ex;
} else if (e instanceof ServerException) {
ServerException resultException = (ServerException) e;
ex = new ResponeThrowable(resultException, SERVER_ERROR, resultException.code);
ex.message = resultException.message;
return ex;
} else if (e instanceof JsonParseException
|| e instanceof JSONException
|| e instanceof ParseException) {
ex = new ResponeThrowable(e, ERROR.PARSE_ERROR);
ex.message = BaseApplication.getContext().getString(R.string.error_parse);
return ex;
} else if (e instanceof ConnectException) {
ex = new ResponeThrowable(e, ERROR.NETWORD_ERROR);
ex.message = BaseApplication.getContext().getString(R.string.error_connect);
return ex;
} else if (e instanceof javax.net.ssl.SSLHandshakeException) {
ex = new ResponeThrowable(e, ERROR.SSL_ERROR);
ex.message = BaseApplication.getContext().getString(R.string.error_ssl);
return ex;
} else if (e instanceof ConnectTimeoutException) {
ex = new ResponeThrowable(e, ERROR.TIMEOUT_ERROR);
ex.message = BaseApplication.getContext().getString(R.string.error_time_out);
return ex;
} else if (e instanceof java.net.SocketTimeoutException) {
ex = new ResponeThrowable(e, ERROR.TIMEOUT_ERROR);
ex.message = BaseApplication.getContext().getString(R.string.error_time_out);
return ex;
} else {
ex = new ResponeThrowable(e, ERROR.UNKNOWN);
ex.message = BaseApplication.getContext().getString(R.string.error_unknow);
return ex;
}
}
/**
* 约定异常
*/
class ERROR {
/**
* 接口返回错误
*/
public static final int SERVER_ERROR = 999;
/**
* 未知错误
*/
public static final int UNKNOWN = 1000;
/**
* 解析错误
*/
public static final int PARSE_ERROR = 1001;
/**
* 网络错误
*/
public static final int NETWORD_ERROR = 1002;
/**
* 协议出错
*/
public static final int HTTP_ERROR = 1003;
/**
* 证书出错
*/
public static final int SSL_ERROR = 1005;
/**
* 连接超时
*/
public static final int TIMEOUT_ERROR = 1006;
}
public static class ResponeThrowable extends Exception {
public int code;
public String message;
public String subCode;
public ResponeThrowable(Throwable throwable, int code) {
super(throwable);
this.code = code;
}
public ResponeThrowable(Throwable throwable, int code, String subCode) {
super(throwable);
this.code = code;
this.subCode = subCode;
}
}
}
package com.dayu.base.api;
import com.dayu.base.api.protocol.BaseResponse;
import com.dayu.base.common.Constants;
import com.dayu.base.utils.LogUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by luofan on 2017/11/09.
*/
public class Api {
private static Retrofit mRetrofit;
private static final int DEFAULT_TIMEOUT = 60;
private static Retrofit mDownloadRetrofit;
/**
* 普通retrofit.
*
* @return
*/
public static <T> T getService(Class<T> cls) {
return getmRetrofit().create(cls);
}
/**
* 下载的retrofit.
*
* @return
*/
public static <T> T getDownloadService(Class<T> cls) {
return getmDownloadRetrofit().create(cls);
}
private static Retrofit getmRetrofit() {
if (mRetrofit == null) {
mRetrofit = getRetrofit("");
}
return mRetrofit;
}
private static Retrofit getmDownloadRetrofit() {
if (mDownloadRetrofit == null) {
mDownloadRetrofit = getRetrofit("download");
}
return mDownloadRetrofit;
}
private static Retrofit getRetrofit(String type) {
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.create();
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(m -> LogUtils.i("request", m));
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
TokenInterceptord tokenInterceptord = new TokenInterceptord();
OkHttpClient.Builder build = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(tokenInterceptord)
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
if ("download".equals(type)) {
build.addNetworkInterceptor(chain -> {
Response response = chain.proceed(chain.request());
return response
.newBuilder()
.body(new FileResponseBody(response.body()))//将自定义的ResposeBody设置给它
.build();
});
}
return new Retrofit.Builder()
.client(build.build())
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
/**
* 统一加上token.
*/
public static class TokenInterceptord implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// UserInfo userInfo = UserManager.getInstance().getUser();
// if (userInfo != null) {
// String token = userInfo.getToken();
// if (!TextUtils.isEmpty(token) && !request.url().toString().contains(Constants.BASE_URL + Constants.LOGIN_URL)) {
// request = request.newBuilder()
// .header("token", token)
// .build();
// }
// }
return chain.proceed(request);
}
}
public static <T> ObservableTransformer<BaseResponse<T>, T> applySchedulers() {
return (ObservableTransformer<BaseResponse<T>, T>) transformer;
}
final static ObservableTransformer transformer = new ObservableTransformer() {
@Override
public ObservableSource apply(Observable upstream) {
return upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap((response) -> flatResponse((BaseResponse<Object>) response));
}
};
/**
* 对网络接口返回的Response进行分割操作
*
* @param response
* @param <T>
* @return
*/
public static <T> Observable<T> flatResponse(final BaseResponse<T> response) {
return Observable.create(e -> {
if (response.isSuccess()) {
if (!e.isDisposed()) {
e.onNext(response.getData());
}
} else {
if (!e.isDisposed()) {
e.onError(new ServerException(response.getSubCode(), response.getMsg()));
}
return;
}
if (!e.isDisposed()) {
e.onComplete();
}
});
}
}
package com.dayu.base.api;
import com.dayu.base.bean.event.DownloadBean;
import org.greenrobot.eventbus.EventBus;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
import okio.ForwardingSource;
import okio.Okio;
import okio.Source;
/**
* 下载文件
* Created by luofan on 2017/11/27.
*/
public class FileResponseBody extends ResponseBody {
private ResponseBody responseBody;
private BufferedSource bufferedSource;
public FileResponseBody(ResponseBody responseBody) {
this.responseBody = responseBody;
}
@Override
public MediaType contentType() {
return responseBody.contentType();
}
@Override
public long contentLength() {
return responseBody.contentLength();
}
@Override
public BufferedSource source() {
if (bufferedSource == null) {
bufferedSource = Okio.buffer(source(responseBody.source()));
}
return bufferedSource;
}
private Source source(Source source) {
return new ForwardingSource(source) {
long totalBytesRead = 0L;
@Override
public long read(Buffer sink, long byteCount) throws IOException {
long bytesRead = super.read(sink, byteCount);
// read() returns the number of bytes read, or -1 if this source is exhausted.
totalBytesRead += bytesRead != -1 ? bytesRead : 0;
EventBus.getDefault().post(new DownloadBean(contentLength(), totalBytesRead));
return bytesRead;
}
};
}
}
/*
* Copyright (C) 2015 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.dayu.base.api;
import java.io.EOFException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
import okhttp3.Connection;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Protocol;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okhttp3.internal.http.HttpHeaders;
import okhttp3.internal.platform.Platform;
import okio.Buffer;
import okio.BufferedSource;
import static okhttp3.internal.platform.Platform.INFO;
/**
* An OkHttp interceptor which logs request and response information. Can be applied as an
* {@linkplain OkHttpClient#interceptors() application interceptor} or as a {@linkplain
* OkHttpClient#networkInterceptors() network interceptor}. <p> The format of the logs created by
* this class should not be considered stable and may change slightly between releases. If you need
* a stable logging format, use your own interceptor.
*/
public final class HttpLoggingInterceptor implements Interceptor {
private static final Charset UTF8 = Charset.forName("UTF-8");
public enum Level {
/**
* No logs.
*/
NONE,
/**
* Logs request and response lines.
* <p>
* <p>Example:
* <pre>{@code
* --> POST /greeting http/1.1 (3-byte body)
*
* <-- 200 OK (22ms, 6-byte body)
* }</pre>
*/
BASIC,
/**
* Logs request and response lines and their respective headers.
* <p>
* <p>Example:
* <pre>{@code
* --> POST /greeting http/1.1
* Host: example.com
* Content-Type: plain/text
* Content-Length: 3
* --> END POST
*
* <-- 200 OK (22ms)
* Content-Type: plain/text
* Content-Length: 6
* <-- END HTTP
* }</pre>
*/
HEADERS,
/**
* Logs request and response lines and their respective headers and bodies (if present).
* <p>
* <p>Example:
* <pre>{@code
* --> POST /greeting http/1.1
* Host: example.com
* Content-Type: plain/text
* Content-Length: 3
*
* Hi?
* --> END POST
*
* <-- 200 OK (22ms)
* Content-Type: plain/text
* Content-Length: 6
*
* Hello!
* <-- END HTTP
* }</pre>
*/
BODY
}
public interface Logger {
void log(String message);
/**
* A {@link Logger} defaults output appropriate for the current platform.
*/
Logger DEFAULT = new Logger() {
@Override
public void log(String message) {
Platform.get().log(INFO, message, null);
}
};
}
public HttpLoggingInterceptor() {
this(Logger.DEFAULT);
}
public HttpLoggingInterceptor(Logger logger) {
this.logger = logger;
}
private final Logger logger;
private volatile Level level = Level.NONE;
/**
* Change the level at which this interceptor logs.
*/
public HttpLoggingInterceptor setLevel(Level level) {
if (level == null) throw new NullPointerException("level == null. Use Level.NONE instead.");
this.level = level;
return this;
}
public Level getLevel() {
return level;
}
@Override
public Response intercept(Chain chain) throws IOException {
Level level = this.level;
Request request = chain.request();
if (level == Level.NONE) {
return chain.proceed(request);
}
boolean logBody = level == Level.BODY;
boolean logHeaders = logBody || level == Level.HEADERS;
RequestBody requestBody = request.body();
boolean hasRequestBody = requestBody != null;
Connection connection = chain.connection();
Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1;
String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol;
if (!logHeaders && hasRequestBody) {
requestStartMessage += " (" + requestBody.contentLength() + "-byte body)";
}
logger.log(requestStartMessage);
if (logHeaders) {
if (hasRequestBody) {
// Request body headers are only present when installed as a network interceptor. Force
// them to be included (when available) so there values are known.
if (requestBody.contentType() != null) {
logger.log("Content-Type: " + requestBody.contentType());
}
if (requestBody.contentLength() != -1) {
logger.log("Content-Length: " + requestBody.contentLength());
}
}
Headers headers = request.headers();
for (int i = 0, count = headers.size(); i < count; i++) {
String name = headers.name(i);
// Skip headers from the request body as they are explicitly logged above.
if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) {
logger.log(name + ": " + headers.value(i));
}
}
if (!logBody || !hasRequestBody) {
logger.log("--> END " + request.method());
} else if (bodyEncoded(request.headers())) {
logger.log("--> END " + request.method() + " (encoded body omitted)");
} else {
Buffer buffer = new Buffer();
requestBody.writeTo(buffer);
Charset charset = UTF8;
MediaType contentType = requestBody.contentType();
if (contentType != null) {
charset = contentType.charset(UTF8);
}
logger.log("");
if (isPlaintext(buffer)) {
logger.log("body:" + buffer.readString(charset));
logger.log("--> END " + request.method()
+ " (" + requestBody.contentLength() + "-byte body)");
} else {
logger.log("--> END " + request.method() + " (binary "
+ requestBody.contentLength() + "-byte body omitted)");
}
}
}
long startNs = System.nanoTime();
Response response;
try {
response = chain.proceed(request);
} catch (Exception e) {
logger.log("<-- HTTP FAILED: " + e);
throw e;
}
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
ResponseBody responseBody = response.body();
long contentLength = responseBody.contentLength();
String bodySize = contentLength != -1 ? contentLength + "-byte" : "unknown-length";
logger.log("<-- " + response.code() + ' ' + response.message() + ' '
+ response.request().url() + " (" + tookMs + "ms" + (!logHeaders ? ", "
+ bodySize + " body" : "") + ')');
if (logHeaders) {
Headers headers = response.headers();
for (int i = 0, count = headers.size(); i < count; i++) {
logger.log(headers.name(i) + ": " + headers.value(i));
}
if (!logBody || !HttpHeaders.hasBody(response)) {
logger.log("<-- END HTTP");
} else if (bodyEncoded(response.headers())) {
logger.log("<-- END HTTP (encoded body omitted)");
} else {
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
Charset charset = UTF8;
MediaType contentType = responseBody.contentType();
if (contentType != null) {
charset = contentType.charset(UTF8);
}
if (!isPlaintext(buffer)) {
logger.log("");
logger.log("<-- END HTTP (binary " + buffer.size() + "-byte body omitted)");
return response;
}
if (contentLength != 0) {
logger.log("");
logger.log(buffer.clone().readString(charset));
}
logger.log("<-- END HTTP (" + buffer.size() + "-byte body)");
}
}
return response;
}
/**
* Returns true if the body in question probably contains human readable text. Uses a small sample
* of code points to detect unicode control characters commonly used in binary file signatures.
*/
static boolean isPlaintext(Buffer buffer) {
try {
Buffer prefix = new Buffer();
long byteCount = buffer.size() < 64 ? buffer.size() : 64;
buffer.copyTo(prefix, 0, byteCount);
for (int i = 0; i < 16; i++) {
if (prefix.exhausted()) {
break;
}
int codePoint = prefix.readUtf8CodePoint();
if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) {
return false;
}
}
return true;
} catch (EOFException e) {
return false; // Truncated UTF-8 sequence.
}
}
private boolean bodyEncoded(Headers headers) {
String contentEncoding = headers.get("Content-Encoding");
return contentEncoding != null && !contentEncoding.equalsIgnoreCase("identity");
}
}
package com.dayu.base.api;
import com.dayu.base.R;
import com.dayu.base.common.BaseApplication;
import com.dayu.base.common.Constants;
/**
* Created by luofan on 2017/11/15.
* 错误码统一处理类.
*/
public class ServerException extends Exception {
public String code;
public String message;
public ServerException(String code, String message) {
this.code = code;
this.message = message;
processCode(code);
}
private void processCode(String code) {
if (code == null) {
message = BaseApplication.getContext().getString(R.string.get_info_failed);
return;
}
switch (code) {
/** order相关错误*/
case "ORDER0001":
message = BaseApplication.getContext().getString(R.string.order_not_exite);
break;
case "ORDER0002":
message = BaseApplication.getContext().getString(R.string.order_receive_already);
break;
case "ORDER0003":
message = BaseApplication.getContext().getString(R.string.order_cancle_not_receive);
break;
case "ORDER0004":
message = BaseApplication.getContext().getString(R.string.order_cancle_not_subcribe);
break;
case "ORDER0005":
message = BaseApplication.getContext().getString(R.string.order_cancle_not_begin);
break;
case "ORDER0006":
message = BaseApplication.getContext().getString(R.string.order_cancle_not_process);
break;
case "LOGISTICS0001":
message = BaseApplication.getContext().getString(R.string.query_logistics_failed);
break;
/** 用户相关错误*/
case "USER0002":
message = BaseApplication.getContext().getString(R.string.sms_code_unsend_or_expire);
break;
case "USER0004":
message = BaseApplication.getContext().getString(R.string.not_engineer);
break;
case "USER0005":
message = BaseApplication.getContext().getString(R.string.account_frozen);
break;
case "USER0020":
message = BaseApplication.getContext().getString(R.string.sms_code_unsend_or_expire);
break;
case "USER0021":
message = BaseApplication.getContext().getString(R.string.sms_code_error);
break;
case "USER0003":
case "USER0023":
message = BaseApplication.getContext().getString(R.string.engineer_acount_notavialibe);
break;
case "USER0024":
message = BaseApplication.getContext().getString(R.string.engineer_not_have_site);
break;
case "USER0062":
message = BaseApplication.getContext().getString(R.string.identity_is_error);
break;
case "USER0051":
message = BaseApplication.getContext().getString(R.string.not_audite_aviliable);
break;
/** 账户相关*/
case "SETTLEMENT0015":
message = Constants.NOT_SHOW;
break;
case "SETTLEMENT0001":
message = BaseApplication.getContext().getString(R.string.perameter_is_null);
break;
/**全局错误*/
case "GLOBAL0001":
message = "未知错误GLOBAL0001"; //参数错误
break;
case "GLOBAL0002":
message = "未知错误GLOBAL0002"; //格式化序列化错误
break;
case "GLOBAL0003":
message = "未知错误GLOBAL0003"; //业务错误
break;
case "GLOBAL0004":
message = "未知错误GLOBAL0004"; //全局错误
break;
case "GLOBAL0100":
message = "未知错误GLOBAL0100"; //远程调用失败
break;
case "GLOBAL0101":
message = "验证码错误"; //短信验证失败
break;
case "GLOBAL0102":
message = "未知错误GLOBAL0102"; // unknowable error type
break;
case "GLOBAL0103":
message = "验证码错误";
break;
case "GLOBAL0104":
message = "用户名和密码错误";
break;
case "GLOBAL0400":
message = "未知错误GLOBAL0400"; //Bad Request!
break;
case "GLOBAL0406":
message = "未知错误GLOBAL0406"; //not Acceptable
break;
case "GLOBAL0405":
message = "未知错误GLOBAL0405"; //Method Not Allowed
break;
case "GLOBAL0500":
message = "未知错误GLOBAL0500"; //Method Not Allowed
break;
case "GLOBAL1001":
message = "未知错误GLOBAL1001"; //空指针异常
break;
case "GLOBAL1002":
message = "未知错误GLOBAL1002"; //类型转换异
break;
case "GLOBAL1003":
message = "未知错误GLOBAL1003"; //IO异常
break;
case "GLOBAL1004":
message = "未知错误GLOBAL1004"; //未知方法异
break;
case "GLOBAL1005":
message = "未知错误GLOBAL1005"; //数据越界异
break;
default:
message = BaseApplication.getContext().getString(R.string.get_info_failed);
break;
}
}
}
package com.dayu.base.api.protocol;
import java.util.List;
/**
* 分页的basebean.
* Created by luofan on 2017/11/14.
*/
public class BasePageBean<T>{
private int pageNo;
private int pageSize;
private int totalRows;
private int totalPages;
private int previousPageNo;
private int nextPageNo;
private List<T> data;
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public int getPreviousPageNo() {
return previousPageNo;
}
public void setPreviousPageNo(int previousPageNo) {
this.previousPageNo = previousPageNo;
}
public int getNextPageNo() {
return nextPageNo;
}
public void setNextPageNo(int nextPageNo) {
this.nextPageNo = nextPageNo;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
}
package com.dayu.base.api.protocol;
/**
* Created by luofan on 2016/07/14.
*/
public class BaseResponse<T> {
private int code;
private String subCode;
private String msg;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public boolean isSuccess() {
return code == 0;
}
public String getSubCode() {
return subCode;
}
public void setSubCode(String subCode) {
this.subCode = subCode;
}
}
package com.dayu.base.bean.event;
/**
* Created by luofan on 2017/11/27.
* 下载进度.
*/
public class DownloadBean {
private long total;
private long bytesReaded;
public DownloadBean(long total, long bytesReaded) {
this.total = total;
this.bytesReaded = bytesReaded;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public long getBytesReaded() {
return bytesReaded;
}
public void setBytesReaded(long bytesReaded) {
this.bytesReaded = bytesReaded;
}
}
package com.dayu.base.common;
import android.content.Context;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
/**
* Created by luofan
* on 2018/2/5.
*/
public class BaseApplication extends MultiDexApplication {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
MultiDex.install(this);
}
public static Context getContext() {
return mContext;
}
public static synchronized BaseApplication context() {
return (BaseApplication) mContext;
}
}
package com.dayu.base.common;
import com.dayu.base.utils.LogUtils;
/**
* Created by MrWang
* on 2017/8/20.
*/
public class Constants {
/***********************测试环境配置**********************************/
public static final int DEBUGLEVEL = LogUtils.LEVEL_ALL;
public static final String BASE_URL = "http://47.94.101.239:3112";
public final static String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply";
public final static String WEB_SOP = "http://47.94.101.239:9004/#/sop";
public final static String WEB_ZHI_SHI = "http://47.94.101.239:9004/#/detail";
public static final boolean UM_DEBUG = true;
/**************************正式环境*******************************/
// public static final int DEBUGLEVEL = LogUtils.LEVEL_OFF;
// public static final String BASE_URL = "https://mobile.dayu.ai";
// public final static String UP_PHOTO = "/file/uploadMore?targetPath=online/sp/mobile/android/business/checkApply";
// public final static String WEB_SOP = "https://sop.kf.ai/#/sop";
// public final static String WEB_ZHI_SHI = "https://sop.kf.ai/#/detail";
// public static final boolean UM_DEBUG = false;
/*****************/
/**
* 登录.
*/
public static final String LOGIN_URL = "/check";
/**
* 登录时发送验证码
*/
public static final String REGISTER_URL = "/api-user/" + "account/loginSms/{telephone}/type/{type}";
/**
* 修改用户信息.
*/
public static final String MODIFY_USER_INFO = "/api-user/" + "auditInfo/accountReAuthenticate";
/**
* 修改用户头像.
*/
public static final String MODIFY_USER_HEADER = "/api-user/" + "/account/modifyHeadURL";
/**
* 异常单获取.
*/
public static final String ERROR_ORDER = "/api-order/" + "orders/findExceptionSimpleOrderVO";
/**
* 工程师接单.
*/
public static final String ORDER_RECEIVING = "/api-order/" + "orders/{orderId}/engineer/{engineerId}";
/**
* 重新预约时间.
*/
public static final String SUBCRIBE_TIME = "/api-order/" + "orders/bespeakDoor";
/**
* 开始出发.
*/
public static final String START_ORDER = "/api-order/" + "orders/onWayUpgrade";
/**
* 开始服务.
*/
public static final String START_SERVE = "/api-order/" + "orders/onWorkingUpgrade";
/**
* 工单详情信息,包含评价,投诉,服务记录.
*/
public static final String ORDER_DETAILS = "/api-order/" + "orders/{orderId}/detail";
/**
* 工单完成,提交验收报告.
*/
public static final String ORDER_FINISH = "/api-order/" + "orders/waitCustomerCheckUpgrade";
/**
* 获取工程师信息.
*/
public static final String PERSONAL_CENTER = "/api-user/" + "engineerInfo/accountId/{accountId}";
/**
* 工程师今日收益.
*/
public static final String PERSONAL_ACOUNT_BALANCE = "/api-settlement/" + "payAccount/queryAccountBalanceAndtodayIncrease/accountId/{accountId}";
/**
* 工程师账户余额.
*/
public static final String PERSONAL_ACCOUT_LIST = "/api-settlement/" + "payStream/queryPayStream/";
/**
* 绑定支付宝账号.
*/
public static final String PERSONAL_ALIPAY_BOUND = "/api-settlement/" + "alipay/save";
/**
* 查询支付宝账号.
*/
public static final String PERSONAL_ALIPAY_QUERY = "/api-settlement/" + "alipay/queryAlipayByAccountId/accountId/{accountId}";
/**
* 修改支付宝账号.
*/
public static final String PERSONAL_ALIPAY_MODIFY = "/api-settlement/" + "alipay/modifyAlipay";
/**
* 单表查询工单记录.
*/
public final static String SELECT_ORDER_LITTLE = "/api-order/" + "orders/{id}";
/**
* 根据工程师id和工程师id获取今日业绩(今日收益).
*/
public final static String USER_ORDER_REVENUE = "/api-count/" + "ordersStatistics/income/siteId/{siteId}/engineerId/{engineerId}";
//服务记录、工程师评价
public final static String USER_REVENUE = "/api-count/" + "ordersStatistics/total/siteId/{siteId}/engineerId/{engineerId}";
//反馈提交
public final static String SET_IDEA_COMMIT = "/api-base/" + "suggest";
//版本更新检测
public final static String UPDATA_VERSION = "/api-base/" + "appVersion/newestVersion/appId/{packageName}";
//版本更新、获取新版本信息
public final static String UPGRADE_VERSION = "/api-base/" + "appVersion/versionInfo";
public final static String COMMIT_VERSION_INFO = "/api-base/" + "versionUpgrade";
//分页获取工单
public final static String ORDERS = "/api-order/" + "orders/findSimpleOrderVOByPage";
//获取首页tab状态的数量
public final static String TAB_NUM = "/api-order/" + "orders/{userId}/count/siteId/{siteId}";
//环信
public final static String MESSAGE_HX = "/api-message/" + "hXMessage";
public final static String MESSAGE_HX_LIST = "/api-message/hXMessage/hxAccount/{hxAccount}/category/{category}";
//获取消息数量
public final static String MESSAGE_NUM = " /api-message/" + "hXMessage/count/hxAccount/{hxAccount}";
/**
* 获取服务说明.
*/
public final static String ORDER_INSTRUCTION = "/api-ka-base/" + "spuServiceDetail";
/**
* 获取厂商收货地址.
*/
public final static String KA_ADDRESS = "/api-ka-user/" + "companyAddress/default/companyId/{companyId}";
/**
* 申请备件.
*/
public final static String APPLY_ONE_PART = "/api-ka-order/" + "kaOrderSpareParts/saveSpApplyParts";
/**
* 取消申请备件.
*/
public final static String CANCLE_APPLY_PART = "/api-ka-order/" + "kaOrderSpareParts/spCancelApplyParts";
/**
* sp主动寄回备件.
*/
public final static String RETURN_PART_SELF = "/api-ka-order/" + "kaOrderSpareParts/spExpressBack";
/**
* sp按ka要求寄回备件.
*/
public final static String RETURN_PART_BY_KA = "/api-ka-order/" + "kaOrderSpareParts/spExpressBackByka";
/**
* 收到备件.
*/
public final static String RECEIVE_PART = "/api-ka-order/" + "kaOrderSpareParts/spReceivedParts";
/**
* 获取备件列表.
*/
public final static String QUERY_PART_LIST = "/api-ka-order/" + "kaOrderSpareParts/queryOrderPartList";
/**
* 拒绝申请备件.
*/
public final static String REFUSE_ONE_PART = "/api-ka-order/" + "kaOrderSpareParts/refuse";
/**
* 查询物流信息.
*/
public final static String QUERY_LOGISTICS_INFO = "/api-base/" + "logisticsTraceInfo/queryLogisticsTraceInfo";
/**
* 查询物流信息.
*/
public final static String QUERY_SHIPPER_COMPANY = "/api-base/" + "shipperCompany/queryShipperList";
/**
* 修改备件信息.
*/
public final static String MODIFY_PART = "/api-ka-order/" + "kaOrderSpareParts";
/***********************其他配置**********************************/
public final static int PAGESIZE = 20;
public final static String BUNDLE = "bundle";
public final static String ID = "id";
//订单详情
public final static String ORDER_DETAIL = "order_detail";
//数据返回失败标识
public final static int FAILED = -1;
//相册选择照片删除时传递的key
public final static String BUNDLE_KEY_ID = "BUNDLE_KEY_ID";
//工程师的账户余额
public final static String ACCOUNT_BALANCE = "account_balance";
public final static String ACCOUNT_ID = "accountId";
public final static String ORDER_ID = "orderId";
public final static String ORDER_POSTION = "order_position";
//是否显示去设置alipay账户de对话框
public final static String IS_SHOW_ALIPAY_DILAOG = "is_show_alipay_dialog";
//上个版本号
public final static String OLD_PAKAGENUM = "old_pakegnum";
//订单进行状态
public final static String ORDER_STATE = "order_state";
public final static String MESSAGE_INFO = "message_info";
//环信message
public final static String HX_MESSAGE = "hx_message";
public static final int FLAG_MULTI_VH = 0x000001;
//订单状态
public final static int WATING_ORDER = 1;
public final static int APPOIMENT_ORDER = 2;
public final static int WATING_SERVER = 110;
public final static int CANCLE_ORDER = 6;
public final static int FINISH_ORDER = 5;
//设置通知提醒按钮状态
public final static String MESSAGE_STATE = "message_state";
/**
* 使base类不弹出提示.
*/
public final static String NOT_SHOW = "not_show";
public final static String PICURL = "pic_url";
public final static String URL = "url";
public final static String ENGINEERINFO = "engineer_info";
public final static String TYPE = "type";
public final static String DESCRIBE = "describe";
public static final String PART_ID = "part_id";
public static final String SHIPPER_CODE = "shipper_code";
public static final String COURIER_NUM = "courier_num";
public static final String PART = "part";
/**
* 意见反馈.
*/
public final static int FEED_BACK = 0;
/**
* 主动申请备件.
*/
public final static int APPLY_PART = 1;
/**
* 拒绝申请.
*/
public final static int REFUSE_PART = 2;
/**
* (备件)申请中
*/
public final static int APPLY = 1;
/**
* (备件)已拒绝
*/
public final static int REFUSE = 2;
/**
* (备件)运输中
*/
public final static int TRANSPORTATION = 3;
/**
* (备件)已收货
*/
public final static int RECEIVED = 4;
/**
* (备件)已取消
*/
public final static int CANCEL = 5;
public static final int BYKA = 0;
public static final int BYMYSELF = 1;
public static final int BY_MODIFY_PART = 2;
}
package com.dayu.base.presenter;
import android.databinding.ObservableField;
/**
* Created by luofan on 2017/12/23.
*/
public abstract class BaseListPresenter<V> extends BasePresenter<V> {
/**
* 如果有下拉刷新,子类必须重写此方法.
*/
public void refresh() {
}
/**
* 如果有上拉加载,子类必须重写此方法.
*/
public void loadMore() {
}
/**
* 如果有头布局,子类重写此方法.
*
* @return 头布局数据源.
*/
public ObservableField<Object> getHeaderDatas() {
return null;
}
/**
*
* @return recy数据源.
*/
public abstract ObservableField<Object> getSourceDatas();
}
package com.dayu.base.presenter;
import android.util.Log;
import com.dayu.base.api.APIException;
import com.dayu.base.common.Constants;
import com.dayu.base.ui.BaseView;
import com.dayu.base.ui.activity.BaseActivity;
import com.dayu.base.ui.fragment.BaseFragment;
import com.dayu.base.utils.ProgressUtil;
import io.reactivex.Observer;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
/**
* Created by luofan on 17/11/02.
*/
public abstract class BasePresenter<V> {
protected static final String TAG = "BasePresenter";
protected V mView;
protected CompositeDisposable mComDisposable = new CompositeDisposable();
public void setView(V v) {
this.mView = v;
this.onAttached();
}
public abstract void onAttached();
public void onDetached() {
mComDisposable.dispose();
}
/**
* 创建观察者
*
* @param consumer
* @return
*/
public <M> Observer<M> baseObserver(final Consumer<? super M> consumer) {
return new Observer<M>() {
@Override
public void onSubscribe(Disposable d) {
mComDisposable.add(d);
}
@Override
public void onNext(M o) {
ProgressUtil.stopLoad();
try {
consumer.accept(o);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
ProgressUtil.stopLoad();
processException(e);
}
@Override
public void onComplete() {
}
};
}
/**
* 创建带错误的观察者
*
* @param consumer
* @return
*/
public <M> Observer<M> baseObserver(final Consumer<? super M> consumer, final Consumer<APIException.ResponeThrowable> tconsumer) {
return new Observer<M>() {
@Override
public void onSubscribe(Disposable d) {
mComDisposable.add(d);
}
@Override
public void onNext(M o) {
ProgressUtil.stopLoad();
try {
consumer.accept(o);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
Log.d("reguest+error", e.toString());
APIException.ResponeThrowable exception = processException(e);
ProgressUtil.stopLoad();
try {
tconsumer.accept(exception);
} catch (Exception e1) {
e1.printStackTrace();
}
}
@Override
public void onComplete() {
}
};
}
private APIException.ResponeThrowable processException(Throwable e) {
APIException.ResponeThrowable exception = APIException.APIException(e);
int code = exception.code;
String message = exception.message;
if (code == APIException.FORBIDDEN) {
showLoginDialog();
return exception;
}
if (!Constants.NOT_SHOW.equals(message) && mView instanceof BaseView) {
((BaseView) mView).showToast(message);
}
return exception;
}
/**
* 重新登录的提示框.
*/
private void showLoginDialog() {
if (mView instanceof BaseActivity) {
((BaseActivity) mView).showLoginDialog();
} else if (mView instanceof BaseFragment) {
((BaseFragment) mView).showLoginDialog();
}
}
public void dumpBack() {
if (mView instanceof BaseActivity) {
((BaseActivity) mView).dumpBack();
}
}
}
package com.dayu.base.ui;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.StringRes;
/**
* Created by luofan on 17/11/02.
*/
public interface BaseView {
void showToast(@StringRes int resId);
void showToast(String str);
void showDialog();
void showDialog(String str);
void hideDialog();
void dumpBack();
void dumpBack(int requestCode, Intent intent);
void startActivity(Class cls);
void startActivityForIntent(Intent intent);
void startActivity(Class<?> clz, Bundle bundle);
void startActvityAndFinish(Class<?> clz);
void startActivityForReult(Class<?> clz, int requestCode);
void startActivityForReult(Class<?> clz, Bundle bundle, int requestCode);
void startActivityAndFinish(Class<?> clz, Bundle bundle);
Bundle getBundle();
}
package com.dayu.base.ui.activity;
import android.content.Intent;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import com.dayu.base.R;
import com.dayu.base.common.Constants;
import com.dayu.base.presenter.BasePresenter;
import com.dayu.base.ui.BaseView;
import com.dayu.base.utils.InstanceUtil;
import com.dayu.base.utils.ProgressUtil;
import com.dayu.base.utils.ToastUtils;
import com.dayu.base.widgets.CustomDialog;
import java.lang.reflect.ParameterizedType;
/**
* Created by luofan on 17/11/02.
*/
public abstract class BaseActivity<P extends BasePresenter, B extends ViewDataBinding> extends BaseBindingActivity<B>
implements BaseView {
public P mPresenter;
private boolean isDialogShow = false;
@Override
protected void initPresenter() {
super.initPresenter();
if (this.getClass().getGenericSuperclass() instanceof ParameterizedType &&
((ParameterizedType) (this.getClass().getGenericSuperclass())).getActualTypeArguments().length > 0) {
Class mPresenterClass = (Class) ((ParameterizedType) (this.getClass()
.getGenericSuperclass())).getActualTypeArguments()[0];
mPresenter = InstanceUtil.getInstance(mPresenterClass);
if (mPresenter != null) {
mPresenter.setView(this);
// mBind.setVariable(BR.presenter, mPresenter);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) {
mPresenter.onDetached();
}
}
public void showToast(String msg) {
ToastUtils.showShortToast(msg);
}
public void showToast(int resId) {
ToastUtils.showShortToast(resId);
}
public void showDialog() {
ProgressUtil.startLoad(this);
}
public void showDialog(String str) {
ProgressUtil.startLoad(this, str);
}
public void hideDialog() {
ProgressUtil.stopLoad();
}
public void dumpBack() {
mActivity.finish();
}
public void dumpBack(int requestCode, Intent intent) {
mActivity.setResult(requestCode, intent);
mActivity.finish();
}
public void startActivity(Class cls) {
mActivity.startActivity(new Intent(mActivity, cls));
}
public void startActivityForIntent(Intent intent) {
mActivity.startActivity(intent);
}
public void startActivity(Class<?> clz, Bundle bundle) {
Intent intent = new Intent(mActivity, clz);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE, bundle);
}
mActivity.startActivity(intent);
}
public void startActivityForReult(Class<?> clz, Bundle bundle, int requestCode) {
Intent intent = new Intent(mActivity, clz);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE, bundle);
}
mActivity.startActivityForResult(intent, requestCode);
}
public void startActivityForReult(Class<?> clz, int requestCode) {
mActivity.startActivityForResult(new Intent(mActivity, clz), requestCode);
}
public void startActvityAndFinish(Class<?> clz) {
mActivity.startActivity(new Intent(mActivity, clz));
mActivity.finish();
}
public void startActivityAndFinish(Class<?> clz, Bundle bundle) {
Intent intent = new Intent(mActivity, clz);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE, bundle);
}
mActivity.startActivity(intent);
mActivity.finish();
}
public Bundle getBundle() {
return getIntent().getBundleExtra(Constants.BUNDLE);
}
/**
* token超时提示重新登录.
*/
public void showLoginDialog() {
if (isDialogShow) {
return;
}
CustomDialog mDialog = new CustomDialog(mActivity, R.style.CustomDialog, getString(R.string.login_state_no)
, (dialog, confirm) -> {
if (confirm) {
// EMClient.getInstance().logout(true);
// UserManager.getInstance().clearUserInfo();
// Intent intent = new Intent(mActivity, LoginActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// mActivity.startActivity(intent);
}
dialog.dismiss();
isDialogShow = false;
});
mDialog.setTitle(getString(R.string.notice))
.setPositiveButton(getString(R.string.login_again))
.setOneButton(true);
mDialog.show();
isDialogShow = true;
}
}
package com.dayu.base.ui.activity;
import android.app.Activity;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public abstract class BaseBindingActivity<B extends ViewDataBinding> extends AppCompatActivity {
public Activity mActivity;
public B mBind;
protected String mClassName;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = getLayoutInflater().inflate(this.getLayoutId(), null, false);
mBind = DataBindingUtil.bind(rootView);
this.setContentView(rootView);
mActivity = this;
mClassName = mActivity.getClass().getSimpleName();
initPresenter();
initView();
}
protected void initPresenter() {
}
public abstract int getLayoutId();
public abstract void initView();
// @Override
// public void onResume() {
// super.onResume();
// if (!"MainActivity".equals(mActivity.getClass().getSimpleName())
// && !"OrderDetailsActivity".equals(mActivity.getClass().getSimpleName())) {
// MobclickAgent.onPageStart(mClassName);
// }
// MobclickAgent.onResume(mActivity);
// }
//
// @Override
// public void onPause() {
// super.onPause();
// if (!"MainActivity".equals(mActivity.getClass().getSimpleName())
// && !"OrderDetailsActivity".equals(mActivity.getClass().getSimpleName())) {
// MobclickAgent.onPageEnd(mClassName);
// }
// MobclickAgent.onPause(mActivity);
// }
}
package com.dayu.base.ui.fragment;
import android.app.Activity;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable;
public abstract class BaseBindingFragment<B extends ViewDataBinding> extends Fragment {
public B mBind;
protected Activity mActivity;
private boolean isVisible; //是否可见状态
private boolean isPrepared; //标志位,View已经初始化完成。
private boolean isFirstLoad = true;
protected CompositeDisposable mDisposable = new CompositeDisposable();
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
onAttachToContext((Activity) context);
}
}
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
private void onAttachToContext(Activity context) {
mActivity = context;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isFirstLoad = true;
isPrepared = true;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutId(), container, false);
mBind = DataBindingUtil.bind(view);
initPresenter();
initView();
return view;
}
public abstract void initView();
public abstract int getLayoutId();
protected void initPresenter() {
}
/**
* 如果是与ViewPager一起使用,调用的是setUserVisibleHint
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
//显示加载效果,延时
mDisposable.add(Observable.timer(300, TimeUnit.MILLISECONDS).subscribe(aLong -> onVisible()));
} else {
isVisible = false;
onInvisible();
}
}
/**
* 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.
* 若是初始就show的Fragment 为了触发该事件 需要先hide再show
*/
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible() {
doInit();
}
protected void onInvisible() {
}
protected void doInit() {
if (!isPrepared || !isVisible || !isFirstLoad) {
return;
}
isFirstLoad = false;
lazyLoad();
}
protected void lazyLoad() {
}
@Override
public void onDetach() {
super.onDetach();
mDisposable.dispose();
}
}
package com.dayu.base.ui.fragment;
import android.content.Intent;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import com.dayu.base.R;
import com.dayu.base.common.Constants;
import com.dayu.base.presenter.BasePresenter;
import com.dayu.base.ui.BaseView;
import com.dayu.base.utils.InstanceUtil;
import com.dayu.base.utils.ProgressUtil;
import com.dayu.base.utils.ToastUtils;
import com.dayu.base.widgets.CustomDialog;
import java.lang.reflect.ParameterizedType;
/**
* Created by luo on 2017/11/14.
*/
public abstract class BaseFragment<P extends BasePresenter, B extends ViewDataBinding> extends BaseBindingFragment<B>
implements BaseView {
public P mPresenter;
private boolean isDialogShow = false;
@Override
protected void initPresenter() {
super.initPresenter();
if (this.getClass().getGenericSuperclass() instanceof ParameterizedType &&
((ParameterizedType) (this.getClass().getGenericSuperclass())).getActualTypeArguments().length > 0) {
Class mPresenterClass = (Class) ((ParameterizedType) (this.getClass()
.getGenericSuperclass())).getActualTypeArguments()[0];
mPresenter = InstanceUtil.getInstance(mPresenterClass);
if (mPresenter != null) {
mPresenter.setView(this);
// mBind.setVariable(BR.presenter, mPresenter);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPresenter != null) mPresenter.onDetached();
}
public void dumpBack() {
mActivity.finish();
}
public void dumpBack(int requestCode, Intent intent) {
mActivity.setResult(requestCode, intent);
mActivity.finish();
}
public void showToast(int resId) {
ToastUtils.showShortToast(resId);
}
public void showToast(String msg) {
ToastUtils.showShortToast(msg);
}
public void showDialog() {
ProgressUtil.startLoad(mActivity);
}
public void showDialog(String str) {
ProgressUtil.startLoad(mActivity, str);
}
public void hideDialog() {
ProgressUtil.stopLoad();
}
public void startActivity(Class cls) {
mActivity.startActivity(new Intent(mActivity, cls));
}
public void startActivityForIntent(Intent intent) {
mActivity.startActivity(intent);
}
public void startActivity(Class<?> clz, Bundle bundle) {
Intent intent = new Intent(mActivity, clz);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE, bundle);
}
mActivity.startActivity(intent);
}
public void startActivityForReult(Class<?> clz, int requestCode) {
mActivity.startActivityForResult(new Intent(mActivity, clz), requestCode);
}
public void startActivityForReult(Class<?> clz, Bundle bundle, int requestCode) {
Intent intent = new Intent(mActivity, clz);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE, bundle);
}
mActivity.startActivityForResult(intent, requestCode);
}
public void startActvityAndFinish(Class<?> clz) {
mActivity.startActivity(new Intent(mActivity, clz));
mActivity.finish();
}
public void startActivityAndFinish(Class<?> clz, Bundle bundle) {
Intent intent = new Intent(mActivity, clz);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE, bundle);
}
mActivity.startActivity(intent);
mActivity.finish();
}
public Bundle getBundle() {
return getArguments();
}
public void showLoginDialog() {
if (isDialogShow) {
return;
}
CustomDialog mDialog = new CustomDialog(mActivity, R.style.CustomDialog, getString(R.string.login_state_no)
, (dialog, confirm) -> {
if (confirm) {
// UserManager.getInstance().clearUserInfo();
// EMClient.getInstance().logout(true);
// UserManager.getInstance().clearUserInfo();
// Intent intent = new Intent(mActivity, LoginActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// mActivity.startActivity(intent);
}
dialog.dismiss();
isDialogShow = false;
});
mDialog.setTitle(getString(R.string.notice))
.setPositiveButton(getString(R.string.login_again))
.setOneButton(true);
mDialog.show();
isDialogShow = true;
}
}
package com.dayu.base.utils;
/**
* Created by luofan on 2017/11/24.
*/
public class InstanceUtil {
/**
* 通过实例工厂去实例化相应类
*
* @param <T> 返回实例的泛型类型
* @return
*/
public static <T> T getInstance(Class cls) {
try {
return (T) cls.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
}
return null;
}
}
package com.dayu.base.utils;
import android.text.TextUtils;
import android.util.Log;
import com.dayu.base.common.Constants;
import java.util.List;
/**
* @author itheima
* @time 2017-8-20 上午11:33:49
* @des 日志级别是LEVEL_ALL显示所有信息,包括System.out.println信息
* @des 日志级别是LEVEL_OFF关闭所有信息,包括System.out.println信息
* @updateAuthor TODO
* @updateTime TODO
* @updateDes TODO
*/
public class LogUtils {
/** 日志输出时的TAG */
private static String mTag = "BigFish";
/** 日志输出级别NONE */
public static final int LEVEL_OFF = 0;
/** 日志输出级别NONE */
public static final int LEVEL_ALL = 7;
/** 日志输出级别V */
public static final int LEVEL_VERBOSE = 1;
/** 日志输出级别D */
public static final int LEVEL_DEBUG = 2;
/** 日志输出级别I */
public static final int LEVEL_INFO = 3;
/** 日志输出级别W */
public static final int LEVEL_WARN = 4;
/** 日志输出级别E */
public static final int LEVEL_ERROR = 5;
/** 日志输出级别S,自定义定义的一个级别 */
public static final int LEVEL_SYSTEM = 6;
/** 是否允许输出log */
private static int mDebuggable = Constants.DEBUGLEVEL;
/** 用于记时的变量 */
private static long mTimestamp = 0;
/** 写文件的锁对象 */
private static final Object mLogLock = new Object();
/**---------------日志输出,已固定TAG begin---------------**/
/** 以级别为 d 的形式输出LOG */
public static void v(String msg) {
if (mDebuggable >= LEVEL_VERBOSE) {
Log.v(mTag, msg);
}
}
/** 以级别为 d 的形式输出LOG */
public static void d(String msg) {
if (mDebuggable >= LEVEL_DEBUG) {
Log.d(mTag, msg);
}
}
/** 以级别为 i 的形式输出LOG */
public static void i(String msg) {
if (mDebuggable >= LEVEL_INFO) {
Log.i(mTag, msg);
}
}
/** 以级别为 w 的形式输出LOG */
public static void w(String msg) {
if (mDebuggable >= LEVEL_WARN) {
Log.w(mTag, msg);
}
}
/** 以级别为 w 的形式输出Throwable */
public static void w(Throwable tr) {
if (mDebuggable >= LEVEL_WARN) {
Log.w(mTag, "", tr);
}
}
/** 以级别为 w 的形式输出LOG信息和Throwable */
public static void w(String msg, Throwable tr) {
if (mDebuggable >= LEVEL_WARN && null != msg) {
Log.w(mTag, msg, tr);
}
}
/** 以级别为 e 的形式输出LOG */
public static void e(String msg) {
if (mDebuggable >= LEVEL_ERROR) {
Log.e(mTag, msg);
}
}
/** 以级别为 s 的形式输出LOG,主要是为了System.out.println,稍微格式化了一下 */
public static void sf(String msg) {
if (mDebuggable >= LEVEL_ERROR) {
System.out.println("----------" + msg + "----------");
}
}
/** 以级别为 s 的形式输出LOG,主要是为了System.out.println */
public static void s(String msg) {
if (mDebuggable >= LEVEL_ERROR) {
System.out.println(msg);
}
}
/** 以级别为 e 的形式输出Throwable */
public static void e(Throwable tr) {
if (mDebuggable >= LEVEL_ERROR) {
Log.e(mTag, "", tr);
}
}
/** 以级别为 e 的形式输出LOG信息和Throwable */
public static void e(String msg, Throwable tr) {
if (mDebuggable >= LEVEL_ERROR && null != msg) {
Log.e(mTag, msg, tr);
}
}
/**---------------日志输出,已固定TAG end---------------**/
/**---------------日志输出,未固定TAG begin---------------**/
/** 以级别为 d 的形式输出LOG */
public static void v(String tag, String msg) {
if (mDebuggable >= LEVEL_VERBOSE) {
Log.v(tag, msg);
}
}
/** 以级别为 d 的形式输出LOG */
public static void d(String tag, String msg) {
if (mDebuggable >= LEVEL_DEBUG) {
Log.d(tag, msg);
}
}
/** 以级别为 i 的形式输出LOG */
public static void i(String tag, String msg) {
if (mDebuggable >= LEVEL_INFO) {
Log.i(tag, msg);
}
}
/** 以级别为 w 的形式输出LOG */
public static void w(String tag, String msg) {
if (mDebuggable >= LEVEL_WARN) {
Log.w(tag, msg);
}
}
/** 以级别为 e 的形式输出LOG */
public static void e(String tag, String msg) {
if (mDebuggable >= LEVEL_ERROR) {
Log.e(tag, msg);
}
}
/**---------------日志输出,未固定TAG end---------------**/
/**
* 以级别为 e 的形式输出msg信息,附带时间戳,用于输出一个时间段起始点
*
* @param msg
* 需要输出的msg
*/
public static void msgStartTime(String msg) {
mTimestamp = System.currentTimeMillis();
if (!TextUtils.isEmpty(msg)) {
e("[Started:" + mTimestamp + "]" + msg);
}
}
/** 以级别为 e 的形式输出msg信息,附带时间戳,用于输出一个时间段结束点* @param msg 需要输出的msg */
public static void elapsed(String msg) {
long currentTime = System.currentTimeMillis();
long elapsedTime = currentTime - mTimestamp;
mTimestamp = currentTime;
e("[Elapsed:" + elapsedTime + "]" + msg);
}
public static <T> void printList(List<T> list) {
if (list == null || list.size() < 1) {
return;
}
int size = list.size();
i("---begin---");
for (int i = 0; i < size; i++) {
i(i + ":" + list.get(i).toString());
}
i("---end---");
}
public static <T> void printArray(T[] array) {
if (array == null || array.length < 1) {
return;
}
int length = array.length;
i("---begin---");
for (int i = 0; i < length; i++) {
i(i + ":" + array[i].toString());
}
i("---end---");
}
}
package com.dayu.base.utils;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import com.dayu.base.R;
import java.util.List;
/**
* Created by luofan on 16/7/20.
*/
public class ProgressUtil {
private static final int START_DIALOG = 0;//开始对话框
private static final int UPDATE_DIALOG = 1;//更新对话框
private static final int STOP_DIALOG = 2;//销毁对话框
private static AlertDialog dialog = null;
private static TextView title = null;
private static Context context = null;
private static Handler handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
String message = "";
switch (msg.what) {
case START_DIALOG:// 启动加载框
message = (String) msg.obj;
if (dialog != null) {
stopLoad();
startLoad(context, message);
return;
}
init(context, message);
isTouchDismiss(true);
break;
case UPDATE_DIALOG:// 更新加载框
message = (String) msg.obj;
if (title.VISIBLE == View.VISIBLE) {
if (TextUtils.isEmpty(message)) {
title.setVisibility(View.GONE);
} else {
title.setText(message);
}
} else {
if (!TextUtils.isEmpty(message)) {
title.setText(message);
title.setVisibility(View.VISIBLE);
}
}
break;
case STOP_DIALOG:// 停止加载框
if (dialog != null) {
dialog.dismiss();
dialog.cancel();
dialog = null;
title = null;
}
break;
}
}
;
};
/**
* @方法说明:加载控件与布局
* @方法名称:init
* @返回值:void
*/
private static void init(Context context, String mssg) {
if (isBackground(context)) {// 如果程序在后台,则不加载
return;
}
if (null != context) {
LayoutInflater flat = LayoutInflater.from(context);
View v = flat.inflate(R.layout.dialog_loading_layout, null);
// v.setBackgroundColor(mContext.getResources().getColor(android.R.color.transparent));
// 创建对话
dialog = new AlertDialog.Builder(context, R.style.Dialog).create();
// 设置返回键点击消失对话框
dialog.setCancelable(true);
// 设置点击返回框外边不消失
dialog.setCanceledOnTouchOutside(true);
// 给该对话框增加系统权限
// dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
// 显示对话
dialog.show();
// 加载控件
title = (TextView) v.findViewById(R.id.loading_text);
if (TextUtils.isEmpty(mssg)) {
title.setVisibility(View.GONE);
} else {
title.setVisibility(View.VISIBLE);
title.setText(mssg);
}
// 必须放到显示对话框下面,否则显示不出效果
Window window = dialog.getWindow();
// window.getAttributes().x = 0;
// window.getAttributes().y = 0;//设置y坐标
WindowManager.LayoutParams params = window.getAttributes();
params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
// params.alpha = 0.6f;
window.setAttributes(params); // 加载布局组件
dialog.getWindow().setContentView(v);
}
}
/**
* @param
* @param msg
* @方法说明:启动对话框
* @方法名称:startLoad
* @返回值:void
*/
public static void startLoad(Context activity, String msg) {
context = activity;
if (context == null) {
return;
}
if (isBackground(context)) {// 如果程序在后台,则不加载
return;
}
Message mssage = new Message();
mssage.what = START_DIALOG;
mssage.obj = msg;
handler.sendMessage(mssage);
}
/**
* @param
* @方法说明:启动对话框
* @方法名称:startLoad
* @返回值:void
*/
public static void startLoad(Context activity) {
context = activity;
if (context == null) {
return;
}
if (isBackground(context)) {// 如果程序在后台,则不加载
return;
}
Message mssage = new Message();
mssage.what = START_DIALOG;
mssage.obj = "加载中...";
handler.sendMessage(mssage);
}
/**
* @param msg
* @方法说明:更新显示的内容
* @方法名称:UpdateMsg
* @返回值:void
*/
public static void UpdateMsg(String msg) {
Message message = new Message();
message.what = UPDATE_DIALOG;
message.obj = msg;
handler.sendMessage(message);
}
/**
* @param flag
* @方法说明:允许加载条转动的时候去点击系统返回键
* @方法名称:openCancelable
* @返回值:void
*/
public static void openCancelable(boolean flag) {
if (dialog != null) {
dialog.setCancelable(flag);
}
}
/**
* @param isdimiss
* @方法说明:允许点击对话框触摸消失
* @方法名称:isTouchDismiss
* @返回值:void
*/
public static void isTouchDismiss(boolean isdimiss) {
if (dialog != null) {
dialog.setCanceledOnTouchOutside(isdimiss);
}
}
/**
* @方法说明:让警告框消失
* @方法名称:dismiss
* @返回值:void
*/
public static void stopLoad() {
handler.sendEmptyMessage(STOP_DIALOG);
}
/**
* @param context
* @return
* @方法说明:判断当前应用程序是否后台运行
* @方法名称:isBackground
* @返回值:boolean
*/
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
// 后台运行
return true;
} else {
// 前台运行
return false;
}
}
}
return false;
}
}
package com.dayu.base.utils;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.StringRes;
import android.widget.Toast;
/**
* 吐司工具类
* on 2017/8/22.
*/
public class ToastUtils {
private ToastUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
private static Toast sToast;
private static Handler sHandler = new Handler(Looper.getMainLooper());
private static boolean isJumpWhenMore;
/**
* 吐司初始化
*
* @param isJumpWhenMore 当连续弹出吐司时,是要弹出新吐司还是只修改文本内容
* <p>{@code true}: 弹出新吐司<br>{@code false}: 只修改文本内容</p>
* <p>如果为{@code false}的话可用来做显示任意时长的吐司</p>
*/
public static void init(boolean isJumpWhenMore) {
ToastUtils.isJumpWhenMore = isJumpWhenMore;
}
/**
* 安全地显示短时吐司
*
* @param text 文本
*/
public static void showShortToastSafe(final CharSequence text) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(text, Toast.LENGTH_SHORT);
}
});
}
/**
* 安全地显示短时吐司
*
* @param resId 资源Id
*/
public static void showShortToastSafe(final @StringRes int resId) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(resId, Toast.LENGTH_SHORT);
}
});
}
/**
* 安全地显示短时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showShortToastSafe(final @StringRes int resId, final Object... args) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(resId, Toast.LENGTH_SHORT, args);
}
});
}
/**
* 安全地显示短时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showShortToastSafe(final String format, final Object... args) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(format, Toast.LENGTH_SHORT, args);
}
});
}
/**
* 安全地显示长时吐司
*
* @param text 文本
*/
public static void showLongToastSafe(final CharSequence text) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(text, Toast.LENGTH_LONG);
}
});
}
/**
* 安全地显示长时吐司
*
* @param resId 资源Id
*/
public static void showLongToastSafe(final @StringRes int resId) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(resId, Toast.LENGTH_LONG);
}
});
}
/**
* 安全地显示长时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showLongToastSafe(final @StringRes int resId, final Object... args) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(resId, Toast.LENGTH_LONG, args);
}
});
}
/**
* 安全地显示长时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showLongToastSafe(final String format, final Object... args) {
sHandler.post(new Runnable() {
@Override
public void run() {
showToast(format, Toast.LENGTH_LONG, args);
}
});
}
/**
* 显示短时吐司
*
* @param text 文本
*/
public static void showShortToast(CharSequence text) {
showToast(text, Toast.LENGTH_SHORT);
}
/**
* 显示短时吐司
*
* @param resId 资源Id
*/
public static void showShortToast(@StringRes int resId) {
showToast(resId, Toast.LENGTH_SHORT);
}
/**
* 显示短时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showShortToast(@StringRes int resId, Object... args) {
showToast(resId, Toast.LENGTH_SHORT, args);
}
/**
* 显示短时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showShortToast(String format, Object... args) {
showToast(format, Toast.LENGTH_SHORT, args);
}
/**
* 显示长时吐司
*
* @param text 文本
*/
public static void showLongToast(CharSequence text) {
showToast(text, Toast.LENGTH_LONG);
}
/**
* 显示长时吐司
*
* @param resId 资源Id
*/
public static void showLongToast(@StringRes int resId) {
showToast(resId, Toast.LENGTH_LONG);
}
/**
* 显示长时吐司
*
* @param resId 资源Id
* @param args 参数
*/
public static void showLongToast(@StringRes int resId, Object... args) {
showToast(resId, Toast.LENGTH_LONG, args);
}
/**
* 显示长时吐司
*
* @param format 格式
* @param args 参数
*/
public static void showLongToast(String format, Object... args) {
showToast(format, Toast.LENGTH_LONG, args);
}
/**
* 显示吐司
*
* @param resId 资源Id
* @param duration 显示时长
*/
private static void showToast(@StringRes int resId, int duration) {
showToast(UIUtils.getContext().getResources().getText(resId).toString(), duration);
}
/**
* 显示吐司
*
* @param resId 资源Id
* @param duration 显示时长
* @param args 参数
*/
private static void showToast(@StringRes int resId, int duration, Object... args) {
showToast(String.format(UIUtils.getContext().getResources().getString(resId), args), duration);
}
/**
* 显示吐司
*
* @param format 格式
* @param duration 显示时长
* @param args 参数
*/
private static void showToast(String format, int duration, Object... args) {
showToast(String.format(format, args), duration);
}
/**
* 显示吐司
*
* @param text 文本
* @param duration 显示时长
*/
private static void showToast(CharSequence text, int duration) {
if (isJumpWhenMore) cancelToast();
if (sToast == null) {
sToast = Toast.makeText(UIUtils.getContext(), text, duration);
} else {
sToast.setText(text);
sToast.setDuration(duration);
}
sToast.show();
}
/**
* 取消吐司显示
*/
public static void cancelToast() {
if (sToast != null) {
sToast.cancel();
sToast = null;
}
}
}
package com.dayu.base.utils;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Paint;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import com.dayu.base.common.BaseApplication;
/**
* 封装和ui相关的操作
* MrWang on
* 2017/8/20.
*/
public class UIUtils {
/**
* 得到上下文
*/
public static Context getContext() {
return BaseApplication.getContext();
}
/**
* 得到Resources对象
*/
public static Resources getResources() {
return getContext().getResources();
}
/**
*
*
*/
public static String getString(int resId) {
return getResources().getString(resId);
}
/**
* 得到String.xml中的字符串数组信息
*/
public static String[] getStrings(int resId) {
return getResources().getStringArray(resId);
}
/**
* 得到Color.xml中的颜色信息
*/
public static int getColor(int resId) {
return getResources().getColor(resId);
}
/**
* 得到应用程序的包名
*/
public static String getPackageName() {
return getContext().getPackageName();
}
/**
* 把一个dp的值转换为px值
*
* @param dp
* @return
*/
public int dp2px(int dp) {
// 获取手机屏幕的密度
float density = getResources().getDisplayMetrics().density;
return (int) (dp * density + 0.5f); // 加0.5是为了四舍五入
}
/**
* 判断TextView的内容宽度是否超出其可用宽度
*
* @param tv
* @return
*/
public static boolean isOverFlowed(TextView tv) {
int availableWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight();
Paint textViewPaint = tv.getPaint();
float textWidth = textViewPaint.measureText(tv.getText().toString()) / 2;
if (textWidth > availableWidth) {
return true;
} else {
return false;
}
}
public static void hideInput(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
}
package com.dayu.base.widgets;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import com.dayu.base.R;
/**
* Created by luofan on 2017/11/10.
*/
public class CustomDialog 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;
private int positiveColor;
private boolean flag;
private View line;
public CustomDialog(Context context) {
super(context);
this.mContext = context;
}
public CustomDialog(Context context, int themeResId, String content) {
super(context, themeResId);
this.mContext = context;
this.content = content;
}
public CustomDialog(Context context, int themeResId, String content, OnCloseListener listener) {
super(context, themeResId);
this.mContext = context;
this.content = content;
this.listener = listener;
}
protected CustomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
this.mContext = context;
}
public CustomDialog setTitle(String title) {
this.title = title;
return this;
}
public CustomDialog setPositiveButton(String name) {
this.positiveName = name;
return this;
}
public CustomDialog setPositiveButtonColor(int colorId) {
this.positiveColor = colorId;
return this;
}
public CustomDialog setNegativeButton(String name) {
this.negativeName = name;
return this;
}
public CustomDialog setOneButton(boolean flag) {
this.flag = flag;
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_custom);
setCanceledOnTouchOutside(false);
setCancelable(false);
initView();
}
private void initView() {
contentTxt = (TextView) findViewById(R.id.content);
titleTxt = (TextView) findViewById(R.id.title);
line = findViewById(R.id.v_line);
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 (positiveColor != 0) {
submitTxt.setTextColor(positiveColor);
}
if (!TextUtils.isEmpty(negativeName)) {
cancelTxt.setText(negativeName);
}
if (!TextUtils.isEmpty(title)) {
titleTxt.setText(title);
}
if (flag) {
line.setVisibility(View.GONE);
cancelTxt.setVisibility(View.GONE);
}
}
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.cancel) {
if (listener != null) {
listener.onClick(this, false);
}
this.dismiss();
} else if (i == R.id.submit) {
if (listener != null) {
listener.onClick(this, true);
}
this.dismiss();
}
}
public interface OnCloseListener {
void onClick(Dialog dialog, boolean confirm);
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="8dp"/>
<solid android:color="@color/cl_white"/>
</shape>
\ 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:angle="270.0"
android:centerColor="#99000000"
android:centerY="0.5"
android:endColor="#99000000"
android:startColor="#99000000" >
</gradient>
<corners android:radius="5dip" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp" />
</shape>
\ No newline at end of file
<animated-rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="50%" android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="720">
<shape
android:shape="ring"
android:innerRadiusRatio="3"
android:thicknessRatio="15"
android:useLevel="false">
<gradient
android:type="sweep"
android:useLevel="false"
android:startColor="#55c6c6c6"
android:centerColor="#c6c6c6"
android:centerY="0.50"
android:endColor="#c6c6c6" />
</shape>
</animated-rotate>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:background="@drawable/item_shape"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="20dp"
android:text="@string/notice"
android:textColor="#FF030303"
android:textSize="17sp" />
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:lineSpacingExtra="3dp"
android:textColor="#FF030303"
android:textSize="13sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/cl_selector_hui" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<TextView
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="@string/cancle"
android:textColor="@color/cl_receiving_order_item_data"
android:textSize="17sp" />
<View
android:id="@+id/v_line"
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/cl_selector_hui" />
<TextView
android:id="@+id/submit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="@string/comfirm"
android:textColor="@color/cl_receiving_order_item_data"
android:textSize="17sp" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_dialog"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="80dip"
android:layout_height="80dip"
android:layout_centerInParent="true"
android:background="@drawable/loading_progress_bg"
android:gravity="center"
android:orientation="vertical">
<ProgressBar
android:layout_width="45dp"
android:layout_height="45dp"
android:indeterminateDrawable="@drawable/progressbar"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/loading_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="12sp"
android:text="@string/loading"
android:textColor="#9a9b98"/>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="cl_white">#ffffff</color>
<color name="cl_primarydark">#303F9F</color>
<color name="cl_accent">#ff00</color>
<color name="cl_text">#8a8a8a</color>
<color name="cl_black">#88000000</color>
<color name="cl_login_clearedittext_hint">#BBBBBB</color>
<color name="cl_home_title_text_color">#3a3a3a</color>
<color name="cl_home_circleimageview_bg">#d7edff</color>
<color name="cl_home_listview_bg">#f5f5f5</color>
<color name="cl_order_item_line_bg">#e5e5e5</color>
<color name="cl_order_item_date">#00c45d</color>
<color name="cl_receiving_order_item_data">#3faafc</color>
<color name="cl_tab_yellow">#ffbe2d</color>
<color name="cl_tab_read">#ff5a4b</color>
<color name="cl_tab_init">#585858</color>
<color name="cl_tab_line">#8a8a8a</color>
<color name="cl_selector_hui">#bbbbbb</color>
<color name="cl_work_raiod">#d5d5d5</color>
<color name="cl_personal_center">#fafafa</color>
<color name="cl_home_button">#3e96e2</color>
<color name="cl_home_edit_text">#cccccc</color>
<color name="cl_order_text_title">#000000</color>
<color name="cl_order_text_one">#888888</color>
<color name="primary">#5C92FC</color>
<color name="line_color">#dddddd</color>
<color name="text_color">#8a8a8a</color>
<color name="default_text_color">#FF2D2D2D</color>
<color name="default_editext_color">#FF959595</color>
<color name="cl_line">#FFE3E3E3</color>
<color name="cl_bg">#FFF5F5F5</color>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="sp_1">12sp</dimen>
<dimen name="size_text_title">16sp</dimen>
<dimen name="sp_16">16sp</dimen>
<dimen name="size_login_clearedittext_text">15sp</dimen>
<dimen name="sp_15">15sp</dimen>
<dimen name="size_login_register_button_text">14sp</dimen>
<dimen name="sp_14">14sp</dimen>
<dimen name="size_login_hint_text">13.3sp</dimen>
<dimen name="sp_13.3">13.3sp</dimen>
<dimen name="sp_12">12sp</dimen>
<dimen name="size_order_item_data_text">24sp</dimen>
<dimen name="size_login_button_text">15sp</dimen>
<dimen name="size_main_title">60dp</dimen>
<dimen name="size_title_ml">13.3dp</dimen>
<dimen name="size_login_mlcircleimageview_width">80dp</dimen>
<dimen name="size_login_mlcircleimageview_height">80dp</dimen>
<dimen name="size_login_mlcircleimageview_mt">80dp</dimen>
<dimen name="size_login_linear_width">326dp</dimen>
<dimen name="size_login_linear_height">106dp</dimen>
<dimen name="size_login_linear_mt">210dp</dimen>
<dimen name="size_login_clearedittext_mr">15dp</dimen>
<dimen name="size_login_clearedittext_dp">12dp</dimen>
<dimen name="size_login_clearedittext_pl">17dp</dimen>
<dimen name="size_login_pwd_edittext_dp">12dp</dimen>
<dimen name="size_login_pwd_edittext_pl">17dp</dimen>
<dimen name="size_login_register_button_mb">15dp</dimen>
<dimen name="size_login_register_button_mr">10dp</dimen>
<dimen name="size_login_button_weidth">327dp</dimen>
<dimen name="size_login_button_mt">57dp</dimen>
<dimen name="size_login_hint_mt">17dp</dimen>
<dimen name="size_home_circleimageview_width">40dp</dimen>
<dimen name="size_home_circleimageview_height">40dp</dimen>
<dimen name="size_home_circleimageview_ml">20dp</dimen>
<dimen name="size_home_circleimageview_border">2dp</dimen>
<dimen name="size_home_circleimageview_image_width">32dp</dimen>
<dimen name="size_home_circleimageview_image_height">32dp</dimen>
<dimen name="size_home_circleimageview_image_mr">13dp</dimen>
<dimen name="size_order_item_width">333dp</dimen>
<dimen name="size_order_item_height">100dp</dimen>
<dimen name="size_order_item_mt">13dp</dimen>
<dimen name="size_order_item_line_width">0.7dp</dimen>
<dimen name="size_order_item_line_height">67dp</dimen>
<dimen name="size_order_item_line_ml">89dp</dimen>
<dimen name="size_order_item_time_mr">12dp</dimen>
<dimen name="size_order_item_time_mt">20dp</dimen>
<dimen name="size_order_item_data_mr">12dp</dimen>
<dimen name="size_order_item_tool_ml">14dp</dimen>
<dimen name="size_order_item_tool_mt">23dp</dimen>
<dimen name="size_order_item_gps_ml">14dp</dimen>
<dimen name="size_order_item_gps_mt">47dp</dimen>
<dimen name="size_order_item_tooltext_ml">8dp</dimen>
<dimen name="size_order_item_tooltext_mt">20dp</dimen>
<dimen name="size_order_item_gpstext_ml">8dp</dimen>
<dimen name="size_order_item_gpstext_mt">43dp</dimen>
<dimen name="_24">24dp</dimen>
<dimen name="size_order_item_time_text">12sp</dimen>
<dimen name="sp_30">30sp</dimen>
<dimen name="sp_10">10sp</dimen>
<dimen name="sp_8">8sp</dimen>
<dimen name="dp_0.23">0.23dp</dimen>
<dimen name="dp_0.7">1dp</dimen>
<dimen name="dp_40">40dp</dimen>
<dimen name="dp_21.3">21dp</dimen>
<dimen name="dp_20">20dp</dimen>
<dimen name="dp_30">30dp</dimen>
<dimen name="dp_13.3">13.3dp</dimen>
<dimen name="dp_16.7">17dp</dimen>
<dimen name="dp_14.3">14dp</dimen>
<dimen name="dp_105">106dp</dimen>
<dimen name="dp_160">160dp</dimen>
<dimen name="dp_333">333dp</dimen>
<dimen name="dp_6">6dp</dimen>
<dimen name="dp_10">10dp</dimen>
<dimen name="dp_54">54dp</dimen>
<dimen name="dp_183">183dp</dimen>
<dimen name="dp_27">27dp</dimen>
<dimen name="dp_33">33dp</dimen>
<dimen name="dp_267">267dp</dimen>
<dimen name="dp_147">147dp</dimen>
<dimen name="dp_3">3dp</dimen>
<dimen name="dp_8">8dp</dimen>
<dimen name="dp_17">17dp</dimen>
<dimen name="dp_314">314dp</dimen>
<dimen name="dp_163">163dp</dimen>
<dimen name="dp_11">11dp</dimen>
<dimen name="dp_13">13dp</dimen>
<dimen name="dp_15">15dp</dimen>
<dimen name="dp_0.3">0.3dp</dimen>
<dimen name="dp_12">12dp</dimen>
<dimen name="dp_26">26dp</dimen>
<dimen name="dp_125">125dp</dimen>
<dimen name="dp_61">61dp</dimen>
<dimen name="dp_205">205dp</dimen>
<dimen name="dp_57">57dp</dimen>
<dimen name="dp_31">31dp</dimen>
<dimen name="dp_29">29dp</dimen>
<dimen name="dp_41">41dp</dimen>
<dimen name="dp_7">7dp</dimen>
<dimen name="dp_18">18dp</dimen>
<dimen name="dp_53">53dp</dimen>
<dimen name="dp_16">16dp</dimen>
<dimen name="dp_14">14dp</dimen>
<dimen name="dp_162">162dp</dimen>
<dimen name="dp_327">327dp</dimen>
<dimen name="dp_197">197dp</dimen>
<dimen name="dp_50">50dp</dimen>
<dimen name="dp_34">34dp</dimen>
<dimen name="dp_60">60dp</dimen>
<dimen name="dp_65">65dp</dimen>
<dimen name="dp_70">70dp</dimen>
<dimen name="dp_9">9dp</dimen>
<dimen name="dp_89">89dp</dimen>
<dimen name="dp_80">80dp</dimen>
<dimen name="dp_111">111dp</dimen>
<dimen name="dp_133">133dp</dimen>
<dimen name="dp_23">23dp</dimen>
</resources>
\ No newline at end of file
<resources>
<string name="app_name">BaseLibrary</string>
<string name="tv_dayu">大鱼工程师</string>
<string name="tv_start_page_text">©&#160;2017&#160;大鱼智能&#160;版权所有</string>
<string name="tv_login_title">大鱼工程师</string>
<string name="tv_fonts">fonts/DIN Alternate Bold.ttf</string>
<string name="tv_login_register_text">暂不接受个人用户注册</string>
<string name="tv_login_button_text">&#160;</string>
<string name="tv_login_register_button_text">获取验证码</string>
<string name="tv_login_register_hint">请输入六位验证码</string>
<string name="tv_login_phone_editext_hint">请输入手机号</string>
<string name="tv_order_item_time">今天</string>
<string name="tv_order_item_date">10:36</string>
<string name="tv_order_item_tool_text">维修</string>
<string name="tv_order_item_user_name">王尼玛</string>
<string name="tv_order_item_user_phone">17310890230</string>
<string name="tv_order_item_tool_text_leixing">空调</string>
<string name="tv_order_item_gps_text">海淀区知春路万达广场金地花园公寓10层1809室</string>
<string name="tv_work_order">已完成0/5</string>
<string name="tv_work_order_one">工单详情</string>
<string name="tv_work_order_two">预约上门</string>
<string name="tv_work_order_three">我已出发</string>
<string name="tv_work_order_four">开始服务</string>
<string name="tv_work_order_five">服务记录</string>
<string name="tv_work_order_six">客户验收</string>
<string name="tv_person_center_name">暂无姓名</string>
<string name="tv_person_center_sex">性别:</string>
<string name="tv_person_center_sex_value">暂无</string>
<string name="tv_person_center_age_value">暂无</string>
<string name="tv_person_center_phone">暂无</string>
<string name="tv_person_center_fen">3.5分</string>
<string name="tv_person_center_jinriyeji">今日业绩(元)</string>
<string name="tv_person_center_jinrijiedan">账户余额</string>
<string name="tv_person_center_jinriyeji_value">8</string>
<string name="tv_login">&#160;</string>
<string name="tv_exit_login">退&#160;&#160;&#160;&#160;&#160;</string>
<string name="tv_person_center_leijiyeji">累计业绩(元)</string>
<string name="tv_person_center_gongdanjilu">工单记录(已服务)</string>
<string name="tv_time_text_time">&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="tv_time_text_time_time">&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="tv_time_text_subscribe_remark">预约备注</string>
<string name="tv_time_text_subscribe_serve">服务记录</string>
<string name="tv_time_text_confirm_subscribe">确定预约</string>
<string name="tv_time_text_edit_text">最多录入200字</string>
<string name="tv_home_loading_text">暂无工单</string>
<string name="tv_home_tab_one_phone">拨打电话</string>
<string name="tv_home_tab_one_subscribe_time">预约时间</string>
<string name="tv_home_tab_updata_subscribe_time">修改预约时间</string>
<string name="tv_home_tab_updata_subscribe_data">请输入预约日期</string>
<string name="tv_home_tab_updata_subscribe_time_two">请输入预约时间</string>
<string name="tv_home_tab_start">我已出发</string>
<string name="tv_home_updata_cause">修改原因</string>
<string name="tv_order_list_num">待接单列表(</string>
<string name="tv_order_eg">工单概况</string>
<string name="tv_two_text_one">客户类型</string>
<string name="tv_two_text_two">客户姓名</string>
<string name="tv_two_text_three">联系方式</string>
<string name="tv_two_text_foure">客户地址</string>
<string name="tv_tab_two_order">处理工单</string>
<string name="item_restart">需要再次上门</string>
<string name="up_door_reason">上门原因</string>
<string name="wait">等待验收</string>
<string name="order_pm">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="order_pm_text">请输入产品类型</string>
<string name="order_pinpai">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="order_pinpai_text">请输入品牌</string>
<string name="order_xinghao">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="order_xuliehaoma">序列号码</string>
<string name="order_goumai_date">购买日期</string>
<string name="order_serve_type">服务类型</string>
<string name="order_photo_text">服务照片(故障及解决照片,限5张)</string>
<string name="order_hint">故障现象或服务需求描述,及解决方案描述,若没有解决请说明原因。</string>
<string name="tv_about">关于我们</string>
<string name="tv_about_us">客服扫码关注我们的微信服务号</string>
<string name="tv_about_us_text">&#160;&#160;&#160;&#160;传统低效的客服体系,正在成为厂商、服务商、消费者的包袱。大鱼准备以科技之力进行客服产业革命。运用Ai、云和大数据等技术,连接厂商、销售商、服务商和消费者,打造去中心化的智能共享客户服务解决方案。</string>
<string name="tv_about_dayu">大鱼创想&#160;&#160;版权所有</string>
<string name="tv_about_user_feiyong">收取客户费用(元)</string>
<string name="tv_order_updoor_feiyong">上门费</string>
<string name="tv_order_serve_feiyong">服务费</string>
<string name="tv_order_yuan">(元)</string>
<string name="tv_order_cailiao_feiyong">材料费</string>
<string name="tv_order_other_feiyong">其他费</string>
<string name="tv_order_other">请输入上门费用备注信息</string>
<string name="input_up_door_money">请输入上门费用</string>
<string name="input_up_money">请输入服务费用</string>
<string name="input_cailiao_money">请输入材料费用</string>
<string name="input_other_money">请输入其他费用</string>
<string name="tv_save_back">保存</string>
<string name="tv_idea">反馈意见</string>
<string name="tv_idea_text_hint">请输入您的宝贵意见</string>
<string name="tv_apply_reson_hint">请填写申请内容,数量和申请原因</string>
<string name="tv_refuse_hint">请填写拒绝理由</string>
<string name="tv_message">系统通知</string>
<string name="title_account_balance">账户余额</string>
<string name="title_account_balance_right">提现账户</string>
<string name="get_account_list_error">获取账户列表失败!</string>
<string name="error_serve">服务器异常!</string>
<string name="error_loadmore">亲,已经到最底部了!</string>
<!--提现账户-->
<string name="title_withdrawals">提现账户</string>
<string name="alipay_account">支付宝账号</string>
<string name="input_alipay_account">请输入支付宝账号</string>
<string name="alipay_name">支付宝姓名</string>
<string name="input_alipay_name">请输入支付宝姓名</string>
<string name="alipay_phone">支付宝手机</string>
<string name="input_alipay_phone">请输入支付宝手机</string>
<string name="comfirm">确定</string>
<string name="alipay_account_null">支付宝账号不能为空!</string>
<string name="alipay_name_null">支付宝姓名不能为空!</string>
<string name="alipay_phone_null">支付宝手机不能为空!</string>
<string name="alipay_phone_error">请输入正确的手机号!</string>
<string name="comfirm_alipay_account_error">绑定提现账户失败!</string>
<string name="comfirm_alipay_account_success">绑定提现账户成功!</string>
<string name="modify_alipay_account_success">修改提现账户成功!</string>
<string name="modify_alipay_account_error">修改提现账户失败!</string>
<string name="get_alipay_error">获取账户信息失败!</string>
<string name="modify_alipay_info">修改账户信息</string>
<!--登录-->
<string name="login_sms_success">验证码已发送,请注意查收</string>
<string name="login_voice_sms_success">语音验证码已发送,请注意查收</string>
<string name="phone_num_not_null">手机号不能为空!</string>
<string name="please_input_phone_right">请输入正确的手机号!</string>
<string name="phone_sms_not_null">手机号或验证码不能为空!</string>
<string name="notice">提示</string>
<string name="no_permission">没有此权限将无法使用本app,请在设置中打开权限!</string>
<string name="login_state_no">登录状态已失效,请重新登录!</string>
<string name="login_again">重新登录</string>
<string name="submit_again">重新提交</string>
<string name="please_open__permission">没有此权限将无法使用此app,请允许权限打开。</string>
<string name="cancle">取消</string>
<string name="go_setting">前往设置</string>
<string name="iknown">我知道了</string>
<string name="login_agreement">登录即表示同意此</string>
<string name="title_agreement">用户协议</string>
<string name="agreement_detail">《用户协议》</string>
<string name="login_faile">登录失败</string>
<string name="send_code_faile">发送验证码失败</string>
<string name="voice_code_notice">收不到短信?试试语音验证</string>
<string name="schedule">日程</string>
<string name="order">工单</string>
<string name="home_receive_order">接单</string>
<string name="message">消息</string>
<string name="personal">我的</string>
<string name="on_develop">此功能正在紧张的开发中…</string>
<string name="coming_soon">敬请期待!</string>
<!--工单-->
<string name="order_title">我的工单</string>
<string name="order_history">工单历史</string>
<string name="webview_title">SOP</string>
<string name="order_not_exite">该订单不存在</string>
<string name="get_info_failed">获取数据失败</string>
<string name="no_appointment">无预期</string>
<string name="have_appointment">客户预期</string>
<string name="no_customer">无联系人</string>
<string name="no_server">无服务要求</string>
<string name="today">今天</string>
<string name="tomorrow">明天</string>
<string name="receive_order">接单</string>
<string name="not_receive_order">未接单</string>
<string name="appointment_time">预约时间</string>
<string name="modify_appointment_time">修改预约时间</string>
<string name="have_go_on">我已出发</string>
<string name="begain_server">开始服务</string>
<string name="process_order">处理工单</string>
<string name="check_upon_delivery">[等待验收]</string>
<string name="order_finish">[已完成]</string>
<string name="order_cancle">[已取消]</string>
<string name="receive_time_out">[接单超时]</string>
<string name="appointment_time_out">[预约超时]</string>
<string name="delivery_time_out">[验收超时]</string>
<string name="server_time_out">[服务超时]</string>
<string name="need_again_door">需要再次上门</string>
<string name="waite_appointemnt">待预约</string>
<string name="waite_server">待服务</string>
<string name="order_exception">异常单</string>
<string name="cancle_order">已取消</string>
<string name="appointment_already">已预约</string>
<string name="not_appointment_already">未预约</string>
<string name="order_doing">进行中</string>
<string name="finish_order">已完成</string>
<string name="order_close">订单关闭</string>
<string name="personal_customer">个人客户</string>
<string name="enterprise_customer">企业客户</string>
<string name="no_branch">暂无品牌</string>
<string name="no_model">暂无型号</string>
<string name="honai">保内</string>
<string name="warranty">保外</string>
<string name="element"></string>
<string name="remarks">暂无备注</string>
<string name="stop">收起</string>
<string name="look_more">查看更多</string>
<string name="no_record">暂无记录</string>
<string name="order_detail">工单详情</string>
<string name="server_record">服务记录</string>
<string name="order_part">备件信息</string>
<string name="return_one_order_part">寄回一个备件</string>
<string name="apply_one_order_part">申请一个备件</string>
<string name="order_instruction">服务说明</string>
<string name="open_webview">浏览器打开</string>
<string name="select_webview">请选择浏览器</string>
<string name="history_order">历史工单</string>
<string name="order_commite_success">数据提交成功</string>
<string name="receive_order_success">接单成功</string>
<string name="choose_file">文件选择</string>
<string name="choose_pic">图片选择</string>
<string name="look_order">查看工单</string>
<string name="sop_finish">标准操作已完成,点击此处进行查看或修改</string>
<string name="now_no">暂无</string>
<string name="submit_order">提交验收</string>
<string name="find_customer_mobile">搜索客户手机号</string>
<string name="pre_look">预览</string>
<string name="loading">加载中</string>
<string name="order_subsidy">工单补贴</string>
<string name="order_save_success">数据保存成功</string>
<string name="no_data">暂无数据</string>
<string name="application_order_part">申请备件</string>
<string name="return_order_part">寄回备件</string>
<string name="ka_address">收货地址</string>
<string name="ka_name">收货人</string>
<string name="ka_mobile">联系方式</string>
<string name="ka_receive_address">收货地址</string>
<string name="tv_refuse_order_title">拒绝申请</string>
<string name="tv_apply_order_title">申请备件</string>
<string name="tv_apply_instruction">申请说明:</string>
<string name="tv_apply_name">申请人:</string>
<string name="tv_apply_mobile">联系方式:</string>
<string name="tv_apply_time">申请时间:</string>
<string name="refuse_apply_reason">拒绝原因:</string>
<string name="tv_ka_instruction">厂商说明:</string>
<string name="tv_sp_instruction">服务商说明:</string>
<string name="tv_ka_name">发货人:</string>
<string name="tv_need_return">需要寄回:</string>
<string name="tv_part_num">快递单号:</string>
<string name="ka_beizhu">厂商备注</string>
<string name="sp_beizhu">服务商备注</string>
<string name="couries_company">快递公司</string>
<string name="couries_company_name">快递公司:</string>
<string name="couries_num">快递单号</string>
<string name="ka_info">厂商收货信息</string>
<string name="sp_beizhu_hint">请说明寄回内容,数量和寄回原因</string>
<string name="couries_company_hint">请选择快递公司</string>
<string name="couries_num_hint">请输入单号</string>
<string name="part_apply">申请中</string>
<string name="part_refuse">已拒绝</string>
<string name="part_transfortion">运输中</string>
<string name="part_received">已收货</string>
<string name="need">需要</string>
<string name="not_need">不需要</string>
<string name="cancle_apply">取消申请</string>
<string name="logistics_info">物流信息</string>
<string name="receive_part">收到备件</string>
<string name="cannot_return">无法寄回?</string>
<string name="part_cancle_reason">取消之后不可复原,请谨慎操作</string>
<string name="part">备件</string>
<string name="send_already">已发货</string>
<string name="modify_part_info">修改信息</string>
<string name="customer_acceptance">客户验收</string>
<string name="scan_code_for_appointment">请扫描二维码验收</string>
<!--消息-->
<string name="message_system">系统通知</string>
<string name="message_dayu">大鱼通知</string>
<string name="message_dayu_detail">大鱼系统通知详情</string>
<string name="no_notice">暂无通知</string>
<string name="not_read">未读</string>
<!--我的-->
<string name="man"></string>
<string name="female"></string>
<string name="unknown">未知</string>
<string name="age"></string>
<string name="score"></string>
<string name="not_set_account">您还没有设置账户</string>
<string name="not_set_up">暂不设置</string>
<string name="go_set_up">前往设置</string>
<string name="money"></string>
<string name="zero_money">0 元</string>
<string name="input_feedback">请输入反馈意见…</string>
<string name="input_content">请输入内容</string>
<string name="commite_success">提交成功</string>
<string name="on_download">正在下载中,请稍后…</string>
<string name="download_faile">下载失败</string>
<string name="have_new_version">有新版本</string>
<string name="next_again">下次再说</string>
<string name="need_upglude">立刻升级</string>
<string name="start_download">开始下载</string>
<string name="new_version">版本更新</string>
<string name="sure_clear_data">确定要删除所有缓存数据吗?</string>
<string name="on_clear">正在清理…</string>
<string name="clear_success">清理完成</string>
<string name="newversion_code">新版本号为:</string>
<string name="is_newversion">当前为最新版本,无需更新</string>
<string name="subcribe_time_success">预约时间成功,请移至带服务列表查看</string>
<string name="input_day_first">请先输入日期</string>
<string name="input_right_time">请选择合法的时间</string>
<string name="input_subcribe_time">请输入预约时间</string>
<string name="input_subcribe_info">请输入预约信息</string>
<string name="input_day_time">请输入日期和时间</string>
<string name="on_commite_data">正在提交数据…</string>
<string name="no_emoij">禁止输入表情</string>
<string name="receive_list">待接单列表</string>
<string name="submit">提交</string>
<string name="personal_center">个人中心</string>
<string name="zero_score">0分</string>
<string name="setting_center">设置中心</string>
<string name="message_notice">通知提醒</string>
<string name="clear_cache">清理缓存</string>
<string name="check_update">检测更新</string>
<string name="customer_server_mobile">客服电话</string>
<string name="abount_us">关于我们</string>
<string name="problem_feedback">问题反馈</string>
<string name="personal_info">个人资料</string>
<string name="modify_personal_info">修改资料</string>
<string name="submission_of_audit">提交审核</string>
<string name="title_my_header">我的头像</string>
<string name="modify_header_iv">修改头像</string>
<string name="header_pic">头像</string>
<string name="person_mobile">手机号码</string>
<string name="real_name">真实姓名</string>
<string name="person_identity">身份证号</string>
<string name="person_identity_audite">身份认证</string>
<string name="identity_unaudite">未通过</string>
<string name="identity_audited">已认证</string>
<string name="person_identity_pic">身份证照片</string>
<string name="commite_identity_pic">上传身份证照片</string>
<string name="commite_pic_zero">已上传0/1张</string>
<string name="commite_pic_one">已上传1/1张</string>
<string name="one_pic_most">最多只能选择一张照片</string>
<string name="reminder">温馨提示</string>
<string name="reminder_content">"·请上传真实清晰完整的手持身份证照片\n·若认证失败,可修改认证信息后再次提交"</string>
<string name="name_not_empty">真实姓名不能为空</string>
<string name="identity_not_empty">身份证号不能为空</string>
<string name="identity_error">请输入正确的身份证号码</string>
<string name="identityurl_not_empty">身份证照片不能为空</string>
<!--error-->
<string name="not_show">not_show</string>
<string name="error_token">token失效</string>
<string name="error_time_out">连接服务器超时</string>
<string name="error_connect">连接服务器失败</string>
<string name="error_internet">网络错误</string>
<string name="error_parse">解析错误</string>
<string name="error_ssl">证书验证错误</string>
<string name="error_connect_time">连接超时</string>
<string name="error_unknow">未知错误</string>
<string name="engineer_identity_auditing">您的身份认证正在审核中,请耐心等待</string>
<string name="engineer_identity_not_audite">您的身份认证审核未通过,请重新修改再次提交</string>
<string name="engineer_not_have_site">您目前没有工作站,加入工作站之后才能接单</string>
<string name="audite_tip">资料已经提交审核\n审核结果会通过短信通知您</string>
<string name="audite_tip_title">提交成功</string>
<string name="audite_tip_submite_title">重新提交</string>
<string name="audite_tip_submite">修改资料需要大鱼客服重新审核\n您确定要修改吗?</string>
<string name="think_again">我再想想</string>
<string name="identity_not_audite">审核未通过</string>
<string name="engineer_acount_notavialibe">工程师账号不存在</string>
<string name="user_on_blackilst">用户被列入黑名单</string>
<string name="not_engineer">该账号尚不是工程师</string>
<string name="account_frozen">该账号冻结</string>
<string name="sms_code_error">验证码错误</string>
<string name="sms_code_unsend_or_expire">验证码未发送或已过期</string>
<string name="order_cancle_not_receive">工单已取消,无法接单</string>
<string name="order_cancle_not_subcribe">工单已取消,无法预约时间</string>
<string name="order_cancle_not_begin">工单已取消,不能上门了</string>
<string name="order_cancle_not_process">工单已取消,不能处理了</string>
<string name="query_logistics_failed">查询物流信息失败</string>
<string name="order_receive_already">已被接单,请选择其他工单</string>
<string name="perameter_is_null">参数为空</string>
<string name="identity_is_error">身份证号不合法</string>
<string name="not_audite_aviliable">该工程师不处于审核拒绝状态</string>
</resources>
<resources>
<style name="Dialog" parent="@android:style/Theme.Holo.Dialog">
<item name="android:windowSoftInputMode">stateHidden|adjustResize</item>
<!-- 边框 -->
<item name="android:windowFrame">@null</item>
<!-- 是否浮现在activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 半透明 -->
<item name="android:windowIsTranslucent">false</item>
<!-- 无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 模糊 -->
<item name="android:backgroundDimEnabled">false</item>
</style>
<style name="CustomDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowSoftInputMode">stateHidden|adjustResize</item>
<item name="android:windowFrame">@null</item>
<!-- Dialog的windowFrame框为无 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否漂现在activity上 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 是否半透明 -->
<item name="android:windowNoTitle">true</item>
<item name="android:background">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<!-- 去除黑色边框的关键设置项 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 屏幕背景是否变暗 -->
<item name="android:backgroundDimAmount">0.3</item>
</style>
</resources>
package com.dayu.base;
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() throws Exception {
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 {
ext.kotlin_version = '1.2.10'
ext.gradle_version = '3.0.1'
repositories {
jcenter()
......@@ -10,7 +9,6 @@ buildscript {
dependencies {
classpath "com.android.tools.build:gradle:$gradle_version"
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
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 sign in to comment