ex
Fork of mbed-os-example-mbed5-blinky by
dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/oauth/api/AccessTokenManager.java@45:2aa9f933c8d2, 2017-07-18 (annotated)
- Committer:
- TMBOY
- Date:
- Tue Jul 18 16:34:48 2017 +0800
- Revision:
- 45:2aa9f933c8d2
?
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |
