ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:34:48 2017 +0800
Revision:
45:2aa9f933c8d2
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TMBOY 45:2aa9f933c8d2 1 /*
TMBOY 45:2aa9f933c8d2 2 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
TMBOY 45:2aa9f933c8d2 3 *
TMBOY 45:2aa9f933c8d2 4 * Licensed under the Apache License, Version 2.0 (the "License");
TMBOY 45:2aa9f933c8d2 5 * you may not use this file except in compliance with the License.
TMBOY 45:2aa9f933c8d2 6 * You may obtain a copy of the License at
TMBOY 45:2aa9f933c8d2 7 *
TMBOY 45:2aa9f933c8d2 8 * http://www.apache.org/licenses/LICENSE-2.0
TMBOY 45:2aa9f933c8d2 9 *
TMBOY 45:2aa9f933c8d2 10 * Unless required by applicable law or agreed to in writing, software
TMBOY 45:2aa9f933c8d2 11 * distributed under the License is distributed on an "AS IS" BASIS,
TMBOY 45:2aa9f933c8d2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TMBOY 45:2aa9f933c8d2 13 * See the License for the specific language governing permissions and
TMBOY 45:2aa9f933c8d2 14 * limitations under the License.
TMBOY 45:2aa9f933c8d2 15 */
TMBOY 45:2aa9f933c8d2 16 package com.baidu.duer.dcs.oauth.api;
TMBOY 45:2aa9f933c8d2 17
TMBOY 45:2aa9f933c8d2 18 import android.content.Context;
TMBOY 45:2aa9f933c8d2 19 import android.content.SharedPreferences;
TMBOY 45:2aa9f933c8d2 20 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
TMBOY 45:2aa9f933c8d2 21 import android.os.Bundle;
TMBOY 45:2aa9f933c8d2 22 import android.os.Parcel;
TMBOY 45:2aa9f933c8d2 23 import android.os.Parcelable;
TMBOY 45:2aa9f933c8d2 24
TMBOY 45:2aa9f933c8d2 25 import static com.baidu.duer.dcs.oauth.api.OauthPreferenceUtil.BAIDU_OAUTH_CONFIG;
TMBOY 45:2aa9f933c8d2 26
TMBOY 45:2aa9f933c8d2 27 /**
TMBOY 45:2aa9f933c8d2 28 * 对Token相关信息的管理类,包括初始化、存储、清除相应的token信息
TMBOY 45:2aa9f933c8d2 29 * 由于AccessTokenManager涉及到在多个Activity中传递的,所以实现了Parcelable接口
TMBOY 45:2aa9f933c8d2 30 * <p>
TMBOY 45:2aa9f933c8d2 31 * Created by zhangyan42@baidu.com on 2017/5/24.
TMBOY 45:2aa9f933c8d2 32 */
TMBOY 45:2aa9f933c8d2 33 public class AccessTokenManager implements Parcelable {
TMBOY 45:2aa9f933c8d2 34 // accessToken信息
TMBOY 45:2aa9f933c8d2 35 private String accessToken;
TMBOY 45:2aa9f933c8d2 36 // token过期时间
TMBOY 45:2aa9f933c8d2 37 private long expireTime = 0;
TMBOY 45:2aa9f933c8d2 38 // 当前的上下文环境
TMBOY 45:2aa9f933c8d2 39 private Context context;
TMBOY 45:2aa9f933c8d2 40
TMBOY 45:2aa9f933c8d2 41 /**
TMBOY 45:2aa9f933c8d2 42 * 构建AccessTokenManager类
TMBOY 45:2aa9f933c8d2 43 *
TMBOY 45:2aa9f933c8d2 44 * @param context 当前的上下文环境,通常为××Activity.this等
TMBOY 45:2aa9f933c8d2 45 */
TMBOY 45:2aa9f933c8d2 46 public AccessTokenManager(Context context) {
TMBOY 45:2aa9f933c8d2 47 this.context = context;
TMBOY 45:2aa9f933c8d2 48 compareWithConfig();
TMBOY 45:2aa9f933c8d2 49 }
TMBOY 45:2aa9f933c8d2 50
TMBOY 45:2aa9f933c8d2 51 /**
TMBOY 45:2aa9f933c8d2 52 * 通过Parcel流构建AccessTokenManager,主要用在Parcelable.Creator中
TMBOY 45:2aa9f933c8d2 53 *
TMBOY 45:2aa9f933c8d2 54 * @param source Parcel 流信息
TMBOY 45:2aa9f933c8d2 55 */
TMBOY 45:2aa9f933c8d2 56 public AccessTokenManager(Parcel source) {
TMBOY 45:2aa9f933c8d2 57 Bundle bundle = Bundle.CREATOR.createFromParcel(source);
TMBOY 45:2aa9f933c8d2 58 if (bundle != null) {
TMBOY 45:2aa9f933c8d2 59 this.accessToken = bundle.getString(OauthConfig.BundleKey.KEY_ACCESS_TOKEN);
TMBOY 45:2aa9f933c8d2 60 this.expireTime = bundle.getLong(OauthConfig.BundleKey.KEY_EXPIRE_TIME);
TMBOY 45:2aa9f933c8d2 61 }
TMBOY 45:2aa9f933c8d2 62 compareWithConfig();
TMBOY 45:2aa9f933c8d2 63 }
TMBOY 45:2aa9f933c8d2 64
TMBOY 45:2aa9f933c8d2 65 /**
TMBOY 45:2aa9f933c8d2 66 * 检查当token信息与配置文件是否保持一致,若不一致则对当前的token信息进行初始化
TMBOY 45:2aa9f933c8d2 67 */
TMBOY 45:2aa9f933c8d2 68 private void compareWithConfig() {
TMBOY 45:2aa9f933c8d2 69 if (this.context == null) {
TMBOY 45:2aa9f933c8d2 70 return;
TMBOY 45:2aa9f933c8d2 71 }
TMBOY 45:2aa9f933c8d2 72
TMBOY 45:2aa9f933c8d2 73 /**
TMBOY 45:2aa9f933c8d2 74 * 对配置的权限信息进行监控,保持多个AccessTokenManager对象之间的,权限信息一致。
TMBOY 45:2aa9f933c8d2 75 */
TMBOY 45:2aa9f933c8d2 76 final SharedPreferences sp = this.context.getSharedPreferences(BAIDU_OAUTH_CONFIG, Context.MODE_PRIVATE);
TMBOY 45:2aa9f933c8d2 77 sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {
TMBOY 45:2aa9f933c8d2 78
TMBOY 45:2aa9f933c8d2 79 @Override
TMBOY 45:2aa9f933c8d2 80 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
TMBOY 45:2aa9f933c8d2 81 String acToken = sp.getString(OauthConfig.PrefenenceKey.SP_ACCESS_TOKEN, null);
TMBOY 45:2aa9f933c8d2 82 if (accessToken != null && !accessToken.equals(acToken)) {
TMBOY 45:2aa9f933c8d2 83 initToken();
TMBOY 45:2aa9f933c8d2 84 }
TMBOY 45:2aa9f933c8d2 85 }
TMBOY 45:2aa9f933c8d2 86 });
TMBOY 45:2aa9f933c8d2 87 }
TMBOY 45:2aa9f933c8d2 88
TMBOY 45:2aa9f933c8d2 89 /**
TMBOY 45:2aa9f933c8d2 90 * 从SharedPreference中读取token数据,并初步判断数据的有效性
TMBOY 45:2aa9f933c8d2 91 */
TMBOY 45:2aa9f933c8d2 92 protected void initToken() {
TMBOY 45:2aa9f933c8d2 93 this.accessToken = OauthPreferenceUtil.getAccessToken(context);
TMBOY 45:2aa9f933c8d2 94 long expires = OauthPreferenceUtil.getExpires(context);
TMBOY 45:2aa9f933c8d2 95 long createTime = OauthPreferenceUtil.getCreateTime(context);
TMBOY 45:2aa9f933c8d2 96 long current = System.currentTimeMillis();
TMBOY 45:2aa9f933c8d2 97 this.expireTime = createTime + expires;
TMBOY 45:2aa9f933c8d2 98 if (expireTime != 0 && expireTime < current) {
TMBOY 45:2aa9f933c8d2 99 clearToken();
TMBOY 45:2aa9f933c8d2 100 }
TMBOY 45:2aa9f933c8d2 101 }
TMBOY 45:2aa9f933c8d2 102
TMBOY 45:2aa9f933c8d2 103 /**
TMBOY 45:2aa9f933c8d2 104 * 清楚SharedPreference中的所有数据
TMBOY 45:2aa9f933c8d2 105 */
TMBOY 45:2aa9f933c8d2 106 protected void clearToken() {
TMBOY 45:2aa9f933c8d2 107 OauthPreferenceUtil.clearAllOauth(context);
TMBOY 45:2aa9f933c8d2 108 this.accessToken = null;
TMBOY 45:2aa9f933c8d2 109 this.expireTime = 0;
TMBOY 45:2aa9f933c8d2 110 }
TMBOY 45:2aa9f933c8d2 111
TMBOY 45:2aa9f933c8d2 112 /**
TMBOY 45:2aa9f933c8d2 113 * 将token信息存储到SharedPreference中
TMBOY 45:2aa9f933c8d2 114 *
TMBOY 45:2aa9f933c8d2 115 * @param values token信息的key-value形式
TMBOY 45:2aa9f933c8d2 116 */
TMBOY 45:2aa9f933c8d2 117 protected void storeToken(Bundle values) {
TMBOY 45:2aa9f933c8d2 118 if (values == null || values.isEmpty()) {
TMBOY 45:2aa9f933c8d2 119 return;
TMBOY 45:2aa9f933c8d2 120 }
TMBOY 45:2aa9f933c8d2 121 this.accessToken = values.getString("access_token");
TMBOY 45:2aa9f933c8d2 122 // expires_in 返回值为秒
TMBOY 45:2aa9f933c8d2 123 long expiresIn = Long.parseLong(values.getString("expires_in")) * 1000;
TMBOY 45:2aa9f933c8d2 124 this.expireTime = System.currentTimeMillis() + expiresIn;
TMBOY 45:2aa9f933c8d2 125 OauthPreferenceUtil.setAccessToken(context, this.accessToken);
TMBOY 45:2aa9f933c8d2 126 OauthPreferenceUtil.setCreateTime(context, System.currentTimeMillis());
TMBOY 45:2aa9f933c8d2 127 OauthPreferenceUtil.setExpires(context, expiresIn);
TMBOY 45:2aa9f933c8d2 128 }
TMBOY 45:2aa9f933c8d2 129
TMBOY 45:2aa9f933c8d2 130 @Override
TMBOY 45:2aa9f933c8d2 131 public int describeContents() {
TMBOY 45:2aa9f933c8d2 132 return 0;
TMBOY 45:2aa9f933c8d2 133 }
TMBOY 45:2aa9f933c8d2 134
TMBOY 45:2aa9f933c8d2 135 @Override
TMBOY 45:2aa9f933c8d2 136 public void writeToParcel(Parcel dest, int flags) {
TMBOY 45:2aa9f933c8d2 137 Bundle bundle = new Bundle();
TMBOY 45:2aa9f933c8d2 138 if (this.accessToken != null) {
TMBOY 45:2aa9f933c8d2 139 bundle.putString(OauthConfig.BundleKey.KEY_ACCESS_TOKEN, this.accessToken);
TMBOY 45:2aa9f933c8d2 140 }
TMBOY 45:2aa9f933c8d2 141 if (this.expireTime != 0) {
TMBOY 45:2aa9f933c8d2 142 bundle.putLong(OauthConfig.BundleKey.KEY_EXPIRE_TIME, this.expireTime);
TMBOY 45:2aa9f933c8d2 143 }
TMBOY 45:2aa9f933c8d2 144 bundle.writeToParcel(dest, flags);
TMBOY 45:2aa9f933c8d2 145 }
TMBOY 45:2aa9f933c8d2 146
TMBOY 45:2aa9f933c8d2 147 public static final Creator<AccessTokenManager> CREATOR = new Creator<AccessTokenManager>() {
TMBOY 45:2aa9f933c8d2 148 @Override
TMBOY 45:2aa9f933c8d2 149 public AccessTokenManager createFromParcel(Parcel source) {
TMBOY 45:2aa9f933c8d2 150 return new AccessTokenManager(source);
TMBOY 45:2aa9f933c8d2 151 }
TMBOY 45:2aa9f933c8d2 152
TMBOY 45:2aa9f933c8d2 153 @Override
TMBOY 45:2aa9f933c8d2 154 public AccessTokenManager[] newArray(int size) {
TMBOY 45:2aa9f933c8d2 155 return new AccessTokenManager[size];
TMBOY 45:2aa9f933c8d2 156 }
TMBOY 45:2aa9f933c8d2 157
TMBOY 45:2aa9f933c8d2 158 };
TMBOY 45:2aa9f933c8d2 159
TMBOY 45:2aa9f933c8d2 160 /**
TMBOY 45:2aa9f933c8d2 161 * 判断当前的token信息是否有效
TMBOY 45:2aa9f933c8d2 162 *
TMBOY 45:2aa9f933c8d2 163 * @return true/false
TMBOY 45:2aa9f933c8d2 164 */
TMBOY 45:2aa9f933c8d2 165 protected boolean isSessionValid() {
TMBOY 45:2aa9f933c8d2 166 if (this.accessToken == null || this.expireTime == 0) {
TMBOY 45:2aa9f933c8d2 167 initToken();
TMBOY 45:2aa9f933c8d2 168 }
TMBOY 45:2aa9f933c8d2 169 return this.accessToken != null && this.expireTime != 0 && System.currentTimeMillis() < this.expireTime;
TMBOY 45:2aa9f933c8d2 170 }
TMBOY 45:2aa9f933c8d2 171
TMBOY 45:2aa9f933c8d2 172 /**
TMBOY 45:2aa9f933c8d2 173 * 获取AccessToken信息
TMBOY 45:2aa9f933c8d2 174 *
TMBOY 45:2aa9f933c8d2 175 * @return accessToken
TMBOY 45:2aa9f933c8d2 176 */
TMBOY 45:2aa9f933c8d2 177 public String getAccessToken() {
TMBOY 45:2aa9f933c8d2 178 if (this.accessToken == null) {
TMBOY 45:2aa9f933c8d2 179 initToken();
TMBOY 45:2aa9f933c8d2 180 }
TMBOY 45:2aa9f933c8d2 181 return this.accessToken;
TMBOY 45:2aa9f933c8d2 182 }
TMBOY 45:2aa9f933c8d2 183 }