commit aea39182db944e6be4affd4c10d4190416029dfc Author: yexuejc <1107047387@qq.com> Date: Tue Jul 11 17:58:48 2017 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e1d188 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild +/.svn diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a0c0ba9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..33a462e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..45cf85c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..33e23eb --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,44 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + buildToolsVersion "26.0.0" + defaultConfig { + applicationId "com.yexue.android.hexiprv" + minSdkVersion 15 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile 'com.android.support:appcompat-v7:26.+' + compile 'com.android.support.constraint:constraint-layout:1.0.2' + testCompile 'junit:junit:4.12' + + //分包 + compile 'com.android.support:multidex:1.0.1' + + compile 'com.squareup.okhttp3:okhttp:3.2.0' + compile 'com.squareup.retrofit2:retrofit:2.0.0' + compile 'com.squareup.retrofit2:converter-gson:2.0.0' + compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0' + compile 'com.github.bumptech.glide:glide:3.7.0' + compile 'com.jakewharton:butterknife:7.0.1' + compile 'io.reactivex:rxjava:1.1.0' + compile 'io.reactivex:rxandroid:1.1.0' + compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' + compile 'io.reactivex:rxjava:1.0.10' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..718e3b1 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Users\admin\AppData\Local\Android\Sdk/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 diff --git a/app/src/androidTest/java/com/yexue/android/hexiprv/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/yexue/android/hexiprv/ExampleInstrumentedTest.java new file mode 100644 index 0000000..7ae27d9 --- /dev/null +++ b/app/src/androidTest/java/com/yexue/android/hexiprv/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.yexue.android.hexiprv; + +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.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.yexue.android.hexiprv", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9cdc44f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/yexue/android/hexiprv/Application.java b/app/src/main/java/com/yexue/android/hexiprv/Application.java new file mode 100644 index 0000000..c7136a8 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/Application.java @@ -0,0 +1,24 @@ +package com.yexue.android.hexiprv; + +import android.support.multidex.MultiDexApplication; + +/** + * @author yexue + * @version 1.0 + * @name Application + * @explain + * @time 2017/7/11 11:24 + */ +public class Application extends MultiDexApplication { + private static Application application; + + public static Application getInstance() { + return application; + } + + @Override + public void onCreate() { + super.onCreate(); + application = this; + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/bean/ResultData.java b/app/src/main/java/com/yexue/android/hexiprv/bean/ResultData.java new file mode 100644 index 0000000..eba65b0 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/bean/ResultData.java @@ -0,0 +1,49 @@ +package com.yexue.android.hexiprv.bean; + +import java.util.Objects; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.bean + * @explain 网络请求封装 + * @time 2017/7/11 14:23 + */ +public class ResultData { + private Objects datas; + private String message; + private boolean flag; + + public Objects getDatas() { + return datas; + } + + public void setDatas(Objects datas) { + this.datas = datas; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + @Override + public String toString() { + return "ResultData{" + + "datas='" + datas + '\'' + + ", message='" + message + '\'' + + ", flag=" + flag + + '}'; + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/model/BaseModel.java b/app/src/main/java/com/yexue/android/hexiprv/model/BaseModel.java new file mode 100644 index 0000000..e7950e6 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/model/BaseModel.java @@ -0,0 +1,49 @@ +package com.yexue.android.hexiprv.model; + +import android.util.Log; + +import com.yexue.android.hexiprv.sys.HttpLoggingInterceptor; +import com.yexue.android.hexiprv.utils.HttpsUtils; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSession; + +import okhttp3.OkHttpClient; +import retrofit2.CallAdapter; +import retrofit2.Converter; +import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.model + * @explain 网络请求/model supper + * @time 2017/7/11 14:31 + */ +public class BaseModel { + protected static OkHttpClient okHttpClient; + protected static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); + protected static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create(); + + static { + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { + @Override + public void log(String message) { + Log.e("RxJava", message); + } + }); + HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null); + okHttpClient = new OkHttpClient.Builder() + //TODO log请求参数-->正式发布请注释.addInterceptor(interceptor) + .addInterceptor(interceptor) + .hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }) + .sslSocketFactory(sslParams.sSLSocketFactory) + .build(); + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/model/PptIco.java b/app/src/main/java/com/yexue/android/hexiprv/model/PptIco.java new file mode 100644 index 0000000..8d69554 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/model/PptIco.java @@ -0,0 +1,34 @@ +package com.yexue.android.hexiprv.model; + +import com.yexue.android.hexiprv.bean.ResultData; +import com.yexue.android.hexiprv.propreties.HttpsValues; + +import retrofit2.http.GET; +import retrofit2.http.Query; +import rx.Observable; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.model + * @explain 图片路径 https://shop.globalhexi.cn/shop/pptIco/ + * @time 2017/7/11 14:00 + */ +public interface PptIco { + /** + * 获取首页所有图片 + * + * @return + */ + @GET(HttpsValues.GET_IMAGE_URLD) + Observable listALL(); + + /** + * 获取指定key图片 + * + * @param pptKey 指定key + * @return + */ + @GET(HttpsValues.GET_PING_GO_PPT) + Observable list(@Query("pptKey") String pptKey); +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/model/impl/PptIcoImpl.java b/app/src/main/java/com/yexue/android/hexiprv/model/impl/PptIcoImpl.java new file mode 100644 index 0000000..42d68b7 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/model/impl/PptIcoImpl.java @@ -0,0 +1,31 @@ +package com.yexue.android.hexiprv.model.impl; + +import com.yexue.android.hexiprv.model.BaseModel; +import com.yexue.android.hexiprv.model.PptIco; +import com.yexue.android.hexiprv.propreties.HttpsValues; + +import retrofit2.Retrofit; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.model.impl + * @explain + * @time 2017/7/11 14:36 + */ +public class PptIcoImpl extends BaseModel { + private static PptIco pptIco; + + public static PptIco getPptIco() { + if (pptIco == null) { + Retrofit retrofit = new Retrofit.Builder() + .client(okHttpClient) + .baseUrl(HttpsValues.SERVER_URL_PREFIX_SHOP)//基本URL + .addConverterFactory(gsonConverterFactory) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .build(); + pptIco = retrofit.create(PptIco.class); + } + return pptIco; + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/propreties/HttpsValues.java b/app/src/main/java/com/yexue/android/hexiprv/propreties/HttpsValues.java new file mode 100644 index 0000000..8af4d39 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/propreties/HttpsValues.java @@ -0,0 +1,27 @@ +package com.yexue.android.hexiprv.propreties; + +/** + * @author maxf + * @version 1.0 + * @name hexi + * @explain 网络请求路径 + * @time 2017/2/2115:25 + */ + +public class HttpsValues { + + /** + * 前缀 + */ + public final static String SERVER_URL_PREFIX_SHOP = "https://shop.globalhexi.cn:443/shop/";// shop + + /** + * NO6、获取首页图片地址 + */ + public final static String GET_IMAGE_URLD = "pptIco/listAll"; + /** + * NO2、请求指定图标 + */ + public final static String GET_PING_GO_PPT = "pptIco/list"; + +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/sys/AppUtils.java b/app/src/main/java/com/yexue/android/hexiprv/sys/AppUtils.java new file mode 100644 index 0000000..2da08f2 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/sys/AppUtils.java @@ -0,0 +1,23 @@ +package com.yexue.android.hexiprv.sys; + +import rx.Subscription; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.sys + * @explain 系统控制处理 + * @time 2017/7/11 11:35 + */ +public class AppUtils { + + /** + * Subscription 销毁 + * @param subscription + */ + public static void unsubscribe(Subscription subscription) { + if (subscription != null && !subscription.isUnsubscribed()) { + subscription.unsubscribe(); + } + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/sys/BaseObserver.java b/app/src/main/java/com/yexue/android/hexiprv/sys/BaseObserver.java new file mode 100644 index 0000000..5742451 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/sys/BaseObserver.java @@ -0,0 +1,64 @@ +package com.yexue.android.hexiprv.sys; + +import android.util.Log; + +import rx.Observer; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.sys + * @explain + * @time 2017/7/11 15:00 + */ +public class BaseObserver implements Observer { + public HttpCallBack callBack; + + public BaseObserver(HttpCallBack callBack) { + this.callBack = callBack; + } + + /** + * 事件队列完结 + */ + @Override + public void onCompleted() { + callBack.onComplete(0, null); + } + + /** + * 失败 + * + * @param e + */ + @Override + public void onError(Throwable e) { + callBack.onComplete(500, null); + e.printStackTrace(); + } + + /** + * 本次事件成功 + * + * @param t + */ + @Override + public void onNext(T t) { + callBack.onComplete(200, t); + } + + public interface HttpCallBack { + /** + *
+         *     code:
+         *     200:onNext
+         *     500:onError
+         *     0:onCompleted
+         * 
+ * + * @param code < + * @param t + */ + public void onComplete(int code, T t); + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/sys/HttpLoggingInterceptor.java b/app/src/main/java/com/yexue/android/hexiprv/sys/HttpLoggingInterceptor.java new file mode 100644 index 0000000..081174d --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/sys/HttpLoggingInterceptor.java @@ -0,0 +1,189 @@ +package com.yexue.android.hexiprv.sys; + + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.concurrent.TimeUnit; + +import okhttp3.Headers; +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.internal.Platform; +import okio.Buffer; + +/** + *
+ * 打印okHttp请求LOG
+ *      -->正式环境请注释
+ *      com.yexue.android.hexiprv.model.BaseModel --> .addInterceptor(interceptor)
+ * 
+ * + * @author yexue + * @version 1.0 + * @name HttpLoggingInterceptor + * @explain + * @time 2017/7/11 14:32 + */ +public class HttpLoggingInterceptor implements Interceptor { + private static final Charset UTF8 = Charset.forName("UTF-8"); + + public enum Level { + /** + * No logs. + */ + NONE, + /** + * Logs request and response lines. + *

+ * Example: + *

{@code
+         * --> POST /greeting HTTP/1.1 (3-byte body)
+         * 

+ * <-- HTTP/1.1 200 OK (22ms, 6-byte body) + * }

+ */ + BASIC, + /** + * Logs request and response lines and their respective headers. + *

+ * Example: + *

{@code
+         * --> POST /greeting HTTP/1.1
+         * Host: example.com
+         * Content-Type: plain/text
+         * Content-Length: 3
+         * --> END POST
+         * 

+ * <-- HTTP/1.1 200 OK (22ms) + * Content-Type: plain/text + * Content-Length: 6 + * <-- END HTTP + * }

+ */ + HEADERS, + /** + * Logs request and response lines and their respective headers and bodies (if present). + *

+ * Example: + *

{@code
+         * --> POST /greeting HTTP/1.1
+         * Host: example.com
+         * Content-Type: plain/text
+         * Content-Length: 3
+         * 

+ * Hi? + * --> END GET + *

+ * <-- HTTP/1.1 200 OK (22ms) + * Content-Type: plain/text + * Content-Length: 6 + *

+ * Hello! + * <-- END HTTP + * }

+ */ + 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(message); + } + }; + } + + public HttpLoggingInterceptor() { + this(Logger.DEFAULT); + } + + public HttpLoggingInterceptor(Logger logger) { + this.logger = logger; + } + + private final Logger logger; + + private volatile Level level = Level.BODY; + + /** + * 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; + } + + @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; + + String requestStartMessage = request.method() + ' ' + request.url(); + if (!logHeaders && hasRequestBody) { + requestStartMessage += " (" + requestBody.contentLength() + "-byte body)"; + } + logger.log(requestStartMessage); + + if (logHeaders) { + + if (!logBody || !hasRequestBody) { + logger.log("--> END " + request.method()); + } else if (bodyEncoded(request.headers())) { + logger.log("--> END " + request.method() + " (encoded body omitted)"); + } else if (request.body() instanceof MultipartBody) { + //如果是MultipartBody,会log出一大推乱码的东东 + } else { + Buffer buffer = new Buffer(); + requestBody.writeTo(buffer); + + Charset charset = UTF8; + MediaType contentType = requestBody.contentType(); + if (contentType != null) { + contentType.charset(UTF8); + } + + logger.log(buffer.readString(charset)); + +// logger.log(request.method() + " (" + requestBody.contentLength() + "-byte body)"); + } + } + + long startNs = System.nanoTime(); + Response response = chain.proceed(request); + long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs); + logger.log(response.code() + ' ' + response.message() + " (" + tookMs + "ms" + ')'); + + return response; + } + + private boolean bodyEncoded(Headers headers) { + String contentEncoding = headers.get("Content-Encoding"); + return contentEncoding != null && !contentEncoding.equalsIgnoreCase("identity"); + } + + private static String protocol(Protocol protocol) { + return protocol == Protocol.HTTP_1_0 ? "HTTP/1.0" : "HTTP/1.1"; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/base/BaseActivity.java b/app/src/main/java/com/yexue/android/hexiprv/ui/base/BaseActivity.java new file mode 100644 index 0000000..a137e2d --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/base/BaseActivity.java @@ -0,0 +1,66 @@ +package com.yexue.android.hexiprv.ui.base; + +import android.app.Activity; +import android.os.Bundle; +import android.os.PersistableBundle; +import android.support.annotation.Nullable; + +import com.yexue.android.hexiprv.sys.AppUtils; + +import butterknife.ButterKnife; +import rx.Subscription; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.base + * @explain + * @time 2017/7/11 11:29 + */ +public abstract class BaseActivity extends Activity { + protected Activity activity; + protected Subscription subscription; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + onInitLayoutBefore(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + AppUtils.unsubscribe(subscription); + } + + /** + *
+     * 初始化注解
+     * 在实现子类的onInitLayoutBefore()中重载
+     * 
+ * + * @param activity + * @param id + */ + protected void loadUI(Activity activity, int id) { + setContentView(id); + ButterKnife.bind(activity); + this.activity = activity; + } + + /** + *
+     * 初始化之前
+     * 在该方法调用loadUI()
+     * 
+ */ + protected abstract void onInitLayoutBefore(); + + /** + *
+     * 初始化之后
+     * 直接继承需要手动调用该方法
+     * 
+ */ + protected abstract void onInitLayoutAfter(); +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/base/BasePresenter.java b/app/src/main/java/com/yexue/android/hexiprv/ui/base/BasePresenter.java new file mode 100644 index 0000000..672e9bb --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/base/BasePresenter.java @@ -0,0 +1,74 @@ +package com.yexue.android.hexiprv.ui.base; + +import android.content.Context; + +import com.yexue.android.hexiprv.sys.AppUtils; + +import java.lang.ref.WeakReference; + +import rx.Subscription; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.base + * @explain + * @time 2017/7/11 11:29 + */ +public abstract class BasePresenter { + + // View引用 + // IObjBeanView mObjBeanView; + // 弱引用:只要GC开始,就回收 + protected WeakReference mViewRef; + protected WeakReference mContextRef; + + /** + * 初始化mViewRef + * + * @param view + */ + protected void attachView(T view) { + mViewRef = new WeakReference(view); + } + + /** + * 防止发生意外,构建一个备用context + */ + private Context content; + + protected void attachContext(Context con) { + this.content = content; + mContextRef = new WeakReference(con); + } + + /** + * 销毁mViewRef + */ + protected void detachView() { + if (mViewRef != null) { + mViewRef.clear(); + } + if (mContextRef != null) { + mContextRef.clear(); + } + } + + /** + * 获取mViewRef + * + * @return + */ + protected T getView() { + return mViewRef.get(); + } + + protected Context getContext() { + if (mContextRef != null) { + return mContextRef.get(); + } else { + return this.content; + } + } + +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/base/IBaseView.java b/app/src/main/java/com/yexue/android/hexiprv/ui/base/IBaseView.java new file mode 100644 index 0000000..17bad0d --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/base/IBaseView.java @@ -0,0 +1,11 @@ +package com.yexue.android.hexiprv.ui.base; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.base + * @explain + * @time 2017/7/11 11:30 + */ +public class IBaseView { +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/base/MvpActivity.java b/app/src/main/java/com/yexue/android/hexiprv/ui/base/MvpActivity.java new file mode 100644 index 0000000..9a28a08 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/base/MvpActivity.java @@ -0,0 +1,38 @@ +package com.yexue.android.hexiprv.ui.base; + +import android.os.Bundle; +import android.support.annotation.Nullable; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.base + * @explain + * @time 2017/7/11 11:42 + */ +public abstract class MvpActivity> extends BaseActivity { + protected T objBeanPresenter; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + objBeanPresenter = ceatePresenter(); + objBeanPresenter.attachView((V) this); + objBeanPresenter.attachContext(this); + onInitLayoutAfter(); + } + + /** + * 创建Presenter + * + * @return + */ + protected abstract T ceatePresenter(); + + @Override + protected void onDestroy() { + objBeanPresenter.detachView(); + super.onDestroy(); + } + +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/main/IMainView.java b/app/src/main/java/com/yexue/android/hexiprv/ui/main/IMainView.java new file mode 100644 index 0000000..5b62410 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/main/IMainView.java @@ -0,0 +1,11 @@ +package com.yexue.android.hexiprv.ui.main; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.main + * @explain + * @time 2017/7/11 11:50 + */ +public interface IMainView { +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/main/MainActivity.java b/app/src/main/java/com/yexue/android/hexiprv/ui/main/MainActivity.java new file mode 100644 index 0000000..29919e0 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/main/MainActivity.java @@ -0,0 +1,31 @@ +package com.yexue.android.hexiprv.ui.main; + +import android.os.Bundle; +import android.widget.TextView; + +import com.yexue.android.hexiprv.R; +import com.yexue.android.hexiprv.ui.base.MvpActivity; + +import butterknife.Bind; +import butterknife.ButterKnife; + +public class MainActivity extends MvpActivity implements IMainView { + + @Bind(R.id.pptIco_list) + TextView pptIcoList; + + @Override + protected void onInitLayoutBefore() { + loadUI(this, R.layout.activity_main); + } + + @Override + protected void onInitLayoutAfter() { + objBeanPresenter.loadInit(); + } + + @Override + protected MainPresenter ceatePresenter() { + return new MainPresenter(subscription); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yexue/android/hexiprv/ui/main/MainPresenter.java b/app/src/main/java/com/yexue/android/hexiprv/ui/main/MainPresenter.java new file mode 100644 index 0000000..b1de837 --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/ui/main/MainPresenter.java @@ -0,0 +1,65 @@ +package com.yexue.android.hexiprv.ui.main; + +import android.content.Context; +import android.util.Log; + +import com.yexue.android.hexiprv.R; +import com.yexue.android.hexiprv.bean.ResultData; +import com.yexue.android.hexiprv.model.impl.PptIcoImpl; +import com.yexue.android.hexiprv.sys.BaseObserver; +import com.yexue.android.hexiprv.ui.base.BasePresenter; +import com.yexue.android.hexiprv.utils.T; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author yexue + * @version 1.0 + * @name com.yexue.android.hexiprv.main + * @explain + * @time 2017/7/11 11:50 + */ +public class MainPresenter extends BasePresenter { + Subscription subscription; + + public MainPresenter(Subscription subscription) { + super(); + this.subscription = subscription; + } + + /** + *
+     *  进入app初始化
+     *      https://shop.globalhexi.cn/shop/pptIco/listAll
+     * 
+ */ + public void loadInit() { + subscription = PptIcoImpl.getPptIco() + .listALL() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getInitObservable()); + } + + private BaseObserver getInitObservable() { + return new BaseObserver(new BaseObserver.HttpCallBack() { + @Override + public void onComplete(int code, ResultData resultData) { + switch (code) { + case 0: + break; + case 200: + Log.e("resule",resultData.toString()); + break; + case 500: + T.showShort(getContext(), getContext().getString(R.string.error_code_500)); + break; + } + } + }); + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/utils/HttpsUtils.java b/app/src/main/java/com/yexue/android/hexiprv/utils/HttpsUtils.java new file mode 100644 index 0000000..5c5b8bf --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/utils/HttpsUtils.java @@ -0,0 +1,232 @@ +package com.yexue.android.hexiprv.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +/** + * Created by zhy on 15/12/14. + */ +public class HttpsUtils +{ + public static class SSLParams + { + public SSLSocketFactory sSLSocketFactory; + public X509TrustManager trustManager; + } + + public static SSLParams getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password) + { + SSLParams sslParams = new SSLParams(); + try + { + TrustManager[] trustManagers = prepareTrustManager(certificates); + KeyManager[] keyManagers = prepareKeyManager(bksFile, password); + SSLContext sslContext = SSLContext.getInstance("TLS"); + X509TrustManager trustManager = null; + if (trustManagers != null) + { + trustManager = new MyTrustManager(chooseTrustManager(trustManagers)); + } else + { + trustManager = new UnSafeTrustManager(); + } + sslContext.init(keyManagers, new TrustManager[]{trustManager},null); + sslParams.sSLSocketFactory = sslContext.getSocketFactory(); + sslParams.trustManager = trustManager; + return sslParams; + } catch (NoSuchAlgorithmException e) + { + throw new AssertionError(e); + } catch (KeyManagementException e) + { + throw new AssertionError(e); + } catch (KeyStoreException e) + { + throw new AssertionError(e); + } + } + + private class UnSafeHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } + + private static class UnSafeTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws CertificateException + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[]{}; + } + } + + private static TrustManager[] prepareTrustManager(InputStream... certificates) + { + if (certificates == null || certificates.length <= 0) return null; + try + { + + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + keyStore.load(null); + int index = 0; + for (InputStream certificate : certificates) + { + String certificateAlias = Integer.toString(index++); + keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate)); + try + { + if (certificate != null) + certificate.close(); + } catch (IOException e) + + { + } + } + TrustManagerFactory trustManagerFactory = null; + + trustManagerFactory = TrustManagerFactory. + getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(keyStore); + + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + + return trustManagers; + } catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } catch (CertificateException e) + { + e.printStackTrace(); + } catch (KeyStoreException e) + { + e.printStackTrace(); + } catch (Exception e) + { + e.printStackTrace(); + } + return null; + + } + + private static KeyManager[] prepareKeyManager(InputStream bksFile, String password) + { + try + { + if (bksFile == null || password == null) return null; + + KeyStore clientKeyStore = KeyStore.getInstance("BKS"); + clientKeyStore.load(bksFile, password.toCharArray()); + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(clientKeyStore, password.toCharArray()); + return keyManagerFactory.getKeyManagers(); + + } catch (KeyStoreException e) + { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } catch (UnrecoverableKeyException e) + { + e.printStackTrace(); + } catch (CertificateException e) + { + e.printStackTrace(); + } catch (IOException e) + { + e.printStackTrace(); + } catch (Exception e) + { + e.printStackTrace(); + } + return null; + } + + private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers) + { + for (TrustManager trustManager : trustManagers) + { + if (trustManager instanceof X509TrustManager) + { + return (X509TrustManager) trustManager; + } + } + return null; + } + + + private static class MyTrustManager implements X509TrustManager + { + private X509TrustManager defaultTrustManager; + private X509TrustManager localTrustManager; + + public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException + { + TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + var4.init((KeyStore) null); + defaultTrustManager = chooseTrustManager(var4.getTrustManagers()); + this.localTrustManager = localTrustManager; + } + + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException + { + + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException + { + try + { + defaultTrustManager.checkServerTrusted(chain, authType); + } catch (CertificateException ce) + { + localTrustManager.checkServerTrusted(chain, authType); + } + } + + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[0]; + } + } +} diff --git a/app/src/main/java/com/yexue/android/hexiprv/utils/T.java b/app/src/main/java/com/yexue/android/hexiprv/utils/T.java new file mode 100644 index 0000000..551ad6f --- /dev/null +++ b/app/src/main/java/com/yexue/android/hexiprv/utils/T.java @@ -0,0 +1,93 @@ +package com.yexue.android.hexiprv.utils; + +import android.content.Context; +import android.widget.Toast; + +/** + * Toast 工具类 + * @author chao + * + */ +public abstract class T { + private T() + { + /* cannot be instantiated */ + throw new UnsupportedOperationException("cannot be instantiated"); + } + + public static boolean isShow = true; + + /** + * 短时间显示Toast + * @param context + * @param msg + * + */ + public static void showShort(Context context, String msg) + { + if (isShow) + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); + } + + /** + * 短时间显示Toast + * + * @param context + * @param message + */ + public static void showShort(Context context, int message) + { + if (isShow) + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } + + /** + * 长时间显示Toast + * + * @param context + * @param message + */ + public static void showLong(Context context, CharSequence message) + { + if (isShow) + Toast.makeText(context, message, Toast.LENGTH_LONG).show(); + } + + /** + * 长时间显示Toast + * + * @param context + * @param message + */ + public static void showLong(Context context, int message) + { + if (isShow) + Toast.makeText(context, message, Toast.LENGTH_LONG).show(); + } + + /** + * 自定义显示Toast时间 + * + * @param context + * @param message + * @param duration + */ + public static void show(Context context, CharSequence message, int duration) + { + if (isShow) + Toast.makeText(context, message, duration).show(); + } + + /** + * 自定义显示Toast时间 + * + * @param context + * @param message + * @param duration + */ + public static void show(Context context, int message, int duration) + { + if (isShow) + Toast.makeText(context, message, duration).show(); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..32b99cf --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..cde69bc Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..9a078e3 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c133a0c Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..efc028a Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..bfa42f0 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..3af2608 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..324e72c Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..9bec2e6 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..aee44e1 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..34947cd Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..b26861a --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #3F51B5 + #303F9F + #FF4081 + #dddddd + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..99d5177 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + hexi-prv + 网络开小差了 + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..5885930 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/app/src/test/java/com/yexue/android/hexiprv/ExampleUnitTest.java b/app/src/test/java/com/yexue/android/hexiprv/ExampleUnitTest.java new file mode 100644 index 0000000..9b16214 --- /dev/null +++ b/app/src/test/java/com/yexue/android/hexiprv/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.yexue.android.hexiprv; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..d0aa704 --- /dev/null +++ b/build.gradle @@ -0,0 +1,23 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.2' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..aac7c9b --- /dev/null +++ b/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..13372ae Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3d8a91e --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jul 11 10:37:37 CST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app'