Commit 333f1a69 by chengfengpiaopiao

微信登录

parents
Showing with 2591 additions and 0 deletions
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<component name="CopyrightManager">
<settings default="" />
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AndroidLintStringFormatMatches" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
<option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
<option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
</inspection_tool>
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State>
<id />
</State>
<State>
<id>Android</id>
</State>
<State>
<id>Android &gt; Lint &gt; Correctness</id>
</State>
<State>
<id>Java</id>
</State>
<State>
<id>Java language level migration aidsJava</id>
</State>
</expanded-state>
<selected-state>
<State>
<id>Android</id>
</State>
</selected-state>
</profile-state>
</entry>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/DuoBaoJingCai2.iml" filepath="$PROJECT_DIR$/DuoBaoJingCai2.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.maile.jingcai"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//配置keystore签名
signingConfigs {
release {
storeFile file("duobaojingcai.jks")
storePassword "yy10241905"
keyAlias "duobaojingcai"
keyPassword "yy10241905"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.release
}
}
}
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:25.0.0'
testCompile 'junit:junit:4.12'
compile "com.jakewharton:butterknife:$rootProject.ButterKnife"
compile "com.squareup.retrofit2:retrofit:$Retrofit"
compile "com.squareup.retrofit2:converter-gson:$Retrofit"
compile "com.squareup.retrofit2:adapter-rxjava:$Retrofit"
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.9'
compile 'com.google.code.gson:gson:2.6.2'
compile "com.squareup.okhttp3:logging-interceptor:$loggingInterceptor"
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.0.2'
compile 'cz.msebera.android:httpclient:4.4.1.1'
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\2_android\as_client\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 *;
#}
package com.maile.jingcai;
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 <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.maile.jingcai", appContext.getPackageName());
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.maile.jingcai">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 访问网络权限,用于与服务器交互数据 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:name=".DuoBaoApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:name=".view.activity.LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".view.activity.MainActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="invitation"
android:scheme="duobaojingcai" />
</intent-filter>
</activity>
<!-- 微信 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoDisplay" />
</application>
</manifest>
\ No newline at end of file
package com.maile.jingcai;
import com.maile.jingcai.base.BaseApplication;
/**
* Created by chengfeng-piaopiao on 2017/11/7.
*/
public class DuoBaoApplication extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
}
}
package com.maile.jingcai.base;
import android.app.Application;
import android.content.Context;
import com.maile.jingcai.util.DrawUtil;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
/**
* Created by chengfeng-piaopiao on 2017/11/7.
*/
public class BaseApplication extends Application{
public static IWXAPI sApi;
protected static BaseApplication sInstance;
@Override
public void onCreate() {
super.onCreate();
DrawUtil.resetDensity(this);
regToWx();
}
//初始化微信SDK
//初始化QQSDK
//初始化推送SDK
public BaseApplication() {
sInstance = this;
}
public static Context getAppContext() {
return sInstance;
}
/**
* 向微信终端注册你的id
*/
public void regToWx() {
sApi = WXAPIFactory.createWXAPI(this, Constant.WEIXIN_APP_ID, true);
sApi.registerApp(Constant.WEIXIN_APP_ID);
}
}
package com.maile.jingcai.base;
/**
* Created by chengfeng-piaopiao on 2017/11/9.
*/
public class Constant {
public static final boolean DEBUG = true;
public static final String BASE_URL = "http://192.168.1.250:81";
public static final String WEIXIN_APP_ID = "wxac811a3942bd3638";
public static final String WEIXIN_APP_SECRET = "182ad59bb146ed391f7d6c8ce5664903";
public static final String WEIXIN_AUTH_LOGIN_INFO_SCOPE = "snsapi_userinfo";
public static final String WEIXIN_AUTH_LOGIN_INFO_STATE = "wtf";
}
package com.maile.jingcai.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* Created by zoubo on 15/12/31.
* 系统时间变化监听广播,当发生天数改变时,插入一条新数据到数据库
*/
public class SmsReceiver extends BroadcastReceiver {
private static final String ACTION_SMS_RECEIVER = "android.provider.Telephony.SMS_RECEIVED";
private Context mContext;
private SmsReceiverCallback mCallback;
public SmsReceiver(SmsReceiverCallback callback, Context context) {
super();
mCallback = callback;
mContext = context;
IntentFilter filter = new IntentFilter(ACTION_SMS_RECEIVER);
filter.setPriority(999);
context.registerReceiver(this, filter);
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg;
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
getCode(msg.getDisplayMessageBody());
}
}
}
private void getCode(String msg) {
String code;
String[] strings = msg.split(":");
if (strings[0].contains("香蕉打卡")) {
code = strings[1].substring(0, 4);
} else {
code = "";
}
Log.i("tangwen", "getCode code: " + code);
mCallback.onCallback(code);
}
public interface SmsReceiverCallback {
void onCallback(String code);
}
public void destory() {
if (mContext != null) {
try {
mContext.unregisterReceiver(this);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mContext = null;
mCallback = null;
}
}
\ No newline at end of file
package com.maile.jingcai.commponent;
/**
* Created by chengfeng-piaopiao on 2017/11/7.
*/
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import com.maile.jingcai.R;
/**
* Created by chenjingmian on 16/7/4.
*/
public class LoginClickBtn extends LinearLayout {
private boolean mIsFocus;
private Drawable mCoverDrawable;
public LoginClickBtn(Context context) {
super(context);
init(context);
}
public LoginClickBtn(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public LoginClickBtn(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mIsFocus = false;
mCoverDrawable = context.getResources().getDrawable(R.drawable.login_btn_click_cover);
initListener();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (w > 0 && h > 0) {
mCoverDrawable.setBounds(0, 0, w, h);
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mIsFocus) {
mCoverDrawable.draw(canvas);
}
}
private void initListener() {
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mIsFocus = true;
invalidate();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mIsFocus = false;
invalidate();
break;
}
return false;
}
});
}
}
package com.maile.jingcai.commponent;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import com.maile.jingcai.R;
/**
* Created by chenjingmian on 16/7/5.
*/
public class LoginClickTextView extends TextView {
private boolean mIsFocus;
private Drawable mCoverDrawable;
private boolean mClickable;
public LoginClickTextView(Context context) {
super(context);
init(context);
}
public LoginClickTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public LoginClickTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mIsFocus = false;
mClickable = true;
mCoverDrawable = context.getResources().getDrawable(R.drawable.login_btn_click_cover);
initListener();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (w > 0 && h > 0) {
mCoverDrawable.setBounds(0, 0, w, h);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mIsFocus) {
mCoverDrawable.draw(canvas);
}
}
private void initListener() {
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!mClickable) {
return false;
}
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mIsFocus = true;
invalidate();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mIsFocus = false;
invalidate();
break;
}
return false;
}
});
}
/**
* 设置是否屏蔽touch
* @param isDisallow true是屏蔽
*/
public void disallowTouch(boolean isDisallow) {
this.mClickable = !isDisallow;
}
}
package com.maile.jingcai.module;
/**
* @version v1.0.0
* @authon zjh
* @date 2016-06-28
* @desc
*/
public class User {
}
package com.maile.jingcai.module;
/**
* @author zjh
* @date 2016/8/19
*/
public class WrapperRspEntity<T> {
private int status;
private T data;
private String msg; //errorMSG;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "WrapperRspEntity{" +
"status=" + status +
", data=" + data +
", msg='" + msg + '\'' +
'}';
}
}
package com.maile.jingcai.module.api;
import com.maile.jingcai.module.User;
import com.maile.jingcai.module.WrapperRspEntity;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public interface LoginApiService {
@GET("code")
Observable<WrapperRspEntity<String>> getMessageFormALi (@Query("phone") String phone);
@GET("login")
Observable<WrapperRspEntity<String>> loginPhone (@Query("phone") String phone , @Query("code") String code);
@GET("thirdLogin")
Observable<WrapperRspEntity<String>> thirdLogin (@Query("channel") String channel ,
@Query("openid") String openid,
@Query("accountType") String accountType ,
@Query("avatar") String avatar , @Query("nickname") String nickname);
}
package com.maile.jingcai.module.net;
import com.maile.jingcai.base.Constant;
import com.maile.jingcai.module.net.interceptor.RspCheckInterceptor;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* @author zjh
* @date 2016/6/29
*/
public class RetrofitManager {
private static RetrofitManager mRetrofitManager;
private Retrofit mRetrofit;
private RetrofitManager(){
initRetrofit();
}
public static synchronized RetrofitManager getInstance(){
if (mRetrofitManager == null){
mRetrofitManager = new RetrofitManager();
}
return mRetrofitManager;
}
private void initRetrofit() {
HttpLoggingInterceptor LoginInterceptor = new HttpLoggingInterceptor();
LoginInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(new RspCheckInterceptor());
if (Constant.DEBUG){
builder.addInterceptor(LoginInterceptor);
}
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
builder.retryOnConnectionFailure(true);
OkHttpClient client = builder.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
}
public <T> T createReq(Class<T> reqServer){
return mRetrofit.create(reqServer);
}
}
package com.maile.jingcai.module.net.interceptor;
import com.maile.jingcai.util.InterceptorUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Response;
import okhttp3.ResponseBody;
/**
* @author zjh
* @date 2016/8/31
*/
public class RspCheckInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
try {
ResponseBody rspBody = response.body();
JSONObject jsonObject = new JSONObject(InterceptorUtils.getRspData(rspBody));
int status = jsonObject.getInt("code");//status
if (status != 0 && status != 200){
throw new IOException(jsonObject.getString("msg"));
}
} catch (JSONException e) {
e.printStackTrace();
throw new IOException("parase data error");
}catch (Exception e){
if (e instanceof IOException){
throw (IOException)e;
}
}
return response;
}
}
package com.maile.jingcai.util;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
/**
* @author zjh
* @date 2016/9/2
*/
public class InterceptorUtils {
private static final Charset UTF8 = Charset.forName("UTF-8");
public static String getRspData(ResponseBody responseBody) throws Exception {
long contentLength = responseBody.contentLength();
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) {
try {
charset = contentType.charset(UTF8);
} catch (UnsupportedCharsetException e) {
return null;
}
}
if (contentLength != 0) {
return new JSONObject(buffer.clone().readString(charset)).toString(); //because response content contain quotation mark
}
return null;
}
public static String getReqData(RequestBody requestBody) throws IOException {
Buffer buffer = new Buffer();
requestBody.writeTo(buffer);
return buffer.readString(UTF8);
}
public static Response changeRspData(Response response, String rspData) {
MediaType contentType = response.body().contentType();
ResponseBody body = ResponseBody.create(contentType,rspData);
return response.newBuilder().body(body).build();
}
}
package com.maile.jingcai.util;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.telephony.TelephonyManager;
/**
* Created by Administrator on 2015/8/11.
*/
public class NetUtils {
/**
* 是否连接网络
**/
public static boolean isNetworkOK(Context context) {
boolean result = false;
if (context != null) {
try {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
result = true;
}
}
} catch (NoSuchFieldError e) {
e.printStackTrace();
}
}
return result;
}
/**
* 判断是wifi还是3g网络
*/
public static boolean isWifi(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkINfo = cm.getActiveNetworkInfo();
if (networkINfo != null
&& networkINfo.getType() == ConnectivityManager.TYPE_WIFI) {
return true;
}
return false;
}
/**
* 判断WIFI是否打开
*/
public static boolean isWifiEnabled(Context context) {
ConnectivityManager mgrConn = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
TelephonyManager mgrTel = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
return ((mgrConn.getActiveNetworkInfo() != null && mgrConn
.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel
.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);
}
/**
* 获取当前网络状态,wifi,GPRS,3G,4G
*
* @param context
* @return
*/
public static String buildNetworkState(Context context) {
// build Network conditions
String ret = "";
try {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null) {
return ret;
}
if (networkinfo.getType() == ConnectivityManager.TYPE_WIFI) {
ret = "WIFI";
} else if (networkinfo.getType() == ConnectivityManager.TYPE_MOBILE) {
int subtype = networkinfo.getSubtype();
switch (subtype) {
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_IDEN:
// 2G
ret = "2G";
break;
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_UMTS:
// 3G,4G
ret = "3G/4G";
break;
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
// unknow
ret = "UNKNOW";
break;
}
} else {
ret = "UNKNOW";
}
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
/**
* 获取IP地址
**/
public static String getIpAddress(Context context) {
try {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int i = wifiInfo.getIpAddress();
return int2ip(i);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
/**
* 将ip的整数形式转换成ip形式
**/
public static String int2ip(int ipInt) {
StringBuilder sb = new StringBuilder();
sb.append(ipInt & 0xFF).append(".");
sb.append((ipInt >> 8) & 0xFF).append(".");
sb.append((ipInt >> 16) & 0xFF).append(".");
sb.append((ipInt >> 24) & 0xFF);
return sb.toString();
}
/*
* 打开设置网络界面
* */
public static void setNetworkMethod(final Context context) {
//提示对话框
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("网络不可用").setMessage("跑步精准定位地图需要很少网络支持,是否开启网络尽情跑步?").setPositiveButton("开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = null;
//判断手机系统的版本 即API大于10 就是3.0或以上版本
if (android.os.Build.VERSION.SDK_INT > 10) {
intent = new Intent(Settings.ACTION_SETTINGS);
} else {
intent = new Intent();
ComponentName component = new ComponentName("com.android.settings", "com.android.settings.WirelessSettings");
intent.setComponent(component);
intent.setAction("android.intent.action.VIEW");
}
context.startActivity(intent);
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
}
package com.maile.jingcai.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* @author zjh
* @date 2016/9/1
*/
public class NetworkUtils {
/**
* 判断是否有网络连接
* @param context
* @return
*/
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
}
package com.maile.jingcai.util;
import android.view.Gravity;
import android.widget.Toast;
import com.maile.jingcai.base.BaseApplication;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public class PublicUtils {
/**
* 去除空格
*/
public static String removeAllSpace(String str) {
String tmpStr = str.replace(" ", "");
return tmpStr;
}
public static void showToast(String showString) {
Toast toast = Toast.makeText(BaseApplication.getAppContext(), showString + "", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
package com.maile.jingcai.util.preferences;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public class DefaultConfigPreference {
}
package com.maile.jingcai.util.preferences;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public class IPreferencesIds {
// 文件名
public static final String DEFAULT_SHAREPREFERENCES_FILE = "default_cfg";
// KEY
public static final String IS_LOGIN = "is_login";
}
package com.maile.jingcai.util.preferences;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import java.util.Map;
import java.util.Set;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public final class PreferencesManager {
private SharedPreferences mPreferences;
private SharedPreferences.Editor mEditor;
private PreferencesManager() {
}
/**
* 获取默认的sp文件default_cfg.xml,默认模式为${@link Context#MODE_PRIVATE}
*
* @param context
* @return
*/
public static PreferencesManager getDefaultSharedPreference(Context context) {
return getSharedPreference(context,
IPreferencesIds.DEFAULT_SHAREPREFERENCES_FILE,
Context.MODE_PRIVATE);
}
/**
* 获取sp
*
* @param context
* @param name
* 文件名称
* @param mode
* 模式
* @return
*/
public static PreferencesManager getSharedPreference(Context context,
String name, int mode) {
if (context != null) {
try {
PreferencesManager preferencesManager = new PreferencesManager();
preferencesManager.mPreferences = context.getSharedPreferences(
name, mode);
preferencesManager.mEditor = preferencesManager.mPreferences
.edit();
return preferencesManager;
} catch (Exception e) {
// CSH-TODO send error report
}
}
return null;
}
/**
* 清除数据
*/
public void clear() {
if (mEditor != null) {
mEditor.clear().commit();
} else if (mPreferences != null) {
mEditor = mPreferences.edit();
mEditor.clear().commit();
}
}
public void remove(String key) {
mPreferences.edit().remove(key).commit();
}
public Map<String, ?> getAll() {
return mPreferences.getAll();
}
public boolean contains(String key) {
if (mPreferences == null || key == null) {
return false;
}
return mPreferences.contains(key);
}
public boolean getBoolean(String key, boolean defValue) {
if (mPreferences != null) {
return mPreferences.getBoolean(key, defValue);
}
return defValue;
}
public float getFloat(String key, float defValue) {
if (mPreferences != null) {
return mPreferences.getFloat(key, defValue);
}
return defValue;
}
public int getInt(String key, int defValue) {
if (mPreferences != null) {
return mPreferences.getInt(key, defValue);
}
return defValue;
}
public long getLong(String key, long defValue) {
if (mPreferences != null) {
return mPreferences.getLong(key, defValue);
}
return defValue;
}
public String getString(String key, String defValue) {
if (mPreferences != null) {
return mPreferences.getString(key, defValue);
}
return defValue;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public Set<String> getStringSet(String key, Set<String> defValues) {
if (mPreferences != null) {
return mPreferences.getStringSet(key, defValues);
}
return defValues;
}
public void registerOnSharedPreferenceChangeListener(
SharedPreferences.OnSharedPreferenceChangeListener listener) {
mPreferences.registerOnSharedPreferenceChangeListener(listener);
}
public void unregisterOnSharedPreferenceChangeListener(
SharedPreferences.OnSharedPreferenceChangeListener listener) {
mPreferences.unregisterOnSharedPreferenceChangeListener(listener);
}
public void putBoolean(String key, boolean b) {
if (mEditor != null) {
mEditor.putBoolean(key, b);
}
}
public void putInt(String key, int i) {
if (mEditor != null) {
mEditor.putInt(key, i);
}
}
public void putFloat(String key, float f) {
if (mEditor != null) {
mEditor.putFloat(key, f);
}
}
public void putLong(String key, long l) {
if (mEditor != null) {
mEditor.putLong(key, l);
}
}
public void putString(String key, String s) {
if (mEditor != null) {
mEditor.putString(key, s);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void putStringSet(String key, Set<String> values) {
if (mEditor != null) {
mEditor.putStringSet(key, values);
}
}
@SuppressLint("CommitPrefEdits")
public void edit() {
if (mEditor == null && mPreferences != null) {
mEditor = mPreferences.edit();
}
}
}
package com.maile.jingcai.view.activity;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.maile.jingcai.R;
import com.maile.jingcai.util.DrawUtil;
import com.maile.jingcai.util.preferences.IPreferencesIds;
import com.maile.jingcai.util.preferences.PreferencesManager;
import com.maile.jingcai.view.iview.ILoginView;
import com.maile.jingcai.view.layer.LoginMainLayer;
import com.maile.jingcai.view.layer.PhoneLayer;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class LoginActivity extends Activity implements ILoginView {
private final int DURATION_ANIM_OUT_START = 400;
private final int DURATION_ANIM_IN_LOGIN = 400;
private final int HANDLER_MAG_HIDE_ERRORBAR = 1;
private final int DURATION_ANIM_ERROR = 300;
@InjectView(R.id.main_layer)
LoginMainLayer mainLayer;
@InjectView(R.id.phoneLayer)
PhoneLayer phoneLayer;
@InjectView(R.id.error_tv)
TextView mErrorTextView;
@InjectView(R.id.error_bar)
LinearLayout mErrorBar;
@InjectView(R.id.iv_loading)
ProgressBar ivLoading;
@InjectView(R.id.rl_loading_layout)
RelativeLayout mLoading;
@InjectView(R.id.activity_home)
RelativeLayout activityHome;
private boolean mErrorVisible;
private int mErrorCurrentTop;
private int mErrorHideTop;
private ValueAnimator mErrorAnim;
private boolean mHasDestory;
private static Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_home);
ButterKnife.inject(this);
init();
startAnimToLogin();
}
private void init() {
ButterKnife.inject(this);
mContext = this;
phoneLayer.setLoginView(this);
mainLayer.setIoginView(this, this);
mErrorHideTop = -DrawUtil.dip2px(60);
mErrorCurrentTop = mErrorHideTop;
mHasDestory = false;
}
/**
* 启动页
*/
private void startAnimToLogin() {
AlphaAnimation alphaAnimIn = new AlphaAnimation(0, 1);
alphaAnimIn.setDuration(DURATION_ANIM_IN_LOGIN);
alphaAnimIn.setFillAfter(true);
mainLayer.startAnimation(alphaAnimIn);
alphaAnimIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
checkUserIsLogin();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
@Override
protected void onResume() {
super.onResume();
if (mainLayer != null) {
mainLayer.onResume();
}
}
//检测用户是否登录
private void checkUserIsLogin() {
PreferencesManager preferencesManager = PreferencesManager.getSharedPreference(getApplication(),
IPreferencesIds.DEFAULT_SHAREPREFERENCES_FILE,
Context.MODE_PRIVATE);
boolean isLogin = preferencesManager.getBoolean(IPreferencesIds.IS_LOGIN, false);
if (isLogin) {
onStartMainActivity();
} else {
//开启动画:显示登录入口
mainLayer.startAnimToLogin();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mHasDestory = true;
mContext = null;
ButterKnife.reset(this);
}
@Override
public void onEnterPhoneLayer() {
phoneLayer.onEnterPhoneLayer();
}
@Override
public void onStartMainActivity() {
startEntranceActivity(this);
}
public static void startEntranceActivity(Context context) {
Intent intent = new Intent(context, MainActivity.class);
context.startActivity(intent);
if (mContext != null) {
((Activity) mContext).finish();
}
}
@Override
public void onUpdateErrorBar(boolean visiable, int errorResId) {
if (visiable) {
showErrorBar(errorResId);
} else {
hideErrorBar();
}
}
@Override
public void onShowLoadingView(boolean visiable) {
mLoading.setVisibility(visiable ? View.VISIBLE : View.INVISIBLE);
}
@Override
public void onUpdateErrorBar(boolean visiable, String error) {
if (visiable) {
showErrorBar(error);
} else {
hideErrorBar();
}
}
private void showErrorBar(int errorResId) {
mErrorTextView.setText(errorResId);
startErrorAnim(true);
}
private void showErrorBar(String error) {
mErrorTextView.setText(error);
startErrorAnim(true);
}
private void hideErrorBar() {
startErrorAnim(false);
}
@Override
public void onBackPressed() {
if (phoneLayer.onBackPressed()) {
return;
}
super.onBackPressed();
myHandler.removeMessages(HANDLER_MAG_HIDE_ERRORBAR);
myHandler = null;
}
private void startErrorAnim(boolean isVisible) {
if (myHandler == null) {
return;
}
mErrorVisible = isVisible; //false
int start = mErrorCurrentTop;
int end = isVisible ? 0 : mErrorHideTop;
myHandler.removeMessages(HANDLER_MAG_HIDE_ERRORBAR);
if (start == end) {
if (isVisible) {
Message message = myHandler.obtainMessage(HANDLER_MAG_HIDE_ERRORBAR);
myHandler.sendMessageDelayed(message, 1000);
}
return;
}
if (mErrorAnim == null) {
mErrorAnim = ValueAnimator.ofInt(start, end);
mErrorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mErrorCurrentTop = (int) animation.getAnimatedValue();
((RelativeLayout.LayoutParams) mErrorBar.getLayoutParams()).topMargin = mErrorCurrentTop;
mErrorBar.requestLayout();
}
});
mErrorAnim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mErrorCurrentTop = mErrorVisible ? 0 : mErrorHideTop;//-60
((RelativeLayout.LayoutParams) mErrorBar.getLayoutParams()).topMargin = mErrorCurrentTop;
mErrorBar.requestLayout();
if (mErrorVisible && myHandler != null) {
Message message = myHandler.obtainMessage(HANDLER_MAG_HIDE_ERRORBAR);
myHandler.sendMessageDelayed(message, 1000);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
} else {
mErrorAnim.setIntValues(start, end);
}
mErrorAnim.setDuration((long) (Math.abs((end - start) * 1.0f / mErrorHideTop) * DURATION_ANIM_ERROR));
mErrorAnim.start();
}
Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case HANDLER_MAG_HIDE_ERRORBAR:
if (!mHasDestory) {
hideErrorBar();
}
break;
}
super.handleMessage(msg);
}
};
}
package com.maile.jingcai.view.activity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.maile.jingcai.R;
import butterknife.ButterKnife;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}
}
package com.maile.jingcai.view.iview;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public interface ILoginView {
void onEnterPhoneLayer();
void onStartMainActivity();
void onUpdateErrorBar(boolean visiable, String error);
void onUpdateErrorBar(boolean visiable, int errorResId);
void onShowLoadingView(boolean visiable);
}
package com.maile.jingcai.view.layer;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.maile.jingcai.R;
import com.maile.jingcai.base.BaseApplication;
import com.maile.jingcai.base.Constant;
import com.maile.jingcai.commponent.LoginClickBtn;
import com.maile.jingcai.util.NetUtils;
import com.maile.jingcai.view.iview.ILoginView;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
/**
* Created by chengfeng-piaopiao on 2017/11/8.
*/
public class LoginMainLayer extends RelativeLayout {
private final int DURATION_ANIM_OUT_START = 400;
private final int DURATION_ANIM_IN_LOGIN = 2800;
private Context mContext;
private boolean mWeixinLogining; // 是否微信登录中
@InjectView(R.id.iv_phone)
ImageView ivPhone;
@InjectView(R.id.tv_phone)
TextView tvPhone;
@InjectView(R.id.btn_login_phone)
LoginClickBtn btnLoginPhone;
@InjectView(R.id.iv_weixin)
ImageView ivWeixin;
@InjectView(R.id.tv_weixin)
TextView tvWeixin;
@InjectView(R.id.btn_login_weixin)
LoginClickBtn btnLoginWeixin;
@InjectView(R.id.ll_login_container)
LinearLayout llLoginContainer;
@InjectView(R.id.activity_home)
RelativeLayout activityHome;
private ILoginView iLoginView ;
private Activity parentActivity;
public LoginMainLayer(Context context) {
super(context);
init(context);
}
public LoginMainLayer(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public LoginMainLayer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mContext = context;
mWeixinLogining = false;
View view = LayoutInflater.from(context).inflate(R.layout.layour_login_main, this);
ButterKnife.inject(view,this);
startAnimToLogin();
}
public void setIoginView (ILoginView view ,Activity activity){
this.iLoginView = view;
this.parentActivity = activity;
}
@OnClick(R.id.btn_login_phone)
public void onPhoneClick(){
clearAnimation();
Log.d("tangwen", "onPhoneClick: onPhoneClick");
iLoginView.onEnterPhoneLayer();
}
@OnClick(R.id.btn_login_weixin)
public void onWeixinClick(){
loginWeixin_();
}
void loginWeixin_(){
iLoginView.onShowLoadingView(true);
if (!checkNetworkOK()) {
return;
}
if (!BaseApplication.sApi.isWXAppInstalled()) {
iLoginView.onUpdateErrorBar(true, R.string.login_install_weixin);
iLoginView.onShowLoadingView(false);
return;
}
mWeixinLogining = true;
final SendAuth.Req req = new SendAuth.Req();
req.scope = Constant.WEIXIN_AUTH_LOGIN_INFO_SCOPE;
req.state = Constant.WEIXIN_AUTH_LOGIN_INFO_STATE;
BaseApplication.sApi.sendReq(req);
}
private boolean checkNetworkOK() {
if (!NetUtils.isNetworkOK(mContext)) { //网络未连接
iLoginView.onUpdateErrorBar(true, R.string.network_not_ok);
iLoginView.onShowLoadingView(false);
return false;
}
return true;
}
/**
* 启动页切换到登录页
*/
public void startAnimToLogin() {
llLoginContainer.setVisibility(VISIBLE);
AlphaAnimation alphaAnimIn = new AlphaAnimation(0, 1);
alphaAnimIn.setDuration(DURATION_ANIM_IN_LOGIN);
alphaAnimIn.setFillAfter(true);
llLoginContainer.startAnimation(alphaAnimIn);
alphaAnimIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
public void onResume() {
if (mWeixinLogining) {
mWeixinLogining = false;
if (iLoginView != null) {
iLoginView.onShowLoadingView(false);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp" />
<solid android:color="#b1db49" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp" />
<solid android:color="#e1e1e1" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/loading"
android:pivotX="50%"
android:pivotY="50%" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="8dp" />
<solid android:color="#ffffff" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp" />
<solid android:color="#f3d800" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp" />
<solid android:color="#26000000" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp" />
<stroke
android:width="1dp"
android:color="#e8e8e9" />
<solid android:color="#00FFFFFF" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="25dp" />
<solid android:color="#FFA54F" />
</shape>
\ 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/activity_home"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.maile.jingcai.view.layer.LoginMainLayer
android:id="@+id/main_layer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.maile.jingcai.view.layer.PhoneLayer
android:id="@+id/phoneLayer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible"/>
<LinearLayout
android:id="@+id/error_bar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal"
android:background="#99000000"
android:gravity="center"
android:layout_marginTop="-60dp"
>
<ImageView
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginLeft="21dp"
android:layout_marginRight="8dp"
android:src="@drawable/login_error_img"
/>
<TextView
android:id="@+id/error_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textColor="#ffffff"
android:textSize="20sp"
/>
</LinearLayout>
<include
layout="@layout/layout_loading"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".view.activity.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.chaodong.hongyan.android.wxapi.WXEntryActivity">
<include
layout="@layout/layout_loading"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_phone_container"
android:orientation="vertical"
android:gravity="center"
android:paddingLeft="40dp"
android:paddingRight="40dp"
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/input_phone_layout"
android:layout_width="match_parent"
android:layout_height="46dp"
android:layout_marginTop="66dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:background="@drawable/login_input_bg"
>
<ImageView
android:layout_width="18dp"
android:layout_height="26dp"
android:src="@drawable/input_phone"
android:layout_marginLeft="17dp"
/>
<EditText
android:id="@+id/etv_login_phone"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@null"
android:digits="0123456789"
android:gravity="center_vertical"
android:hint="@string/login_input_phone_hint"
android:inputType="phone"
android:maxLength="13"
android:singleLine="true"
android:textColor="#cc222222"
android:textColorHint="#cacaca"
android:textCursorDrawable="@null"
android:layout_marginLeft="16dp"
android:textSize="17sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/input_checkcode_layout"
android:layout_width="match_parent"
android:layout_height="46dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_below="@+id/input_password_layout"
android:layout_marginTop="13dp"
android:background="@drawable/login_input_bg"
>
<ImageView
android:layout_width="28dp"
android:layout_height="23dp"
android:src="@drawable/input_checkcode"
android:layout_marginLeft="17dp"
/>
<EditText
android:id="@+id/etv_login_checkcode"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@null"
android:gravity="center_vertical"
android:hint="@string/login_input_checkcode_hint"
android:maxLength="20"
android:singleLine="true"
android:textColor="#cc222222"
android:textColorHint="#cacaca"
android:digits="0123456789"
android:textCursorDrawable="@null"
android:layout_marginLeft="7dp"
android:textSize="17sp" />
<com.maile.jingcai.commponent.LoginClickTextView
android:id="@+id/tv_checkcode_send"
android:layout_width="122dp"
android:layout_height="match_parent"
android:text="@string/login_input_checkcode_send"
android:background="@drawable/input_send_checkcode_bg"
android:gravity="center"
android:textSize="17sp"
android:textColor="#ffffff"
/>
</LinearLayout>
<com.maile.jingcai.commponent.LoginClickTextView
android:id="@+id/btn_login_phone"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/login_btn"
android:layout_below="@+id/login_input_view"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="@string/login"
android:gravity="center"
android:textColor="#ffffff"
android:textSize="18sp"
android:layout_marginTop="64dp"
/>
</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/activity_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/start_logo">
<LinearLayout
android:id="@+id/ll_login_container"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginLeft="35dp"
android:layout_marginRight="35dp"
android:layout_marginTop="19dp"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:visibility="invisible"
android:layout_marginBottom="60dp">
<com.maile.jingcai.commponent.LoginClickBtn
android:id="@+id/btn_login_phone"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/login_qq_btn"
android:gravity="center">
<ImageView
android:id="@+id/iv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/start_phone"
android:layout_marginRight="7dp"
/>
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#000000"
android:text="@string/login_phone"
android:gravity="center"
/>
</com.maile.jingcai.commponent.LoginClickBtn>
<com.maile.jingcai.commponent.LoginClickBtn
android:id="@+id/btn_login_weixin"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginLeft="25dp"
android:background="@drawable/login_qq_btn"
android:gravity="center">
<ImageView
android:id="@+id/iv_weixin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/start_weixin"
android:layout_marginRight="7dp"/>
<TextView
android:id="@+id/tv_weixin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="#000000"
android:text="@string/login_weixin"
android:gravity="center" />
</com.maile.jingcai.commponent.LoginClickBtn>
</LinearLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_loading_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"
android:clickable="true"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<RelativeLayout
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
android:background="@drawable/loading_bg"
>
<ProgressBar
android:id="@+id/iv_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/loading_animated"
android:indeterminateOnly="true" />
</RelativeLayout>
</RelativeLayout>
\ No newline at end of file
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
<resources>
<string name="app_name">DuoBaoJingCai</string>
<string name="login_phone">手机登录</string>
<string name="login_weixin">微信登录</string>
<string name="login_input_password_hint">密码</string>
<string name="login_input_phone_hint">手机号</string>
<string name="login_input_checkcode_hint">验证码</string>
<string name="login_input_checkcode_send">发送验证码</string>
<string name="login">登录</string>
<string name="user_error_please_input_right_phone">请输入正确的手机号码</string>
<string name="network_not_ok">网络未连接</string>
<string name="login_input_checkcode_clock">重发(%1$ss)</string>
<string name="login_install_weixin">请先安装微信</string>
<string name="error_server_not_ok">服务器开小差了</string>
<string name="error_server_timeout_error">请求超时</string>
<string name="user_error_input_code">请输入验证码</string>
</resources>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
package com.maile.jingcai;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// 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
}
ext {
//dependencies 项目以来
ButterKnife = "6.1.0"
Retrofit = "2.0.2"
loggingInterceptor = "3.2.0"
}
# 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
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
#!/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 "$@"
@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
include ':app'
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