package com.stardust.scriptdroid.tool; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.stardust.scriptdroid.BuildConfig; import com.stardust.util.NetworkUtils; /** * Created by Stardust on 2017/4/9. */ public class VersionInfo { private static final String KEY_DEPRECATED = "Still loving you...Can we go back..."; private static final String KEY_DEPRECATED_VERSION_CODE = "I miss you so much tonight...Baby don't let me cry..."; public interface OnReceiveUpdateResultCallback { void onReceive(UpdateChecker.UpdateInfo info, boolean isCurrentVersionDeprecated); } private static VersionInfo instance = new VersionInfo(); public static VersionInfo getInstance() { return instance; } private boolean mDeprecated = false; private UpdateChecker.UpdateInfo mUpdateInfo; private final int mReconnectTimes = 2; private int mReconnectCount = 0; private OnReceiveUpdateResultCallback mOnReceiveUpdateResultCallback; private SharedPreferences mSharedPreferences; public void readDeprecatedFromPref(Context context) { mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); if (mSharedPreferences.getInt(KEY_DEPRECATED_VERSION_CODE, 0) < BuildConfig.VERSION_CODE) { mSharedPreferences.edit().remove(KEY_DEPRECATED_VERSION_CODE) .putBoolean(KEY_DEPRECATED, false) .apply(); } mDeprecated = mSharedPreferences.getBoolean(KEY_DEPRECATED, false); } public void readDeprecatedFromPrefIfNeeded(Context context) { if (mSharedPreferences == null) { readDeprecatedFromPref(context); } } public boolean isCurrentVersionDeprecated() { return mDeprecated; } public UpdateChecker.UpdateInfo getUpdateInfo() { return mUpdateInfo; } public String getCurrentVersionIssues() { if (mUpdateInfo == null) return null; UpdateChecker.OldVersion oldVersion = mUpdateInfo.getOldVersion(BuildConfig.VERSION_CODE); if (oldVersion == null) return null; return oldVersion.issues; } public void checkUpdateIfNeeded(Context context) { if (mUpdateInfo == null) { checkUpdateIfUsingWifi(context); } } public void setOnReceiveUpdateResultCallback(OnReceiveUpdateResultCallback onReceiveUpdateResultCallback) { mOnReceiveUpdateResultCallback = onReceiveUpdateResultCallback; } private void checkUpdateIfUsingWifi(Context context) { if (NetworkUtils.isWifiAvailable(context)) { checkUpdate(context); } } public void checkUpdate(Context context) { mReconnectCount = 0; checkUpdateInner(context); } private void checkUpdateInner(final Context context) { mReconnectCount++; new UpdateChecker(context).check(new UpdateChecker.Callback() { @Override public void onSuccess(UpdateChecker.UpdateInfo result) { if (result.isValid()) { setUpdateInfo(result); } else if (mReconnectCount < mReconnectTimes) { checkUpdate(context); } } @Override public void onError(Exception exception) { if (mReconnectCount < mReconnectTimes) { checkUpdate(context); } } }); } private void setUpdateInfo(UpdateChecker.UpdateInfo result) { mDeprecated = BuildConfig.VERSION_CODE <= result.deprecated; mUpdateInfo = result; if (mDeprecated) { mSharedPreferences.edit().putBoolean(KEY_DEPRECATED, mDeprecated) .putInt(KEY_DEPRECATED_VERSION_CODE, BuildConfig.VERSION_CODE) .apply(); } if (mOnReceiveUpdateResultCallback != null) { mOnReceiveUpdateResultCallback.onReceive(result, mDeprecated); } } }