// Path: app/src/main/java/moe/yukinoneko/diycode/bean/Token.java
// public class Token {
// 
//     @SerializedName("access_token") public String accessToken;      // 用户令牌(获取相关数据使用)
//     @SerializedName("token_type") public String tokenType;          // 令牌类型
//     @SerializedName("expires_in") public int expiresIn;             // 过期时间
//     @SerializedName("refresh_token") public String refreshToken;    // 刷新令牌(获取新的令牌)
//     @SerializedName("created_at") public int createdAt;             // 创建时间
// }
// 
// Path: app/src/main/java/moe/yukinoneko/diycode/tool/UserHelper.java
// public class UserHelper {
// 
//     private static final String TOKEN = "token";
//     private static final String USER = "user";
// 
//     private static SharedPreferences prefs;
// 
//     public static void init(Context context) {
//         prefs = new SecurePreferences(context.getApplicationContext());
//     }
// 
//     public static void saveToken(Token token) {
//         prefs.edit().putString(TOKEN, GSON.toJson(token)).apply();
//     }
// 
//     public static Token getToken() {
//         String tokenJson = prefs.getString(TOKEN, null);
//         if (tokenJson != null) {
//             return GSON.fromJson(tokenJson, Token.class);
//         }
//         return null;
//     }
// 
//     public static boolean isLogin() {
//         return null != getToken();
//     }
// 
//     public static boolean hasUser() {
//         return null != getUser();
//     }
// 
//     public static void saveUser(User user) {
//         prefs.edit().putString(USER, GSON.toJson(user)).apply();
//     }
// 
//     public static User getUser() {
//         String userJson = prefs.getString(USER, null);
//         if (userJson != null) {
//             return GSON.fromJson(userJson, User.class);
//         }
//         return null;
//     }
// 
//     public static void logout() {
//         prefs.edit().remove(USER).remove(TOKEN).apply();
//     }
// }


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.schedulers.Schedulers;
import moe.yukinoneko.diycode.bean.Token;
import moe.yukinoneko.diycode.tool.UserHelper;
import okhttp3.Authenticator;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
    }

    private DiyCodeRetrofit() {

        // 为所有请求自动添加 token
        Interceptor tokenInterceptor = new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                // 如果当前没有缓存 token 或者请求已经附带 token 了，就不再添加
                if (!UserHelper.isLogin() || alreadyHasAuthorizationHeader(originalRequest)) {
                    return chain.proceed(originalRequest);
                }
                String token = OAuth.TOKEN_PREFIX + UserHelper.getToken().accessToken;
                // 为请求附加 token
                Request authorised = originalRequest.newBuilder()
                                                    .header(OAuth.KEY_TOKEN, token)
                                                    .build();
                return chain.proceed(authorised);
            }
        };

        // 自动刷新 token
        Authenticator authenticator = new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) {
                TokenService tokenService = retrofit.create(TokenService.class);
                String accessToken = "";
                try {
                    if (UserHelper.isLogin()) {
// Path: app/src/main/java/moe/yukinoneko/diycode/bean/Token.java
// public class Token {
// 
//     @SerializedName("access_token") public String accessToken;      // 用户令牌(获取相关数据使用)
//     @SerializedName("token_type") public String tokenType;          // 令牌类型
//     @SerializedName("expires_in") public int expiresIn;             // 过期时间
//     @SerializedName("refresh_token") public String refreshToken;    // 刷新令牌(获取新的令牌)
//     @SerializedName("created_at") public int createdAt;             // 创建时间
// }
// 
// Path: app/src/main/java/moe/yukinoneko/diycode/tool/UserHelper.java
// public class UserHelper {
// 
//     private static final String TOKEN = "token";
//     private static final String USER = "user";
// 
//     private static SharedPreferences prefs;
// 
//     public static void init(Context context) {
//         prefs = new SecurePreferences(context.getApplicationContext());
//     }
// 
//     public static void saveToken(Token token) {
//         prefs.edit().putString(TOKEN, GSON.toJson(token)).apply();
//     }
// 
//     public static Token getToken() {
//         String tokenJson = prefs.getString(TOKEN, null);
//         if (tokenJson != null) {
//             return GSON.fromJson(tokenJson, Token.class);
//         }
//         return null;
//     }
// 
//     public static boolean isLogin() {
//         return null != getToken();
//     }
// 
//     public static boolean hasUser() {
//         return null != getUser();
//     }
// 
//     public static void saveUser(User user) {
//         prefs.edit().putString(USER, GSON.toJson(user)).apply();
//     }
// 
//     public static User getUser() {
//         String userJson = prefs.getString(USER, null);
//         if (userJson != null) {
//             return GSON.fromJson(userJson, User.class);
//         }
//         return null;
//     }
// 
//     public static void logout() {
//         prefs.edit().remove(USER).remove(TOKEN).apply();
//     }
// }


// Path: app/src/main/java/moe/yukinoneko/diycode/api/DiyCodeRetrofit.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import io.reactivex.schedulers.Schedulers;
import moe.yukinoneko.diycode.bean.Token;
import moe.yukinoneko.diycode.tool.UserHelper;
import okhttp3.Authenticator;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

    }

    private DiyCodeRetrofit() {

        // 为所有请求自动添加 token
        Interceptor tokenInterceptor = new Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {
                Request originalRequest = chain.request();
                // 如果当前没有缓存 token 或者请求已经附带 token 了，就不再添加
                if (!UserHelper.isLogin() || alreadyHasAuthorizationHeader(originalRequest)) {
                    return chain.proceed(originalRequest);
                }
                String token = OAuth.TOKEN_PREFIX + UserHelper.getToken().accessToken;
                // 为请求附加 token
                Request authorised = originalRequest.newBuilder()
                                                    .header(OAuth.KEY_TOKEN, token)
                                                    .build();
                return chain.proceed(authorised);
            }
        };

        // 自动刷新 token
        Authenticator authenticator = new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) {
                TokenService tokenService = retrofit.create(TokenService.class);
                String accessToken = "";
                try {
                    if (UserHelper.isLogin()) {
                        Call<Token> call = tokenService.refreshToken(OAuth.client_id,