Commit 60be48b9 by 罗翻

增加provider

parent 00356c56
Showing with 5293 additions and 0 deletions
apply plugin: 'com.android.library'
android {
compileSdkVersion compile_sdk_version
buildToolsVersion build_tools_version
defaultConfig {
minSdkVersion min_sdk_version
targetSdkVersion target_sdk_version
versionCode version_code
versionName verson_name
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
dataBinding {
enabled = true
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:design:26.1.0'
//mutidex
compile 'com.android.support:multidex:1.0.2'
//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 'com.github.LuckSiege.PictureSelector:picture_library:v2.1.5'
//ARouter
compile "com.alibaba:arouter-api:$arouter_api_version"
}
# 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
package com.dayu.baselibrary;
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.baselibrary.test", appContext.getPackageName());
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dayu.baselibrary">
</manifest>
package com.dayu.base.api;
import android.net.ParseException;
import com.dayu.baselibrary.R;
import com.dayu.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 io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.Streaming;
import retrofit2.http.Url;
/**
* Created by luofan on 2017/11/09.
*/
public interface APIService {
@Streaming
@GET
Observable<ResponseBody> download(@Url String url);
}
package com.dayu.base.api;
import android.text.TextUtils;
import com.dayu.base.api.protocol.BaseResponse;
import com.dayu.common.BaseConstant;
import com.dayu.common.Constants;
import com.dayu.utils.LogUtils;
import com.dayu.utils.SPUtils;
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();
String token = (String) SPUtils.get(BaseConstant.TOKEN, "");
if (!TextUtils.isEmpty(token) && !request.url().toString().contains(Constants.BASE_URL + Constants.LOGIN_URL)) {
request = request.newBuilder()
.header(BaseConstant.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 android.app.IntentService;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import com.dayu.utils.DownloadManager;
import com.dayu.widgets.listener.onDownloadListener;
import io.reactivex.disposables.CompositeDisposable;
/**
* An {@link IntentService} subclass for handling asynchronous task requests in
* a service on a separate handler thread.
* <p>
*/
public class DownloadService extends IntentService {
private static final String ACTION_DOWNLOAD = "intentservice.action.download";
private static final String DOWNLOAD_URL = "downloadUrl";
private static final String APK_PATH = "apkPath";
private static onDownloadListener mListener;
private CompositeDisposable cd = new CompositeDisposable();
private NotificationCompat.Builder builder;
private NotificationManager notificationManager;
public DownloadService() {
super("DownloadService");
}
public static void startUpdateService(Context context, String url, String apkPath, onDownloadListener listener) {
Intent intent = new Intent(context, DownloadService.class);
intent.setAction(ACTION_DOWNLOAD);
intent.putExtra(DOWNLOAD_URL, url);
intent.putExtra(APK_PATH, apkPath);
context.startService(intent);
mListener = listener;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
String action = intent.getAction();
if (ACTION_DOWNLOAD.equals(action)) {
String url = intent.getStringExtra(DOWNLOAD_URL);
String apkPath = intent.getStringExtra(APK_PATH);
handleUpdate(url, apkPath);
}
}
}
private void handleUpdate(String url, String apkPath) {
DownloadManager.download(this, url, apkPath, cd, mListener);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
package com.dayu.base.api;
import com.dayu.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.baselibrary.R;
import com.dayu.common.BaseApplication;
import com.dayu.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.ui.activity;
import android.content.Intent;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import com.alibaba.android.arouter.launcher.ARouter;
import com.dayu.base.ui.presenter.BasePresenter;
import com.dayu.baselibrary.R;
import com.dayu.common.BaseApplication;
import com.dayu.common.BaseConstant;
import com.dayu.common.BaseView;
import com.dayu.common.Constants;
import com.dayu.utils.ProgressUtil;
import com.dayu.utils.TUtil;
import com.dayu.utils.ToastUtils;
import com.dayu.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 DataBindingActivity<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) {
mPresenter = TUtil.getT(this, 0);
if (mPresenter != null) {
mPresenter.setView(this);
setPresenter();
}
}
ARouter.getInstance().inject(this);
}
/**
* databing设置presenter.
*/
public abstract void setPresenter();
@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();
BaseApplication.getBaseApp().exiteAllActivity();
ARouter.getInstance().build(BaseConstant.PATH_LOGIN).navigation();
}
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;
import com.umeng.analytics.MobclickAgent;
public abstract class DataBindingActivity<B extends ViewDataBinding> extends AppCompatActivity {
public Activity mActivity;
public B mBind;
private 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();
}
@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);
}
protected void initPresenter() {
}
public abstract int getLayoutId();
public abstract void initView();
}
package com.dayu.base.ui.adapter;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
/**
* Created by luofan on 2017/12/9.
*/
public class BaseViewHolder<B extends ViewDataBinding> extends RecyclerView.ViewHolder {
public final B mBind;
public BaseViewHolder(B t) {
super(t.getRoot());
mBind = t;
}
}
package com.dayu.base.ui.adapter;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.dayu.base.api.protocol.BasePageBean;
import com.dayu.base.ui.presenter.BaseListPresenter;
import com.dayu.baselibrary.BR;
import com.dayu.baselibrary.R;
import com.dayu.common.Constants;
import com.dayu.widgets.listener.OnChildClickListener;
import com.dayu.widgets.listener.OnItemClickListener;
import java.util.ArrayList;
import java.util.List;
/**
* Created by luofan on 2017/12/9.
*/
@SuppressWarnings("unchecked")
public class CoreAdapter<M, B> extends RecyclerView.Adapter<BaseViewHolder> {
private TypeSelector<M> mTypeSelector;
private List<M> mItemList = new ArrayList<>();
public boolean isHasMore = true;
private List<Item> mHeadTypeDatas = new ArrayList<>();
private List<Item> mFootTypeDatas = new ArrayList<>();
private int viewType;
private int mFooterViewType = R.layout.lrecycler_foot;
protected Context mContext;
private int mTotalPage = 0;
private int mPage = 1;
public boolean isLoadFial = false;
private OnItemClickListener mOnItemClickListener;
protected BaseListPresenter mPresenter;
protected OnChildClickListener mOnChildClickListener;
private List<M> mOldDatas = new ArrayList<>();
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
this.mContext = parent.getContext();
return new BaseViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), viewType, parent, false));
}
public CoreAdapter(boolean needFoot) {
if (needFoot) {
mFootTypeDatas.add(new Item(mFooterViewType, true));
}
}
public CoreAdapter(boolean needFoot, int viewType) {
if (needFoot) {
mFootTypeDatas.add(new Item(mFooterViewType, true));
}
this.viewType = viewType;
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
Object item = getItem(position);
holder.mBind.setVariable(BR.item, item);
holder.mBind.executePendingBindings();
if (position >= mHeadTypeDatas.size() && position < (mHeadTypeDatas.size() + mFootTypeDatas.size() + mItemList.size())) {
if (item != null && !(item instanceof Boolean)) {
onBind((B) holder.mBind, (M) item, position);
holder.mBind.getRoot().setOnClickListener(v -> {
if (mOnItemClickListener != null) {
mOnItemClickListener.OnItemClick(item, holder.mBind);
}
});
}
}
}
public void setViewType(@LayoutRes int type) {
this.viewType = type;
}
public void setTypeSelector(TypeSelector mTypeSelector) {
this.mTypeSelector = mTypeSelector;
this.viewType = Constants.FLAG_MULTI_VH;
}
public void addHeadViewType(@LayoutRes int i, Object data) {
for (Item a : mHeadTypeDatas) {
if (a.type == i) {
return;
}
}
mHeadTypeDatas.add(new Item(i, data));
}
public void addFooterViewType(@LayoutRes int i, Object data) {
mFootTypeDatas.add(mFootTypeDatas.size() - 1, new Item(i, data));
}
public Object getItem(int position) {
if (position < mHeadTypeDatas.size()) {
return mHeadTypeDatas.get(position).data;
} else if (position >= (mHeadTypeDatas.size() + mItemList.size())) {
int index = position - (mHeadTypeDatas.size() + mItemList.size());
if (mFootTypeDatas.get(index).type == mFooterViewType && !isHasMore) {
if (isLoadFial) {
return null;
} else {
return false;
}
} else {
if (isLoadFial) {
return null;
} else {
return mFootTypeDatas.get(index).data;
}
}
} else {
return mItemList.get(position - mHeadTypeDatas.size());
}
}
@Override
public int getItemViewType(int position) {
if (position < mHeadTypeDatas.size()) {
return mHeadTypeDatas.get(position).type;
} else if (position >= (mHeadTypeDatas.size() + mItemList.size())) {
return mFootTypeDatas.get(position - (mHeadTypeDatas.size() + mItemList.size())).type;
} else {
return viewType == Constants.FLAG_MULTI_VH ?
mTypeSelector.getType((M) getItem(position)) :
viewType;
}
}
public void addPageData(BasePageBean<M> data) {
if (data == null) {
isHasMore = false;
notifyDataSetChanged();
return;
}
mPage += 1;
mTotalPage = data.getTotalPages();
if (mPage >= mTotalPage) {
isHasMore = false;
} else {
isHasMore = true;
}
this.mItemList.addAll(data.getData());
notifyDataSetChanged();
}
public void setPageData(BasePageBean<M> data) {
mOldDatas = mItemList;
mPage = 1;
mTotalPage = data.getTotalPages();
if (mPage >= mTotalPage) {
isHasMore = false;
} else {
isHasMore = true;
}
this.mItemList = data.getData();
// DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(mOldDatas, mItemList), true);
// diffResult.dispatchUpdatesTo(this);
notifyDataSetChanged();
}
public void setData(List<M> data) {
this.mItemList = data;
notifyDataSetChanged();
}
/**
* 是否允许加载更多.
*
* @param flag
*/
public void setLoadMore(boolean flag) {
isHasMore = flag;
if (mPage >= mTotalPage || mTotalPage == 0) {
isHasMore = false;
}
}
@Override
public int getItemCount() {
return mItemList.size() + mHeadTypeDatas.size() + mFootTypeDatas.size();
}
public void setPresenter(BaseListPresenter presenter) {
mPresenter = presenter;
}
public class Item {
int type;
Object data;
public Item(int type, Object data) {
this.type = type;
this.data = data;
}
}
/**
* 继承coreadapter需要重写此方法.
*
* @param holder
* @param item
* @param position
*/
protected void onBind(B holder, M item, int position) {
}
public void setOnItemClickListener(OnItemClickListener<M, B> listener) {
mOnItemClickListener = listener;
}
public void setOnChildClickListener(OnChildClickListener listener) {
mOnChildClickListener = listener;
}
/**
* 获取数据源.
*
* @return
*/
public List<M> getDatas() {
return mItemList;
}
public Context getContext() {
return mContext;
}
}
\ No newline at end of file
package com.dayu.base.ui.adapter;
/**
* Created by luofan on 2017/12/9.
*/
public interface TypeSelector<M> {
int getType(M m);
}
package com.dayu.base.ui.fragment;
import android.content.Intent;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import com.alibaba.android.arouter.launcher.ARouter;
import com.dayu.base.ui.presenter.BasePresenter;
import com.dayu.baselibrary.R;
import com.dayu.common.BaseApplication;
import com.dayu.common.BaseConstant;
import com.dayu.common.BaseView;
import com.dayu.common.Constants;
import com.dayu.utils.ProgressUtil;
import com.dayu.utils.TUtil;
import com.dayu.utils.ToastUtils;
import com.dayu.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 DataBindingFragment<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) {
mPresenter = TUtil.getT(this, 0);
if (mPresenter != null) {
mPresenter.setView(this);
setPresenter();
// mBind.setVariable(BR.presenter, mPresenter);
}
}
ARouter.getInstance().inject(this);
}
/**
* databing设置presenter.
*/
public abstract void setPresenter();
@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();
BaseApplication.getBaseApp().exiteAllActivity();
ARouter.getInstance().build(BaseConstant.PATH_LOGIN).navigation();
}
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.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 DataBindingFragment<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.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.ui.presenter;
import android.util.Log;
import com.dayu.base.api.APIException;
import com.dayu.base.ui.activity.BaseActivity;
import com.dayu.base.ui.fragment.BaseFragment;
import com.dayu.common.BaseView;
import com.dayu.common.Constants;
import com.dayu.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.common;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
import com.alibaba.android.arouter.launcher.ARouter;
import java.util.Stack;
/**
* Created by luofan
* on 2018/2/6.
*/
public class BaseApplication extends MultiDexApplication {
private static Context mContext;
private Stack<Activity> store;
private static BaseApplication myApplication;
@Override
public void onCreate() {
super.onCreate();
MultiDex.install(this);
myApplication = this;
mContext = this.getApplicationContext();
store = new Stack<>();
registerActivityLifecycleCallbacks(new SwitchBackgroundCallbacks());
//ARouter初始化
ARouter.openLog(); // 打印日志
ARouter.openDebug();
ARouter.init(this);
}
/**
* 退出所有activity.
*/
public void exiteAllActivity() {
for (Activity activity : store) {
activity.finish();
}
}
/**
* 获取当前的Activity
*
* @return
*/
public Activity getCurActivity() {
return store.lastElement();
}
public static Context getContext() {
return mContext;
}
public static BaseApplication getBaseApp() {
return myApplication;
}
private class SwitchBackgroundCallbacks implements Application.ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
store.add(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
store.remove(activity);
}
}
}
package com.dayu.common;
/**
* Created by luofan
* on 2018/2/7.
*/
public class BaseConstant {
public static final String TOKEN ="token";
public static final String PATH_LOGIN ="/user/login";
}
package com.dayu.common;
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.common;
import com.dayu.utils.LogUtils;
/**
* Created by MrWang
* on 2017/8/20.
*/
public class Constants {
/**************************微服务测试路径*******************************/
// /api-user/
public static final String BASE_USER = "https://47.94.101.239:7100/";
// /api-order/
public static final String BASE_ORDER = "https://47.94.101.239:7200/";
// /api-base/
public static final String BASE_OTHER = "https://47.94.101.239:7300/";
// /api-message/
public static final String BASE_MESSAGE = "https://47.94.101.239:7400/";
// /api-count/
public static final String BASE_COUNT = "https://47.94.101.239:7500/";
/***********************测试环境配置**********************************/
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 IS_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 IS_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.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.utils;
import android.content.Context;
import com.dayu.base.api.APIService;
import com.dayu.base.api.Api;
import com.dayu.widgets.listener.onDownloadListener;
import java.io.File;
import java.io.IOException;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import okio.BufferedSink;
import okio.BufferedSource;
import okio.Okio;
/**
* app更新管理类
* Created by luofan on 2017/11/27.
*/
public class DownloadManager {
/**
* 是否需要更新,需要则下载
*
* @param context 上下文
* @param url 新版本地址
* @param apkPath 本地apk保存路径
* @param cd 订阅关系集合,在数据传输完毕时解除订阅
*/
public static void download(final Context context, final String url, final String apkPath, final CompositeDisposable cd, onDownloadListener listener) {
Api.getDownloadService(APIService.class).download(url)
.map(ResponseBody::source)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doOnNext(bufferedSource -> {
try {
writeFile(bufferedSource, new File(apkPath));
} catch (IOException e) {
e.printStackTrace();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BufferedSource>() {
@Override
public void onSubscribe(Disposable d) {
cd.add(d);
}
@Override
public void onNext(BufferedSource bufferedSource) {
}
@Override
public void onError(Throwable e) {
listener.onDownloadFail();
unSubscribe(cd);
}
@Override
public void onComplete() {
listener.onDownloadSuccess(new File(apkPath));
unSubscribe(cd);
}
});
}
/**
* 写入文件
*/
private static void writeFile(BufferedSource source, File file) throws IOException {
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
if (file.exists())
file.delete();
BufferedSink bufferedSink = Okio.buffer(Okio.sink(file));
bufferedSink.writeAll(source);
bufferedSink.close();
source.close();
}
/**
* 解除订阅
*
* @param cd 订阅关系集合
*/
private static void unSubscribe(CompositeDisposable cd) {
if (cd != null && !cd.isDisposed())
cd.dispose();
}
}
package com.dayu.utils;
import android.text.TextUtils;
import android.util.Log;
import com.dayu.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信息
*/
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.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.baselibrary.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.utils;
import android.content.Context;
import android.content.SharedPreferences;
import com.dayu.common.BaseApplication;
import java.lang.reflect.Method;
import java.util.Map;
/**
* SharedPreferences的工具类
*/
public class SPUtils {
/**
* 保存在手机里面的文件名
*/
public static final String FILE_NAME = "big_fish";
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param key
* @param object 存储的数据类型
*/
public static void put(String key, Object object) {
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
SharedPreferencesCompat.apply(editor);
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*/
public static Object get(String key, Object defaultObject) {
return get(FILE_NAME, key, defaultObject);
}
public static Object get(String spName, String key, Object defaultObject) {
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(spName,
Context.MODE_PRIVATE);
if (defaultObject instanceof String) {
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sp.getLong(key, (Long) defaultObject);
}
return null;
}
/**
* 移除某个key值已经对应的值
*/
public static void remove(String key) {
remove(FILE_NAME, key);
}
public static void remove(String spName, String key) {
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(spName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.apply(editor);
}
/**
* 清除所有数据
*/
public static void clear() {
clear(FILE_NAME);
}
public static void clear(String spName) {
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.apply(editor);
}
/**
* 查询某个key是否已经存在
*/
public static boolean contains(String key) {
return contains(FILE_NAME, key);
}
public static boolean contains(String spName, String key) {
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE);
return sp.contains(key);
}
/**
* 返回所有的键值对
*/
public static Map<String, ?> getAll() {
return getAll(FILE_NAME);
}
public static Map<String, ?> getAll(String spName) {
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(spName,
Context.MODE_PRIVATE);
return sp.getAll();
}
/**
* 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
*/
private static class SharedPreferencesCompat {
private static final Method sApplyMethod = findApplyMethod();
/**
* 反射查找apply的方法
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private static Method findApplyMethod() {
try {
Class clz = SharedPreferences.Editor.class;
return clz.getMethod("apply");
} catch (NoSuchMethodException e) {
}
return null;
}
/**
* 如果找到则使用apply执行,否则使用commit
*/
public static void apply(SharedPreferences.Editor editor) {
try {
if (sApplyMethod != null) {
sApplyMethod.invoke(editor);
return;
}
} catch (Exception e) {
}
editor.commit();
}
}
}
\ No newline at end of file
package com.dayu.utils;
import java.lang.reflect.ParameterizedType;
/**
* Created by luofan on 16/7/13.
*/
public class TUtil {
public static <T> T getT(Object o, int i) {
try {
return ((Class<T>) ((ParameterizedType) (o.getClass()
.getGenericSuperclass())).getActualTypeArguments()[i])
.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
}
return null;
}
public static Class<?> forName(String className) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
package com.dayu.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.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.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.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.baselibrary.R;
import com.dayu.widgets.listener.OnCloseListener;
/**
* 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();
}
}
}
package com.dayu.widgets;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.dayu.base.api.protocol.BasePageBean;
import com.dayu.base.ui.adapter.CoreAdapter;
import com.dayu.base.ui.adapter.TypeSelector;
import com.dayu.base.ui.presenter.BaseListPresenter;
import com.dayu.baselibrary.R;
import com.dayu.utils.ProgressUtil;
import com.dayu.widgets.listener.OnItemClickListener;
import com.dayu.widgets.listener.OnRefreshListener;
import com.dayu.widgets.listener.onLoadMoreListener;
import java.util.List;
/**
* Created by luofan on 2017/12/9.
*/
public class LRecyclerView<M, B> extends FrameLayout {
/**
* 是否需要头布局.
*/
private boolean isHasHeadView = false;
/**
* 是否需要翻转.
*/
private boolean isReverse = false;
/**
* 是否需要使用默认adapter.
*/
private boolean needCoreAdapter = false;
/**
* 是否需要脚布局.
*/
private boolean isNeedFoot = true;
/**
* 是否是刷新状态.
*/
private boolean isRefresh = true;
/**
* 是否处在空布局状态.
*/
private int headType, footType;
private SwipeRefreshLayout swipeRefresh;
private RecyclerView recyclerview;
private LinearLayout ll_emptyView;
private OnRefreshListener mRefreshListener;
private onLoadMoreListener mLoadMoreListener;
private LinearLayoutManager mLayoutManager;
public CoreAdapter<M, B> mCoreAdapter;
private int itemType;
private LinearLayout ll_faileView;
private BaseListPresenter mPresenter;
private boolean isRefreshable;
public LRecyclerView(@NonNull Context context) {
super(context);
init(context, null);
}
public LRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public LRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
//初始化参数
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.LRecyclerView);
headType = ta.getResourceId(R.styleable.LRecyclerView_headType, 0);
itemType = ta.getResourceId(R.styleable.LRecyclerView_itemType, 0);
footType = ta.getResourceId(R.styleable.LRecyclerView_footType, 0);
isReverse = ta.getBoolean(R.styleable.LRecyclerView_isReverse, false);
isNeedFoot = ta.getBoolean(R.styleable.LRecyclerView_needFoot, true);
needCoreAdapter = ta.getBoolean(R.styleable.LRecyclerView_needCoreAdapter, false);
isRefreshable = ta.getBoolean(R.styleable.LRecyclerView_isRefreshable, true);
ta.recycle();
//初始化recycleview
View layout = inflate(context, R.layout.lrecycle_layout, this);
swipeRefresh = (SwipeRefreshLayout) layout.findViewById(R.id.swiperefresh);
recyclerview = (RecyclerView) layout.findViewById(R.id.recyclerview);
ll_emptyView = (LinearLayout) layout.findViewById(R.id.ll_emptyview);
ll_faileView = (LinearLayout) layout.findViewById(R.id.ll_faileview);
swipeRefresh.setColorSchemeResources(R.color.cl_receiving_order_item_data);
mLayoutManager = new LinearLayoutManager(context);
mLayoutManager.setAutoMeasureEnabled(true);
recyclerview.setLayoutManager(mLayoutManager);
recyclerview.setItemAnimator(new DefaultItemAnimator());
swipeRefresh.setEnabled(isRefreshable);
if (needCoreAdapter) {
if (itemType != 0) {
mCoreAdapter = new CoreAdapter<>(isNeedFoot);
setViewType(itemType);
recyclerview.setAdapter(mCoreAdapter);
} else {
throw new RuntimeException("提示:需要先传入itemtype");
}
}
if (isReverse) {
mLayoutManager.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示
mLayoutManager.setReverseLayout(true);//列表翻转
recyclerview.setLayoutManager(mLayoutManager);
}
swipeRefresh.setOnRefreshListener(this::Refresh);
ll_faileView.setOnClickListener(view -> {
ProgressUtil.startLoad(mCoreAdapter.getContext());
Refresh();
});
ll_emptyView.setOnClickListener(view -> {
ProgressUtil.startLoad(mCoreAdapter.getContext());
Refresh();
});
recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
int lastVisibleItem;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (recyclerview.getAdapter() != null
&& newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 1 == recyclerview.getAdapter().getItemCount()
&& mCoreAdapter.isHasMore) {
if (mPresenter != null && isNeedFoot) {
mPresenter.loadMore();
mCoreAdapter.isLoadFial = false;
mCoreAdapter.notifyDataSetChanged();
isRefresh = false;
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int arg0, int arg1) {
super.onScrolled(recyclerView, arg0, arg1);
lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
}
});
}
public void setAdapter(CoreAdapter<M, B> adapter) {
mCoreAdapter = adapter;
if (itemType != 0) {
setViewType(itemType);
}
recyclerview.setAdapter(mCoreAdapter);
}
public LRecyclerView setFootData(Object data) {
this.mCoreAdapter.addFooterViewType(footType, data);
return this;
}
public LRecyclerView setHeadData(Object data) {
isHasHeadView = headType != 0;
this.mCoreAdapter.addHeadViewType(headType, data);
return this;
}
public LRecyclerView setTypeSelector(TypeSelector mTypeSelector) {
this.mCoreAdapter.setTypeSelector(mTypeSelector);
return this;
}
public void setEmpty() {
ll_emptyView.setVisibility(View.VISIBLE);
swipeRefresh.setVisibility(View.GONE);
ll_faileView.setVisibility(View.GONE);
}
public void reSetEmpty() {
swipeRefresh.setVisibility(View.VISIBLE);
ll_emptyView.setVisibility(View.GONE);
ll_faileView.setVisibility(View.GONE);
}
public void setFaileView() {
ll_faileView.setVisibility(View.VISIBLE);
ll_emptyView.setVisibility(View.GONE);
swipeRefresh.setVisibility(View.GONE);
}
/**
* 普通数据.
*
* @param data
*/
public void setData(List<M> data) {
swipeRefresh.setRefreshing(false);
mCoreAdapter.isHasMore = false;
if (data == null || (data != null && data.size() == 0)) {
// ToastUtils.showShortToast("暂无数据");
setEmpty();
return;
}
reSetEmpty();
if (isReverse) {
recyclerview.scrollToPosition(mCoreAdapter.getItemCount() - data.size() - 2);
}
mCoreAdapter.setData(data);
}
/**
* 分页数据.
*
* @param data
*/
public void setPageData(BasePageBean<M> data) {
isNeedFoot = true;
mCoreAdapter.isLoadFial = false;
swipeRefresh.setRefreshing(false);
if (isRefresh) {
if (data == null || (data != null && data.getData().size() == 0)) {
// ToastUtils.showShortToast("暂无数据");
setEmpty();
return;
}
reSetEmpty();
if (isReverse) {
recyclerview.scrollToPosition(mCoreAdapter.getItemCount() - data.getData().size() - 2);
}
mCoreAdapter.setPageData(data);
} else {
mCoreAdapter.addPageData(data);
}
}
/**
* 数据加载失败.
*/
public void setDataFail() {
if (isRefresh) {
swipeRefresh.setRefreshing(false);
setFaileView();
} else {
mCoreAdapter.isLoadFial = true;
mCoreAdapter.notifyDataSetChanged();
}
}
/**
* 刷新.
*/
public void Refresh() {
if (mPresenter != null) {
mPresenter.refresh();
isRefresh = true;
}
// if (mRefreshListener != null) {
// isRefresh = true;
// mRefreshListener.refresh();
// }
}
/**
* 设置adpaterItem.
*
* @param type
*/
public void setViewType(int type) {
mCoreAdapter.setViewType(type);
}
public void setRefreshListener(OnRefreshListener listener) {
mRefreshListener = listener;
}
public void setOnLoadMoreListener(onLoadMoreListener listener) {
mLoadMoreListener = listener;
}
public void setOnItemClickListener(OnItemClickListener<M,B> listener) {
mCoreAdapter.setOnItemClickListener(listener);
}
public void setPresenter(BaseListPresenter presenter) {
mPresenter = presenter;
mCoreAdapter.setPresenter(presenter);
}
/**
* 获取数据源.
*
* @return
*/
public List<M> getDatas() {
return mCoreAdapter.getDatas();
}
/**
* 滑动到底部.
*/
public void scrollBottom() {
recyclerview.smoothScrollToPosition(mCoreAdapter.getItemCount() - 1);
}
}
package com.dayu.widgets.listener;
import android.view.View;
import com.dayu.base.ui.adapter.CoreAdapter;
/**
* LRecy的子view的点击事件
* Created by luofan on 2017/12/10.
*/
public interface OnChildClickListener {
void OnChildClick(View view, CoreAdapter adapter, int position);
}
package com.dayu.widgets.listener;
import android.app.Dialog;
/**
* Created by luofan
* on 2018/2/6.
*/
public interface OnCloseListener {
void onClick(Dialog dialog, boolean confirm);
}
package com.dayu.widgets.listener;
/**
* Created by luofan on 2017/12/10.
*/
public interface OnItemClickListener<M,B> {
void OnItemClick(M item,B bind);
}
package com.dayu.widgets.listener;
/**
* Created by luofan on 2017/12/8.
*/
public interface OnRefreshListener {
void refresh();
}
package com.dayu.widgets.listener;
import java.io.File;
/**
* Created by luofan on 2017/11/28.
*/
public interface onDownloadListener {
void onDownloadSuccess(File file);
void onDownloadFail();
}
package com.dayu.widgets.listener;
/**
* Created by luofan on 2017/12/8.
*/
public interface onLoadMoreListener {
void onLoadMore();
}
<?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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@null"
android:scrollbars="none" />
</android.support.v4.widget.SwipeRefreshLayout>
<LinearLayout
android:id="@+id/ll_emptyview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:id="@+id/iv_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/yu" />
<TextView
android:id="@+id/tv_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/iv_empty"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_13"
android:text="暂无数据(点击刷新)"
android:textColor="@color/cl_selector_hui"
android:textSize="@dimen/sp_13.3" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_faileview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerInside"
android:src="@drawable/error" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="23dp"
android:text="加载出错啦"
android:textColor="#c9c9c9"
android:textSize="17.3sp" />
<TextView
android:id="@+id/retry_btn"
android:layout_width="115dp"
android:layout_height="30dp"
android:layout_marginTop="55dp"
android:gravity="center"
android:paddingBottom="4dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:paddingTop="4dp"
android:text="重新加载"
android:textSize="15.4sp" />
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<import type="android.view.View" />
<variable
name="item"
type="Boolean" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:orientation="horizontal">
<ProgressBar
android:id="@+id/progressbar"
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/progressbar"
android:visibility="@{item == null?View.GONE:(item?View.VISIBLE:View.GONE)}" />
<TextView
android:id="@+id/tv_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:clickable="@{item == null?true:false}"
android:text='@{item !=null? (item?"正在加载" :"没有更多数据"):"加载失败(再次上拉试试~)"}' />
</LinearLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="LRecyclerView">
<attr name="isReverse" format="boolean" />
<attr name="isRefreshable" format="boolean" />
<attr name="needCoreAdapter" format="boolean" />
<attr name="needFoot" format="boolean" />
<attr name="itemType" format="reference" />
<attr name="headType" format="reference" />
<attr name="footType" format="reference" />
</declare-styleable>
</resources>
\ 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>
<string name="agreement">
特别提示:\n
欢迎您注册使用大鱼U服(以下简称“大鱼平台”),您在申请注册流程中点击同意本协议之前,应当认真阅读本协议。请您务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任的条款将以粗体以及下划线标识,您应重点阅读。如您对本协议有任何疑问,请与kf@kf.ai联系。当您按照注册页面提示填写信息、阅读并同意本协议且完成全部注册程序后,即表示您已充分阅读、理解并接受本协议的全部内容,并与北京大鱼创想网络科技有限公司达成一致,双方同意使用互联网信息技术以数据电文形式订立本用户协议并认同其效力。\n
您的下载、注册、登录、使用及连接大鱼平台服务等行为均将被视为您已经完全了解、接受并同意遵守本协议项下的全部内容。本协议可由本公司根据需要不时的修改,并以网站或应用程序公示的方式进行公告,不再单独通知您。修改后的协议一经公布即替代原来的协议,构成您与本公司之间就本协议主题事由的全部、最新协议。您有义务不时关注并阅读最新版的协议以及网站或应用程序的公告。如您不同意更新后的协议,可以且应立即停止接受本公司依据本协议提供的服务;如您继续使用大鱼平台的服务的,即视为您同意更新后的协议。\n
第一条 定义\n
1. 大鱼平台:大鱼平台是由北京大鱼创想科技有限公司(以下简称“本公司”或者“乙方”)开发的提供服务的互联网产品,包含大鱼U服SAAS平台和大鱼工程师app。\n
2. 大客户:是指服务需求的提供方,通过派遣服务单的方式提供服务需求给服务商,并对其服务进行验收的企业或个人。\n
3. 平台用户(以下简称“甲方”):平台用户是指签署本协议并有权使用大鱼平台服务人员账户的个人,包括且不限于服务工程师,店长和服务商管理员。\n
4. 最终用户:用户是指通过大鱼平台完成全部注册程序后,提出服务申请并享受相关服务的个人。\n
5. 服务单:是指用户向特定大客户提出服务申请后生成的服务任务订单。\n
第二条 协议的范围\n
1. 本协议的内容包括协议正文及官网网站和APP目前及将来可能发布的各项声明、政策及规则;该等内容为本协议不可分割的组成部分,与本协议正文具有同等法律效力。\n
2. 当甲方按照大鱼平台注册页面提示填写信息、阅读并同意本协议且完成全部注册程序后,本协议即生效,并构成对甲乙双方具有约束力的法律文件。阅读本协议的过程中,如果甲方不同意本协议或其中任何条款约定,应立即停止注册。\n
第三条 账户管理\n
1. 甲方在大鱼平台提交注册资料即视为同意按大鱼平台相关规定使用本平台提供的服务。甲方需确保提交的信息真实、完整、有效,依据法律、法规的规定和本协议约定对所提供的信息承担相应的法律责任。乙方有权要求甲方按照大鱼平台的要求以及我国法律、法规的规定完成实名认证。\n
2. 服务人员信息修改:服务人员可以对已通过审核的信息按照乙方发布的规则进行修改或更新。\n
3. 甲方在大鱼平台的账号信息不得以任何方式转让、赠与或继承或者将账号给其他除甲方之外的任何其他第三方使用。\n
4. 甲方填写的账户信息,不得违反国家法律法规及大鱼平台的相关规定,不得包含违法、涉嫌侵犯他人权利或干扰本平台运营秩序等相关内容,否则大鱼平台有权立即删除相关信息而无需通知甲方。\n
5. 甲方应当及时更新在大鱼平台上的联系方式(包括但不限于:电子邮件地址、联系电话、微信),以便大鱼平台及其用户与甲方联系。\n
6. 大鱼平台有权查看甲方提供的资料及信息并进行审核,如本平台有合理理由怀疑甲方提供的信息不实、无效或不完整的,本平台有权要求甲方加以改正,和/或直接做出删除相应资料的处理、中止或终结对甲方提供部分或全部服务。甲方将承担因此产生的任何直接或间接损失及不利后果。\n
7. 甲方的账户为甲方自行设置并由甲方保管,甲方须自行负责对甲方的用户名、密码等登录信息保密。大鱼平台会对甲方的账户信息采取必要的技术保密措施,但账户因甲方主动泄露或遭受他人攻击、诈骗等行为导致的损失及后果,均由甲方自行承担。\n
8. 甲方应对其账号项下的所有行为独立承担完全的法律责任。\n
9. 如发现任何未经授权使用甲方账户登录本平台或其他可能导致甲方账户遭窃、遗失的情况,甲方应立即通知本平台。甲方理解本平台对甲方的任何请求采取行动均需要合理时间,本平台对在采取行动前已经产生的后果不承担责任。\n
第四条 业务内容\n
1. 乙方具备专业的信息服务团队和稳定的硬件设施,拥有自身研发的服务运营管理系统,大鱼平台作SAAS产品面向用户、大客户及其服务商和服务人员提供服务运营相关软件和信息服务。最终用户提出上门服务申请,大客户通过大鱼平台安排特定服务商提供服务,服务商根据用户或大客户的服务需求指定服务人员,指定服务人员可以通过APP了解服务订单的具体要求,然后由指定服务人员具体执行服务。\n
2. 服务相关费用由包括但不限于大客户、服务商或者最终用户根据其约定支付,乙方没有向甲方支付费用的义务。\n
3. 除与大鱼平台另有约定外,大鱼平台仅作为服务性平台,甲乙双方明确,双方不存在任何形式的雇佣/挂靠/劳动/劳务关系,故乙方无需承担甲方的人身及财产安全,无需为其购买保险,支付工资报酬等。在用户与大客户、服务商和指定服务人员进行的交易中,大鱼平台提供的服务不构成居间、委托、代理、担保等法律关系,不对服务人员向用户提供的服务承担保证或担保责任,不对在交易中发生的损失承担责任。\n
第五条 大鱼平台使用规则\n
1. 甲方认可并同意在使用大鱼平台服务过程中,严格遵守以下规则:\n
(1)遵守中国法律、法规、行政规章及规范性文件的规定;\n
(2)遵守大鱼平台所有与其提供服务有关的协议、规定、程序、通知、使用守则等全部文件;\n
(3)不得为任何违法、犯罪目的而使用大鱼平台的服务;\n
(4)不得以任何形式使用大鱼平台服务侵犯乙方的合法权利;\n
(5)不得利用大鱼平台服务进行任何可能对互联网正常运转造成不利影响的行为;\n
(6)不得利用大鱼平台提供的服务上传、展示或传播任何虚假的、骚扰性的、中伤他人的、种族歧视性的、辱骂性的、恐吓性的、情色的或其他任何法律、法规禁止或者限制传播的信息资料;\n
(7)不得以任何方式侵犯其他任何人依法享有的专利权、著作权、商标权、商业秘密等知识产权,第三人的名誉权或其他任何第三方的合法权益;\n
(8)保证在大鱼平台服务上展示的相关信息内容,没有违反相关法律、法规的规定,没有侵犯第三方的合法权利。\n
2. 乙方有权对甲方使用大鱼平台服务的情况进行审查和监督,如在使用大鱼平台服务时违反任何上述约定,大鱼平台有权要求甲方改正或直接单方面采取一切必要措施,以消除或减轻甲方不当行为给大鱼平台、第三方、互联网服务或社会公共利益造成的任何影响。大鱼平台在进行前述操作前,操作过程中或操作完成后不对甲方进行任何方式的通知。\n
3. 甲方认可并同意,乙方有权随时变更、中止或终止部分或全部服务,大鱼平台无需就此通知甲方,且乙方不因此对甲方或任何第三方承担任何责任。\n
第六条 信息的收集、使用和披露\n
1. 甲方在同意本协议时即明示同意乙方以收集、统计、分析、使用等方式合理使用以甲方的个人信息以及使用过程中的业务数据记录:\n
A)在甲方注册帐号以及使用大鱼平台服务时,甲方根据要求提供的个人信息包括但不限于姓名、证件号码、个人生物识别信息、住址、电话号码等;\n
B)在甲方使用大鱼平台服务,或访问大鱼平台网页以及app时,大鱼平台自动接收并记录的甲方的浏览器、计算机和移动设备上的信息,包括但不限于甲方的IP地址、浏览器的类型、使用的语言、访问日期和时间、软硬件特征信息、需求的网页记录等数据及其他操作状态、使用记录、使用习惯等反映在大鱼平台服务器端的全部记录信息;\n
C) 在甲方使用大鱼平台服务过程中产生的业务数据,客户数据,以及由此产生的分析和统计数据,包括但不限于,工单信息、服务记录、服务评价等产生在使用大鱼平台服务过程中的全部数据。\n
2. 甲方完全了解并同意,大鱼平台使用甲方上述信息的目的在于:为甲方提供更好地服务;甲方个人信息使用的方式包括但不限于:收集、统计、分析、商业用途的使用等方式;甲方注册、登陆、使用大鱼平台服务的行为,即视为明确同意乙方收集和使用其个人信息,无需其他意思表示。大鱼平台对个人信息以及业务数据的使用无需向甲方支付任何费用。\n
3. 在如下情况下,乙方将依据甲方的个人意愿或法律的规定全部或部分的披露甲方的个人信息:\n
1)事先获得了甲方的明确授权,向第三方披露;\n
2)为提供甲方所要求的产品和服务,而必须和第三方分享甲方的个人信息;\n
3)根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露;\n
4)如甲方出现违反中国有关法律、法规或者大鱼平台用户协议或相关规则的情况或者为了维护社会公共利益,需要向第三方披露;\n
5)其它大鱼平台根据法律、法规或者平台政策认为合适的披露。\n
4. 您完全了解并同意,发生上述任何一种或多种情形时,乙方对向任何第三方披露甲方个人信息的行为不承担任何责任。\n
5. 甲方声明并保证,对于在使用大鱼平台过程中知悉的技术信息,应遵守相关知识产权法律法规,不得侵犯大鱼平台或相关第三方的知识产权;乙方对在使用过程中知悉的甲方的任何商业信息(包括但不限于客户名单、商业秘密、营销手段等)有保密的义务,上述该义务不因本协议的解除、终止而解除或终止。\n
第七条 风险提示及免责条款\n
1. 对由于信息网络设备维护、升级、连接故障,电脑、网络、通讯或其他系统的故障,计算机病毒或黑客攻击,以及地震,洪水,风暴,火灾,爆炸,战争,罢工,暴乱,政府行为,司法行政机关的命令等不可抗力或第三方原因造成的损害,大鱼平台不承担责任。\n
2. 由于甲方以违法、违规或违反本协议约定等任何方式使用大鱼平台服务的行为,包括但不限于登录网站内容违法、不真实、不正当,侵犯第三方任何合法权益等,给大鱼平台或其他第三人造成的任何损失,甲方同意承担由此造成的全部损害赔偿责任。\n
3. 乙方对大鱼平台服务的任何及全部内容不作任何形式的承诺或保证,不论是明确的或暗示的。前述承诺或保证包括但不限于服务的适用性、没有错误或疏漏、持续性、准确性、可靠性、适用于某一特定用途以及任何形式的所有权保证,非侵权保证;同时,大鱼平台也不对服务所涉及的技术及信息的有效性、准确性、正确性、可靠性、稳定性、完整性和及时性作出任何承诺和保证等。乙方对因前述未做承诺或保证的内容导致的任何直接、间接、偶然、特殊及后续的损害,不承担任何责任。\n
第八条 违约责任\n
1. 本协议一方未履行本协议项下的任何一项条款均被视为违约。违约方应承担因自身的违约行为而给守约方造成的损失。\n
2. 本平台可对甲方的违约行为采取以下处理方式:对有关行为进行限制,包括限制权限、中止向甲方提供部分或全部服务、、查封账户、终止服务等。\n
3. 如甲方的行为使大鱼平台及其关联公司、用户及其关联公司遭受损失的(包括自身的直接经济损失、商誉损失及对外支付的赔偿金、和解款、法律顾问费、诉讼费等间接经济损失),甲方应当赔偿上述全部损失。\n
4. 如甲方的行为使大鱼平台及其关联公司、用户及其关联公司受到第三人主张权利,则大鱼平台及其关联公司、用户及其关联公司有权在对第三人承担金钱给付后就全部损失向甲方追偿。\n
第九条 法律适用与争议解决\n
1. 本协议之订立、生效、解释、修订、补充、终止、执行与争议解决均适用中华人民共和国法律(香港、澳门和台湾地区除外);如法律无相关规定的,参照商业惯例及/或行业惯例。\n
2. 甲方因使用大鱼平台服务所产生争议,由甲乙双方协商解决。协商不成时,任何一方均可向被告所在地人民法院提起诉讼。\n
第十一条 其他\n
1. 甲方同意本平台通过以下任何方式向其送达各类通知或文件,包括但不限于:网页公告、APP公告、大鱼平台账户通知、向甲方预留的联系方式发送电子邮件、短信、信函等\n
2. 如果本协议的任何条款被视为不合法、无效或无法强制执行的,其不应影响本协议任何其他条款的有效性或可执行性。\n
</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>
apply plugin: 'com.android.library'
android {
compileSdkVersion compile_sdk_version
buildToolsVersion build_tools_version
defaultConfig {
minSdkVersion min_sdk_version
targetSdkVersion target_sdk_version
versionCode version_code
versionName verson_name
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
useProguard true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
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'
compile project(':baseLibrary')
}
# 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
package com.dayu.provider;
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.provider.test", appContext.getPackageName());
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dayu.provider" />
package com.dayu.provider.common;
/**
* Created by luofan
* on 2018/2/7.
*/
public class ProviderConstant {
}
package com.dayu.provider.router;
/**
* Created by luofan
* on 2018/2/7.
*/
public class RouterPath {
public final static String PATH_LOGIN = "/user/login";
}
<resources>
<string name="app_name">Provider</string>
</resources>
package com.dayu.provider;
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
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