From ab71d5c60fedf02a1494f1c8a3773f2d2773cec3 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 12 Dec 2016 13:42:27 +0800 Subject: [PATCH] fixing http://stackoverflow.com/a/29776224/859190 updated icon --- .../twidere/constant/IntentConstants.java | 1 + .../constant/SharedPreferenceConstants.java | 10 +- .../model/account/conf/APIConfiguration.java | 8 - .../twidere/provider/TwidereDataStore.java | 9 - twidere/build.gradle | 4 +- twidere/src/main/AndroidManifest.xml | 1 + .../activity/BrowserSignInActivity.java | 304 ------------------ .../ThemedPreferenceDialogFragmentCompat.java | 15 + .../twidere/model/CustomAPIConfig.java | 63 +++- .../preference/DefaultAPIPreference.java | 210 ------------ .../twidere/activity/BaseActivity.kt | 3 + .../twidere/activity/BrowserSignInActivity.kt | 263 +++++++++++++++ .../twidere/activity/SignInActivity.kt | 150 ++++----- .../activity/iface/APIEditorActivity.kt | 86 ++--- .../twidere/constant/PreferenceKeys.kt | 4 +- .../fragment/AddUserFilterDialogFragment.kt | 2 +- .../preference/DefaultAPIPreference.kt | 152 +++++++++ .../twidere/task/UpdateProfileImageTask.kt | 5 +- .../mariotaku/twidere/util/AccountMigrator.kt | 21 +- .../twidere/util/dagger/DependencyHolder.kt | 4 + .../twidere/util/dagger/GeneralComponent.kt | 3 +- .../res/layout/activity_browser_sign_in.xml | 4 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 4511 -> 3974 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5933 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2551 -> 2342 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3382 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 7284 -> 5449 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 8190 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 13129 -> 9280 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 14232 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 19519 -> 13234 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 20293 bytes 32 files changed, 608 insertions(+), 714 deletions(-) delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/conf/APIConfiguration.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/activity/BrowserSignInActivity.kt create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/preference/DefaultAPIPreference.kt create mode 100644 twidere/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 twidere/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 twidere/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 twidere/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 twidere/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/IntentConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/IntentConstants.java index f58f5f9d8..5afd43e13 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/IntentConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/IntentConstants.java @@ -220,4 +220,5 @@ public interface IntentConstants { String EXTRA_SELECT_ONLY_ITEM = "select_only_item"; String EXTRA_OBJECT = "object"; String EXTRA_SIMPLE_LAYOUT = "simple_layout"; + String EXTRA_API_CONFIG = "api_config"; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java index 972e05228..6c0db186f 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java @@ -19,10 +19,12 @@ package org.mariotaku.twidere.constant; -import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.annotation.Preference; import org.mariotaku.twidere.model.account.cred.Credentials; +import static org.mariotaku.twidere.TwidereConstants.DEFAULT_TWITTER_API_URL_FORMAT; +import static org.mariotaku.twidere.TwidereConstants.TWITTER_CONSUMER_KEY; +import static org.mariotaku.twidere.TwidereConstants.TWITTER_CONSUMER_SECRET; import static org.mariotaku.twidere.annotation.PreferenceType.BOOLEAN; import static org.mariotaku.twidere.annotation.PreferenceType.INT; import static org.mariotaku.twidere.annotation.PreferenceType.LONG; @@ -231,7 +233,7 @@ public interface SharedPreferenceConstants { String KEY_PRELOAD_WIFI_ONLY = "preload_wifi_only"; @Preference(type = BOOLEAN) String KEY_NO_CLOSE_AFTER_TWEET_SENT = "no_close_after_tweet_sent"; - @Preference(type = STRING, hasDefault = false) + @Preference(type = STRING, hasDefault = true, defaultString = DEFAULT_TWITTER_API_URL_FORMAT) String KEY_API_URL_FORMAT = "api_url_format"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = true) String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; @@ -239,9 +241,9 @@ public interface SharedPreferenceConstants { String KEY_NO_VERSION_SUFFIX = "no_version_suffix"; @Preference(type = STRING, hasDefault = true, defaultString = Credentials.Type.OAUTH) String KEY_CREDENTIALS_TYPE = "credentials_type"; - @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY) + @Preference(type = STRING, hasDefault = true, defaultString = TWITTER_CONSUMER_KEY) String KEY_CONSUMER_KEY = "consumer_key"; - @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_SECRET) + @Preference(type = STRING, hasDefault = true, defaultString = TWITTER_CONSUMER_SECRET) String KEY_CONSUMER_SECRET = "consumer_secret"; String KEY_SETTINGS_WIZARD_COMPLETED = "settings_wizard_completed"; String KEY_CONSUMER_KEY_SECRET_SET = "consumer_key_secret_set"; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/conf/APIConfiguration.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/conf/APIConfiguration.java deleted file mode 100644 index 57482a4d1..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/account/conf/APIConfiguration.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.mariotaku.twidere.model.account.conf; - -/** - * Created by mariotaku on 2016/12/2. - */ - -public class APIConfiguration { -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java index 251bc45bb..200bb2d67 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java @@ -86,12 +86,6 @@ public interface TwidereDataStore { */ String AUTH_TYPE = "auth_type"; - /** - * Password of the account. (It will not stored)
- * Type: TEXT - */ - String PASSWORD = "password"; - String BASIC_AUTH_USERNAME = "basic_auth_username"; /** @@ -143,9 +137,6 @@ public interface TwidereDataStore { String ACCOUNT_USER = "account_user"; - String[] COLUMNS_NO_CREDENTIALS = {_ID, NAME, SCREEN_NAME, ACCOUNT_KEY, PROFILE_IMAGE_URL, - PROFILE_BANNER_URL, COLOR, IS_ACTIVATED, SORT_POSITION, ACCOUNT_TYPE, ACCOUNT_USER}; - String[] COLUMNS = {_ID, NAME, SCREEN_NAME, ACCOUNT_KEY, AUTH_TYPE, BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD, OAUTH_TOKEN, OAUTH_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET, API_URL_FORMAT, SAME_OAUTH_SIGNING_URL, NO_VERSION_SUFFIX, PROFILE_IMAGE_URL, diff --git a/twidere/build.gradle b/twidere/build.gradle index 8cced38af..134d1032a 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -35,8 +35,8 @@ android { applicationId "org.mariotaku.twidere" minSdkVersion 14 targetSdkVersion 25 - versionCode 230 - versionName '3.3.12' + versionCode 231 + versionName '3.3.13' multiDexEnabled true buildConfigField 'boolean', 'LEAK_CANARY_ENABLED', 'Boolean.parseBoolean("true")' diff --git a/twidere/src/main/AndroidManifest.xml b/twidere/src/main/AndroidManifest.xml index 206794b99..92ad8eb0a 100644 --- a/twidere/src/main/AndroidManifest.xml +++ b/twidere/src/main/AndroidManifest.xml @@ -86,6 +86,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:resizeableActivity="true" + android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Twidere.NoActionBar" tools:ignore="UnusedAttribute"> diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java deleted file mode 100644 index 4488740f2..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/BrowserSignInActivity.java +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.activity; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; -import android.view.MenuItem; -import android.view.View; -import android.webkit.CookieManager; -import android.webkit.JavascriptInterface; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.widget.Toast; - -import org.attoparser.ParseException; -import org.mariotaku.microblog.library.MicroBlogException; -import org.mariotaku.microblog.library.twitter.TwitterOAuth; -import org.mariotaku.restfu.http.Authorization; -import org.mariotaku.restfu.http.Endpoint; -import org.mariotaku.restfu.oauth.OAuthAuthorization; -import org.mariotaku.restfu.oauth.OAuthToken; -import org.mariotaku.twidere.BuildConfig; -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.extension.CredentialsExtensionsKt; -import org.mariotaku.twidere.model.SingleResponse; -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; -import org.mariotaku.twidere.util.AsyncTaskUtils; -import org.mariotaku.twidere.util.MicroBlogAPIFactory; -import org.mariotaku.twidere.util.OAuthPasswordAuthenticator; -import org.mariotaku.twidere.util.webkit.DefaultWebViewClient; - -import java.io.IOException; -import java.io.StringReader; -import java.util.Set; - -import static android.text.TextUtils.isEmpty; - -@SuppressLint("SetJavaScriptEnabled") -public class BrowserSignInActivity extends BaseActivity { - - private static final String INJECT_CONTENT = "javascript:window.injector.processHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');"; - - private WebView mWebView; - private View mProgressContainer; - - private WebSettings mWebSettings; - - private OAuthToken mRequestToken; - - private GetRequestTokenTask mTask; - - @Override - public void onContentChanged() { - super.onContentChanged(); - mWebView = (WebView) findViewById(R.id.webview); - mProgressContainer = findViewById(R.id.progress_container); - } - - @Override - public void onDestroy() { - getLoaderManager().destroyLoader(0); - super.onDestroy(); - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: { - finish(); - return true; - } - } - return super.onOptionsItemSelected(item); - } - - @SuppressLint("AddJavascriptInterface") - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_browser_sign_in); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - //noinspection deprecation - CookieManager.getInstance().removeAllCookie(); - } else { - CookieManager.getInstance().removeAllCookies(null); - } - mWebView.setWebViewClient(new AuthorizationWebViewClient(this)); - mWebView.setVerticalScrollBarEnabled(false); - mWebView.addJavascriptInterface(new InjectorJavaScriptInterface(this), "injector"); - mWebSettings = mWebView.getSettings(); - mWebSettings.setLoadsImagesAutomatically(true); - mWebSettings.setJavaScriptEnabled(true); - mWebSettings.setBlockNetworkImage(false); - mWebSettings.setSaveFormData(true); - getRequestToken(); - } - - private void getRequestToken() { - if (mRequestToken != null || mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) - return; - mTask = new GetRequestTokenTask(this); - AsyncTaskUtils.executeTask(mTask); - } - - private void loadUrl(final String url) { - if (mWebView == null) return; - mWebView.loadUrl(url); - } - - private String readOAuthPin(final String html) { - try { - OAuthPasswordAuthenticator.OAuthPinData data = new OAuthPasswordAuthenticator.OAuthPinData(); - OAuthPasswordAuthenticator.Companion.readOAuthPINFromHtml(new StringReader(html), data); - return data.getOauthPin(); - } catch (final ParseException | IOException e) { - Log.w(LOGTAG, e); - } - return null; - } - - private void setLoadProgressShown(final boolean shown) { - mProgressContainer.setVisibility(shown ? View.VISIBLE : View.GONE); - } - - private void setRequestToken(final OAuthToken token) { - mRequestToken = token; - } - - static class AuthorizationWebViewClient extends DefaultWebViewClient { - - AuthorizationWebViewClient(final BrowserSignInActivity activity) { - super(activity); - } - - @Override - public void onPageFinished(final WebView view, final String url) { - super.onPageFinished(view, url); - view.loadUrl(INJECT_CONTENT); - final BrowserSignInActivity activity = (BrowserSignInActivity) getActivity(); - activity.setLoadProgressShown(false); - Uri uri = Uri.parse(url); - // Hack for fanfou - if ("fanfou.com".equals(uri.getHost())) { - final String path = uri.getPath(); - final Set paramNames = uri.getQueryParameterNames(); - if ("/oauth/authorize".equals(path) && paramNames.contains("oauth_callback")) { - // Sign in successful response. - final OAuthToken requestToken = activity.mRequestToken; - if (requestToken != null) { - final Intent intent = new Intent(); - intent.putExtra(EXTRA_REQUEST_TOKEN, requestToken.getOauthToken()); - intent.putExtra(EXTRA_REQUEST_TOKEN_SECRET, requestToken.getOauthTokenSecret()); - activity.setResult(RESULT_OK, intent); - activity.finish(); - } - } - } - } - - @Override - public void onPageStarted(final WebView view, final String url, final Bitmap favicon) { - super.onPageStarted(view, url, favicon); - ((BrowserSignInActivity) getActivity()).setLoadProgressShown(true); - } - - @SuppressWarnings("deprecation") - @Override - public void onReceivedError(final WebView view, final int errorCode, final String description, - final String failingUrl) { - super.onReceivedError(view, errorCode, description, failingUrl); - final Activity activity = getActivity(); - Toast.makeText(activity, description, Toast.LENGTH_SHORT).show(); - activity.finish(); - } - - @Override - public boolean shouldOverrideUrlLoading(final WebView view, final String url) { - final Uri uri = Uri.parse(url); - if (url.startsWith(OAUTH_CALLBACK_URL)) { - final String oauthVerifier = uri.getQueryParameter(EXTRA_OAUTH_VERIFIER); - final BrowserSignInActivity activity = (BrowserSignInActivity) getActivity(); - final OAuthToken requestToken = activity.mRequestToken; - if (oauthVerifier != null && requestToken != null) { - final Intent intent = new Intent(); - intent.putExtra(EXTRA_OAUTH_VERIFIER, oauthVerifier); - intent.putExtra(EXTRA_REQUEST_TOKEN, requestToken.getOauthToken()); - intent.putExtra(EXTRA_REQUEST_TOKEN_SECRET, requestToken.getOauthTokenSecret()); - activity.setResult(RESULT_OK, intent); - activity.finish(); - } - return true; - } - return false; - } - - } - - static class GetRequestTokenTask extends AsyncTask> { - - private final String mConsumerKey, mConsumerSecret; - private final BrowserSignInActivity mActivity; - private final String mAPIUrlFormat; - private final boolean mSameOAuthSigningUrl; - - public GetRequestTokenTask(final BrowserSignInActivity activity) { - mActivity = activity; - final Intent intent = activity.getIntent(); - mConsumerKey = intent.getStringExtra(Accounts.CONSUMER_KEY); - mConsumerSecret = intent.getStringExtra(Accounts.CONSUMER_SECRET); - mAPIUrlFormat = intent.getStringExtra(Accounts.API_URL_FORMAT); - mSameOAuthSigningUrl = intent.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, true); - } - - @Override - protected SingleResponse doInBackground(final Object... params) { - if (isEmpty(mConsumerKey) || isEmpty(mConsumerSecret)) { - return new SingleResponse<>(); - } - try { - final Endpoint endpoint = MicroBlogAPIFactory.getOAuthSignInEndpoint(mAPIUrlFormat, - mSameOAuthSigningUrl); - final Authorization auth = new OAuthAuthorization(mConsumerKey, mConsumerSecret); - final TwitterOAuth oauth = CredentialsExtensionsKt.newMicroBlogInstance(mActivity, endpoint, - auth, true, null, TwitterOAuth.class); - return new SingleResponse<>(oauth.getRequestToken(OAUTH_CALLBACK_OOB), null, new Bundle()); - } catch (final MicroBlogException e) { - return new SingleResponse<>(null, e, new Bundle()); - } - } - - @Override - protected void onPostExecute(final SingleResponse result) { - mActivity.setLoadProgressShown(false); - if (result.hasData()) { - final OAuthToken token = result.getData(); - assert token != null; - mActivity.setRequestToken(token); - final Endpoint endpoint = MicroBlogAPIFactory.getOAuthSignInEndpoint(mAPIUrlFormat, true); - mActivity.loadUrl(endpoint.construct("/oauth/authorize", new String[]{"oauth_token", token.getOauthToken()})); - } else { - if (BuildConfig.DEBUG && result.hasException()) { - Log.w(LOGTAG, "Exception while browser sign in", result.getException()); - } - if (!mActivity.isFinishing()) { - Toast.makeText(mActivity, R.string.error_occurred, Toast.LENGTH_SHORT).show(); - mActivity.finish(); - } - } - } - - @Override - protected void onPreExecute() { - mActivity.setLoadProgressShown(true); - } - - } - - static class InjectorJavaScriptInterface { - - private final BrowserSignInActivity mActivity; - - InjectorJavaScriptInterface(final BrowserSignInActivity activity) { - mActivity = activity; - } - - @JavascriptInterface - public void processHTML(final String html) { - final String oauthVerifier = mActivity.readOAuthPin(html); - final OAuthToken requestToken = mActivity.mRequestToken; - if (oauthVerifier != null && requestToken != null) { - final Intent intent = new Intent(); - intent.putExtra(EXTRA_OAUTH_VERIFIER, oauthVerifier); - intent.putExtra(EXTRA_REQUEST_TOKEN, requestToken.getOauthToken()); - intent.putExtra(EXTRA_REQUEST_TOKEN_SECRET, requestToken.getOauthTokenSecret()); - mActivity.setResult(RESULT_OK, intent); - mActivity.finish(); - } - } - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/ThemedPreferenceDialogFragmentCompat.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/ThemedPreferenceDialogFragmentCompat.java index a679df087..f0c0cf3c4 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/ThemedPreferenceDialogFragmentCompat.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/ThemedPreferenceDialogFragmentCompat.java @@ -11,11 +11,26 @@ import android.support.v7.preference.PreferenceDialogFragmentCompat; import android.view.View; import android.view.Window; +import org.mariotaku.kpreferences.KPreferences; +import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; + +import javax.inject.Inject; + /** * Created by mariotaku on 16/3/15. */ public abstract class ThemedPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat { + @Inject + @NonNull + protected KPreferences kPreferences; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + GeneralComponentHelper.build(context).inject(this); + } + @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/CustomAPIConfig.java b/twidere/src/main/java/org/mariotaku/twidere/model/CustomAPIConfig.java index 02e98d5b6..628490a24 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/CustomAPIConfig.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/CustomAPIConfig.java @@ -3,10 +3,13 @@ package org.mariotaku.twidere.model; import android.content.Context; import android.content.res.AssetManager; import android.content.res.Resources; +import android.os.Parcel; +import android.os.Parcelable; import android.support.annotation.NonNull; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; import org.mariotaku.twidere.R; import org.mariotaku.twidere.model.account.cred.Credentials; @@ -25,8 +28,9 @@ import static org.mariotaku.twidere.TwidereConstants.TWITTER_CONSUMER_SECRET; /** * Created by mariotaku on 16/3/12. */ +@ParcelablePlease @JsonObject -public final class CustomAPIConfig { +public final class CustomAPIConfig implements Parcelable { @JsonField(name = "name") String name; @@ -46,7 +50,7 @@ public final class CustomAPIConfig { @JsonField(name = "consumer_secret") String consumerSecret; - CustomAPIConfig() { + public CustomAPIConfig() { } public CustomAPIConfig(String name, String apiUrlFormat, String credentialsType, boolean sameOAuthUrl, @@ -98,6 +102,52 @@ public final class CustomAPIConfig { return consumerSecret; } + public void setApiUrlFormat(String apiUrlFormat) { + this.apiUrlFormat = apiUrlFormat; + } + + public void setConsumerKey(String consumerKey) { + this.consumerKey = consumerKey; + } + + public void setConsumerSecret(String consumerSecret) { + this.consumerSecret = consumerSecret; + } + + public void setCredentialsType(String credentialsType) { + this.credentialsType = credentialsType; + } + + public void setSameOAuthUrl(boolean sameOAuthUrl) { + this.sameOAuthUrl = sameOAuthUrl; + } + + public void setNoVersionSuffix(boolean noVersionSuffix) { + this.noVersionSuffix = noVersionSuffix; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + CustomAPIConfigParcelablePlease.writeToParcel(this, dest, flags); + } + + public static final Creator CREATOR = new Creator() { + public CustomAPIConfig createFromParcel(Parcel source) { + CustomAPIConfig target = new CustomAPIConfig(); + CustomAPIConfigParcelablePlease.readFromParcel(target, source); + return target; + } + + public CustomAPIConfig[] newArray(int size) { + return new CustomAPIConfig[size]; + } + }; + @NonNull public static List listDefault(@NonNull Context context) { final AssetManager assets = context.getAssets(); @@ -114,10 +164,13 @@ public final class CustomAPIConfig { } } - public static List listBuiltin(@NonNull Context context) { - return Collections.singletonList(new CustomAPIConfig(context.getString(R.string.provider_default), + public static CustomAPIConfig builtin(@NonNull Context context) { + return new CustomAPIConfig(context.getString(R.string.provider_default), DEFAULT_TWITTER_API_URL_FORMAT, Credentials.Type.OAUTH, true, false, - TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET)); + TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET); } + public static List listBuiltin(@NonNull Context context) { + return Collections.singletonList(builtin(context)); + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java deleted file mode 100644 index 27ccbd2c4..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.preference; - -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.preference.DialogPreference; -import android.support.v7.preference.PreferenceFragmentCompat; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.RadioButton; -import android.widget.RadioGroup; -import android.widget.RadioGroup.OnCheckedChangeListener; -import android.widget.Toast; - -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.activity.iface.APIEditorActivity; -import org.mariotaku.twidere.fragment.ThemedPreferenceDialogFragmentCompat; -import org.mariotaku.twidere.model.account.cred.Credentials; -import org.mariotaku.twidere.preference.iface.IDialogPreference; -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; -import org.mariotaku.twidere.util.ParseUtils; - -import static org.mariotaku.twidere.util.Utils.trim; - -public class DefaultAPIPreference extends DialogPreference implements Constants, IDialogPreference { - - public DefaultAPIPreference(final Context context, final AttributeSet attrs) { - this(context, attrs, R.attr.dialogPreferenceStyle); - } - - public DefaultAPIPreference(final Context context, final AttributeSet attrs, final int defStyle) { - super(context, attrs, defStyle); - setDialogLayoutResource(R.layout.layout_api_editor); - } - - @Override - public void displayDialog(PreferenceFragmentCompat fragment) { - DefaultAPIPreferenceDialogFragment df = DefaultAPIPreferenceDialogFragment.newInstance(getKey()); - df.setTargetFragment(fragment, 0); - df.show(fragment.getFragmentManager(), getKey()); - } - - public static final class DefaultAPIPreferenceDialogFragment extends ThemedPreferenceDialogFragmentCompat { - - public static DefaultAPIPreferenceDialogFragment newInstance(String key) { - final DefaultAPIPreferenceDialogFragment df = new DefaultAPIPreferenceDialogFragment(); - final Bundle args = new Bundle(); - args.putString(ARG_KEY, key); - df.setArguments(args); - return df; - } - - private EditText mEditAPIUrlFormat; - private CheckBox mEditSameOAuthSigningUrl, mEditNoVersionSuffix; - private EditText mEditConsumerKey, mEditConsumerSecret; - private RadioGroup mEditAuthType; - private RadioButton mButtonOAuth, mButtonxAuth, mButtonBasic, mButtonTwipOMode; - private View mAPIFormatHelpButton; - private boolean mEditNoVersionSuffixChanged; - - @NonNull - @Override - public Dialog onCreateDialog(final Bundle savedInstanceState) { - final DialogPreference preference = getPreference(); - final Dialog dialog = super.onCreateDialog(savedInstanceState); - dialog.setOnShowListener(new DialogInterface.OnShowListener() { - @Override - public void onShow(DialogInterface dialog) { - final Dialog editDialog = (Dialog) dialog; - mEditAPIUrlFormat = (EditText) editDialog.findViewById(R.id.editApiUrlFormat); - mEditAuthType = (RadioGroup) editDialog.findViewById(R.id.editAuthType); - mButtonOAuth = (RadioButton) editDialog.findViewById(R.id.oauth); - mButtonxAuth = (RadioButton) editDialog.findViewById(R.id.xauth); - mButtonBasic = (RadioButton) editDialog.findViewById(R.id.basic); - mButtonTwipOMode = (RadioButton) editDialog.findViewById(R.id.twipO); - mEditSameOAuthSigningUrl = (CheckBox) editDialog.findViewById(R.id.editSameOAuthSigningUrl); - mEditNoVersionSuffix = (CheckBox) editDialog.findViewById(R.id.editNoVersionSuffix); - mEditConsumerKey = (EditText) editDialog.findViewById(R.id.editConsumerKey); - mEditConsumerSecret = (EditText) editDialog.findViewById(R.id.editConsumerSecret); - mAPIFormatHelpButton = editDialog.findViewById(R.id.apiUrlFormatHelp); - - mEditNoVersionSuffix.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - mEditNoVersionSuffixChanged = true; - } - }); - mEditAuthType.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - final String authType = APIEditorActivity.Companion.getCheckedAuthType(checkedId); - final boolean isOAuth = Credentials.Type.OAUTH.equals(authType) || Credentials.Type.XAUTH.equals(authType); - mEditSameOAuthSigningUrl.setVisibility(isOAuth ? View.VISIBLE : View.GONE); - mEditConsumerKey.setVisibility(isOAuth ? View.VISIBLE : View.GONE); - mEditConsumerSecret.setVisibility(isOAuth ? View.VISIBLE : View.GONE); - if (!mEditNoVersionSuffixChanged) { - mEditNoVersionSuffix.setChecked(Credentials.Type.EMPTY.equals(authType)); - } - } - }); - mAPIFormatHelpButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(getContext(), R.string.api_url_format_help, Toast.LENGTH_LONG).show(); - } - }); - - if (savedInstanceState != null) { - final String apiUrlFormat = savedInstanceState.getString(Accounts.API_URL_FORMAT); - final String authType = savedInstanceState.getString(Accounts.AUTH_TYPE); - final boolean sameOAuthSigningUrl = savedInstanceState.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL); - final boolean noVersionSuffix = savedInstanceState.getBoolean(Accounts.NO_VERSION_SUFFIX); - final String consumerKey = trim(savedInstanceState.getString(Accounts.CONSUMER_KEY)); - final String consumerSecret = trim(savedInstanceState.getString(Accounts.CONSUMER_SECRET)); - setValues(apiUrlFormat, authType, sameOAuthSigningUrl, noVersionSuffix, consumerKey, consumerSecret); - } else { - final SharedPreferences preferences = preference.getSharedPreferences(); - final String apiUrlFormat = preferences.getString(KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT); - final String authType = preferences.getString(KEY_CREDENTIALS_TYPE, Credentials.Type.OAUTH); - final boolean sameOAuthSigningUrl = preferences.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, true); - final boolean noVersionSuffix = preferences.getBoolean(KEY_NO_VERSION_SUFFIX, false); - final String consumerKey = trim(preferences.getString(KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY)); - final String consumerSecret = trim(preferences.getString(KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET)); - setValues(apiUrlFormat, authType, sameOAuthSigningUrl, noVersionSuffix, consumerKey, consumerSecret); - } - } - }); - return dialog; - } - - @Override - public void onDialogClosed(boolean positiveResult) { - if (!positiveResult) return; - DefaultAPIPreference preference = (DefaultAPIPreference) getPreference(); - final SharedPreferences preferences = preference.getSharedPreferences(); - - final String apiUrlFormat = ParseUtils.parseString(mEditAPIUrlFormat.getText()); - final String authType = APIEditorActivity.Companion.getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId()); - final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked(); - final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked(); - final String consumerKey = ParseUtils.parseString(mEditConsumerKey.getText()); - final String consumerSecret = ParseUtils.parseString(mEditConsumerSecret.getText()); - final SharedPreferences.Editor editor = preferences.edit(); - if (!TextUtils.isEmpty(consumerKey) && !TextUtils.isEmpty(consumerSecret)) { - editor.putString(KEY_CONSUMER_KEY, consumerKey); - editor.putString(KEY_CONSUMER_SECRET, consumerSecret); - } else { - editor.remove(KEY_CONSUMER_KEY); - editor.remove(KEY_CONSUMER_SECRET); - } - editor.putString(KEY_API_URL_FORMAT, apiUrlFormat); - editor.putString(KEY_CREDENTIALS_TYPE, authType); - editor.putBoolean(KEY_SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); - editor.putBoolean(KEY_NO_VERSION_SUFFIX, noVersionSuffix); - editor.apply(); - } - - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(Accounts.API_URL_FORMAT, ParseUtils.parseString(mEditAPIUrlFormat.getText())); - outState.putString(Accounts.AUTH_TYPE, APIEditorActivity.Companion.getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId())); - outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, mEditSameOAuthSigningUrl.isChecked()); - outState.putString(Accounts.CONSUMER_KEY, ParseUtils.parseString(mEditConsumerKey.getText())); - outState.putString(Accounts.CONSUMER_SECRET, ParseUtils.parseString(mEditConsumerSecret.getText())); - } - - private void setValues(final String apiUrlFormat, final String authType, final boolean sameOAuthSigningUrl, - final boolean noVersionSuffix, final String consumerKey, final String consumerSecret) { - mEditAPIUrlFormat.setText(apiUrlFormat); - mEditSameOAuthSigningUrl.setChecked(sameOAuthSigningUrl); - mEditNoVersionSuffix.setChecked(noVersionSuffix); - mEditConsumerKey.setText(consumerKey); - mEditConsumerSecret.setText(consumerSecret); - mEditAuthType.check(APIEditorActivity.Companion.getAuthTypeId(authType)); - if (mEditAuthType.getCheckedRadioButtonId() == -1) { - mButtonOAuth.setChecked(true); - } - } - } - -} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt index b4bda1024..cd9aea415 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BaseActivity.kt @@ -44,6 +44,7 @@ import com.afollestad.appthemeengine.Config import com.afollestad.appthemeengine.customizers.ATEStatusBarCustomizer import com.afollestad.appthemeengine.customizers.ATEToolbarCustomizer import com.squareup.otto.Bus +import org.mariotaku.kpreferences.KPreferences import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.Constants import org.mariotaku.twidere.TwidereConstants.SHARED_PREFERENCES_NAME @@ -76,6 +77,8 @@ open class BaseActivity : ATEActivity(), Constants, IExtendedActivity, IThemedAc @Inject lateinit var preferences: SharedPreferencesWrapper @Inject + lateinit var kPreferences: KPreferences + @Inject lateinit var notificationManager: NotificationManagerWrapper @Inject lateinit var mediaLoader: MediaLoaderWrapper diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BrowserSignInActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BrowserSignInActivity.kt new file mode 100644 index 000000000..026d81cd8 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/BrowserSignInActivity.kt @@ -0,0 +1,263 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2014 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.activity + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri +import android.os.AsyncTask +import android.os.Build +import android.os.Bundle +import android.text.TextUtils.isEmpty +import android.util.Log +import android.view.MenuItem +import android.view.View +import android.webkit.CookieManager +import android.webkit.JavascriptInterface +import android.webkit.WebView +import android.widget.Toast +import kotlinx.android.synthetic.main.activity_browser_sign_in.* +import org.attoparser.ParseException +import org.mariotaku.microblog.library.MicroBlogException +import org.mariotaku.microblog.library.twitter.TwitterOAuth +import org.mariotaku.restfu.oauth.OAuthAuthorization +import org.mariotaku.restfu.oauth.OAuthToken +import org.mariotaku.twidere.BuildConfig +import org.mariotaku.twidere.R +import org.mariotaku.twidere.TwidereConstants +import org.mariotaku.twidere.TwidereConstants.LOGTAG +import org.mariotaku.twidere.constant.IntentConstants.* +import org.mariotaku.twidere.extension.newMicroBlogInstance +import org.mariotaku.twidere.model.CustomAPIConfig +import org.mariotaku.twidere.model.SingleResponse +import org.mariotaku.twidere.util.AsyncTaskUtils +import org.mariotaku.twidere.util.MicroBlogAPIFactory +import org.mariotaku.twidere.util.OAuthPasswordAuthenticator +import org.mariotaku.twidere.util.webkit.DefaultWebViewClient +import java.io.IOException +import java.io.StringReader + +@SuppressLint("SetJavaScriptEnabled") +class BrowserSignInActivity : BaseActivity() { + + private var requestToken: OAuthToken? = null + private var task: GetRequestTokenTask? = null + + public override fun onDestroy() { + loaderManager.destroyLoader(0) + super.onDestroy() + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + finish() + return true + } + } + return super.onOptionsItemSelected(item) + } + + @SuppressLint("AddJavascriptInterface") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_browser_sign_in) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + CookieManager.getInstance().removeAllCookie() + } else { + CookieManager.getInstance().removeAllCookies(null) + } + webView.setWebViewClient(AuthorizationWebViewClient(this)) + webView.isVerticalScrollBarEnabled = false + webView.addJavascriptInterface(InjectorJavaScriptInterface(this), "injector") + val webSettings = webView.settings + webSettings.loadsImagesAutomatically = true + webSettings.javaScriptEnabled = true + webSettings.blockNetworkImage = false + webSettings.saveFormData = true + getRequestToken() + } + + private fun getRequestToken() { + if (requestToken != null || task != null && task!!.status == AsyncTask.Status.RUNNING) + return + task = GetRequestTokenTask(this) + AsyncTaskUtils.executeTask(task) + } + + private fun loadUrl(url: String) { + webView.loadUrl(url) + } + + private fun readOAuthPin(html: String): String? { + try { + val data = OAuthPasswordAuthenticator.OAuthPinData() + OAuthPasswordAuthenticator.readOAuthPINFromHtml(StringReader(html), data) + return data.oauthPin + } catch (e: ParseException) { + Log.w(LOGTAG, e) + } catch (e: IOException) { + Log.w(LOGTAG, e) + } + + return null + } + + private fun setLoadProgressShown(shown: Boolean) { + progressContainer.visibility = if (shown) View.VISIBLE else View.GONE + } + + private fun setRequestToken(token: OAuthToken) { + requestToken = token + } + + internal class AuthorizationWebViewClient(activity: BrowserSignInActivity) : DefaultWebViewClient(activity) { + + override fun onPageFinished(view: WebView, url: String) { + super.onPageFinished(view, url) + view.loadUrl(INJECT_CONTENT) + val activity = activity as BrowserSignInActivity + activity.setLoadProgressShown(false) + val uri = Uri.parse(url) + // Hack for fanfou + if ("fanfou.com" == uri.host) { + val path = uri.path + val paramNames = uri.queryParameterNames + if ("/oauth/authorize" == path && paramNames.contains("oauth_callback")) { + // Sign in successful response. + val requestToken = activity.requestToken + if (requestToken != null) { + val intent = Intent() + intent.putExtra(EXTRA_REQUEST_TOKEN, requestToken.oauthToken) + intent.putExtra(EXTRA_REQUEST_TOKEN_SECRET, requestToken.oauthTokenSecret) + activity.setResult(Activity.RESULT_OK, intent) + activity.finish() + } + } + } + } + + override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + (activity as BrowserSignInActivity).setLoadProgressShown(true) + } + + override fun onReceivedError(view: WebView, errorCode: Int, description: String?, + failingUrl: String?) { + super.onReceivedError(view, errorCode, description, failingUrl) + val activity = activity + Toast.makeText(activity, description, Toast.LENGTH_SHORT).show() + activity.finish() + } + + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + val uri = Uri.parse(url) + if (url.startsWith(TwidereConstants.OAUTH_CALLBACK_URL)) { + val oauthVerifier = uri.getQueryParameter(EXTRA_OAUTH_VERIFIER) + val activity = activity as BrowserSignInActivity + val requestToken = activity.requestToken + if (oauthVerifier != null && requestToken != null) { + val intent = Intent() + intent.putExtra(EXTRA_OAUTH_VERIFIER, oauthVerifier) + intent.putExtra(EXTRA_REQUEST_TOKEN, requestToken.oauthToken) + intent.putExtra(EXTRA_REQUEST_TOKEN_SECRET, requestToken.oauthTokenSecret) + activity.setResult(Activity.RESULT_OK, intent) + activity.finish() + } + return true + } + return false + } + + } + + internal class GetRequestTokenTask(private val activity: BrowserSignInActivity) : AsyncTask>() { + private val apiConfig: CustomAPIConfig + + init { + val intent = activity.intent + apiConfig = intent.getParcelableExtra(EXTRA_API_CONFIG) + } + + override fun doInBackground(vararg params: Any): SingleResponse { + if (isEmpty(apiConfig.consumerKey) || isEmpty(apiConfig.consumerSecret)) { + return SingleResponse() + } + try { + val endpoint = MicroBlogAPIFactory.getOAuthSignInEndpoint(apiConfig.apiUrlFormat, + apiConfig.isSameOAuthUrl) + val auth = OAuthAuthorization(apiConfig.consumerKey, apiConfig.consumerSecret) + val oauth = newMicroBlogInstance(activity, endpoint, + auth, true, null, TwitterOAuth::class.java) + return SingleResponse(oauth.getRequestToken(TwidereConstants.OAUTH_CALLBACK_OOB), null, Bundle()) + } catch (e: MicroBlogException) { + return SingleResponse(null, e, Bundle()) + } + + } + + override fun onPostExecute(result: SingleResponse) { + activity.setLoadProgressShown(false) + if (result.hasData()) { + val token = result.data!! + activity.setRequestToken(token) + val endpoint = MicroBlogAPIFactory.getOAuthSignInEndpoint(apiConfig.apiUrlFormat, true) + activity.loadUrl(endpoint.construct("/oauth/authorize", arrayOf("oauth_token", token.oauthToken))) + } else { + if (BuildConfig.DEBUG && result.hasException()) { + Log.w(LOGTAG, "Exception while browser sign in", result.exception) + } + if (!activity.isFinishing) { + Toast.makeText(activity, R.string.error_occurred, Toast.LENGTH_SHORT).show() + activity.finish() + } + } + } + + override fun onPreExecute() { + activity.setLoadProgressShown(true) + } + + } + + internal class InjectorJavaScriptInterface(private val activity: BrowserSignInActivity) { + + @JavascriptInterface + fun processHTML(html: String) { + val oauthVerifier = activity.readOAuthPin(html) + val requestToken = activity.requestToken + if (oauthVerifier != null && requestToken != null) { + val intent = Intent() + intent.putExtra(EXTRA_OAUTH_VERIFIER, oauthVerifier) + intent.putExtra(EXTRA_REQUEST_TOKEN, requestToken.oauthToken) + intent.putExtra(EXTRA_REQUEST_TOKEN_SECRET, requestToken.oauthTokenSecret) + activity.setResult(Activity.RESULT_OK, intent) + activity.finish() + } + } + } + + companion object { + + private val INJECT_CONTENT = "javascript:window.injector.processHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');" + } +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt index 2d686a571..b949f5054 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/SignInActivity.kt @@ -40,7 +40,6 @@ import android.text.InputType import android.text.TextUtils import android.text.TextWatcher import android.util.Log -import android.util.Pair import android.view.Menu import android.view.MenuItem import android.view.View @@ -52,7 +51,6 @@ import android.widget.Toast import com.bluelinelabs.logansquare.LoganSquare import com.rengwuxian.materialedittext.MaterialEditText import kotlinx.android.synthetic.main.activity_sign_in.* -import org.mariotaku.ktextension.set import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.twitter.TwitterOAuth @@ -68,10 +66,13 @@ import org.mariotaku.twidere.R import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.activity.iface.APIEditorActivity import org.mariotaku.twidere.annotation.AccountType +import org.mariotaku.twidere.constant.IntentConstants.EXTRA_API_CONFIG import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_CREDENTIALS_TYPE +import org.mariotaku.twidere.constant.defaultAPIConfigKey import org.mariotaku.twidere.extension.newMicroBlogInstance import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.fragment.ProgressDialogFragment +import org.mariotaku.twidere.model.CustomAPIConfig import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.SingleResponse import org.mariotaku.twidere.model.UserKey @@ -84,23 +85,15 @@ import org.mariotaku.twidere.model.account.cred.OAuthCredentials import org.mariotaku.twidere.model.util.AccountUtils import org.mariotaku.twidere.model.util.ParcelableUserUtils import org.mariotaku.twidere.model.util.UserKeyUtils -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts import org.mariotaku.twidere.util.* import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.* import org.mariotaku.twidere.util.view.ConsumerKeySecretValidator import java.lang.ref.WeakReference -import java.util.* class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { - private var apiUrlFormat: String? = null - @Credentials.Type - private var authType: String = Credentials.Type.EMPTY - private var consumerKey: String? = null - private var consumerSecret: String? = null + private lateinit var apiConfig: CustomAPIConfig private var apiChangeTimestamp: Long = 0 - private var sameOAuthSigningUrl: Boolean = false - private var noVersionSuffix: Boolean = false private var signInTask: AbstractSignInTask? = null private var accountAuthenticatorResponse: AccountAuthenticatorResponse? = null @@ -114,15 +107,13 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { setContentView(R.layout.activity_sign_in) if (savedInstanceState != null) { - apiUrlFormat = savedInstanceState.getString(Accounts.API_URL_FORMAT) - authType = savedInstanceState.getString(Accounts.AUTH_TYPE) - sameOAuthSigningUrl = savedInstanceState.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL) - consumerKey = savedInstanceState.getString(Accounts.CONSUMER_KEY)?.trim() - consumerSecret = savedInstanceState.getString(Accounts.CONSUMER_SECRET)?.trim() + apiConfig = savedInstanceState.getParcelable(EXTRA_API_CONFIG) apiChangeTimestamp = savedInstanceState.getLong(EXTRA_API_LAST_CHANGE) + } else { + apiConfig = kPreferences[defaultAPIConfigKey] } - val isTwipOMode = authType == Credentials.Type.EMPTY + val isTwipOMode = apiConfig.credentialsType == Credentials.Type.EMPTY usernamePasswordContainer.visibility = if (isTwipOMode) View.GONE else View.VISIBLE signInSignUpContainer.orientation = if (isTwipOMode) LinearLayout.VERTICAL else LinearLayout.HORIZONTAL @@ -166,12 +157,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { when (requestCode) { REQUEST_EDIT_API -> { if (resultCode == Activity.RESULT_OK) { - apiUrlFormat = data!!.getStringExtra(Accounts.API_URL_FORMAT) - authType = data.getStringExtra(Accounts.AUTH_TYPE) ?: Credentials.Type.OAUTH - sameOAuthSigningUrl = data.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, false) - noVersionSuffix = data.getBooleanExtra(Accounts.NO_VERSION_SUFFIX, false) - consumerKey = data.getStringExtra(Accounts.CONSUMER_KEY) - consumerSecret = data.getStringExtra(Accounts.CONSUMER_SECRET) + apiConfig = data!!.getParcelableExtra(EXTRA_API_CONFIG) updateSignInType() } setSignInButton() @@ -208,7 +194,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { } internal fun updateSignInType() { - when (authType) { + when (apiConfig.credentialsType) { Credentials.Type.XAUTH, Credentials.Type.BASIC -> { usernamePasswordContainer.visibility = View.VISIBLE signInSignUpContainer.orientation = LinearLayout.HORIZONTAL @@ -267,12 +253,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { return false setDefaultAPI() val intent = Intent(this, APIEditorActivity::class.java) - intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat) - intent.putExtra(Accounts.AUTH_TYPE, authType) - intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl) - intent.putExtra(Accounts.NO_VERSION_SUFFIX, noVersionSuffix) - intent.putExtra(Accounts.CONSUMER_KEY, consumerKey) - intent.putExtra(Accounts.CONSUMER_SECRET, consumerSecret) + intent.putExtra(EXTRA_API_CONFIG, apiConfig) startActivityForResult(intent, REQUEST_EDIT_API) } } @@ -280,13 +261,10 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { } internal fun openBrowserLogin(): Boolean { - if (authType != Credentials.Type.OAUTH || signInTask != null && signInTask!!.status == AsyncTask.Status.RUNNING) + if (apiConfig.credentialsType != Credentials.Type.OAUTH || signInTask != null && signInTask!!.status == AsyncTask.Status.RUNNING) return true val intent = Intent(this, BrowserSignInActivity::class.java) - intent.putExtra(Accounts.CONSUMER_KEY, consumerKey) - intent.putExtra(Accounts.CONSUMER_SECRET, consumerSecret) - intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat) - intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl) + intent.putExtra(EXTRA_API_CONFIG, apiConfig) startActivityForResult(intent, REQUEST_BROWSER_SIGN_IN) return false } @@ -294,7 +272,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { override fun onPrepareOptionsMenu(menu: Menu): Boolean { val itemBrowser = menu.findItem(R.id.open_in_browser) if (itemBrowser != null) { - val is_oauth = authType == Credentials.Type.OAUTH + val is_oauth = apiConfig.credentialsType == Credentials.Type.OAUTH itemBrowser.isVisible = is_oauth itemBrowser.isEnabled = is_oauth } @@ -302,13 +280,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { } public override fun onSaveInstanceState(outState: Bundle) { - setDefaultAPI() - outState.putString(Accounts.API_URL_FORMAT, apiUrlFormat) - outState.putString(Accounts.AUTH_TYPE, authType) - outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl) - outState.putBoolean(Accounts.NO_VERSION_SUFFIX, noVersionSuffix) - outState.putString(Accounts.CONSUMER_KEY, consumerKey) - outState.putString(Accounts.CONSUMER_SECRET, consumerSecret) + outState.putParcelable(EXTRA_API_CONFIG, apiConfig) outState.putLong(EXTRA_API_LAST_CHANGE, apiChangeTimestamp) super.onSaveInstanceState(outState) } @@ -322,33 +294,32 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { if (signInTask != null && signInTask!!.status == AsyncTask.Status.RUNNING) { signInTask!!.cancel(true) } - setDefaultAPI() - if (authType == Credentials.Type.OAUTH && editUsername.length() <= 0) { + if (apiConfig.credentialsType == Credentials.Type.OAUTH && editUsername.length() <= 0) { openBrowserLogin() return } - val consumerKey = MicroBlogAPIFactory.getOAuthToken(this.consumerKey, consumerSecret) - val apiUrlFormat = if (TextUtils.isEmpty(this.apiUrlFormat)) DEFAULT_TWITTER_API_URL_FORMAT else this.apiUrlFormat!! + + val consumerKey = MicroBlogAPIFactory.getOAuthToken(apiConfig.consumerKey, apiConfig.consumerSecret) + val apiUrlFormat = apiConfig.apiUrlFormat ?: DEFAULT_TWITTER_API_URL_FORMAT val username = editUsername.text.toString() val password = editPassword.text.toString() - signInTask = SignInTask(this, username, password, authType, consumerKey, apiUrlFormat, - sameOAuthSigningUrl, noVersionSuffix) + signInTask = SignInTask(this, username, password, apiConfig.credentialsType, consumerKey, apiUrlFormat, + apiConfig.isSameOAuthUrl, apiConfig.isNoVersionSuffix) AsyncTaskUtils.executeTask(signInTask) } private fun doBrowserLogin(intent: Intent?) { if (intent == null) return - if (signInTask != null && signInTask!!.status == AsyncTask.Status.RUNNING) { - signInTask!!.cancel(true) + if (signInTask?.status == AsyncTask.Status.RUNNING) { + signInTask?.cancel(true) } - setDefaultAPI() val verifier = intent.getStringExtra(EXTRA_OAUTH_VERIFIER) - val consumerKey = MicroBlogAPIFactory.getOAuthToken(this.consumerKey, consumerSecret) + val consumerKey = MicroBlogAPIFactory.getOAuthToken(apiConfig.consumerKey, apiConfig.consumerSecret) val requestToken = OAuthToken(intent.getStringExtra(EXTRA_REQUEST_TOKEN), intent.getStringExtra(EXTRA_REQUEST_TOKEN_SECRET)) - val apiUrlFormat = if (TextUtils.isEmpty(this.apiUrlFormat)) DEFAULT_TWITTER_API_URL_FORMAT else this.apiUrlFormat!! + val apiUrlFormat = apiConfig.apiUrlFormat ?: DEFAULT_TWITTER_API_URL_FORMAT signInTask = BrowserSignInTask(this, consumerKey, requestToken, verifier, apiUrlFormat, - sameOAuthSigningUrl, noVersionSuffix) + apiConfig.isSameOAuthUrl, apiConfig.isNoVersionSuffix) AsyncTaskUtils.executeTask(signInTask) } @@ -362,23 +333,23 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { val noVersionSuffix = preferences.getBoolean(KEY_NO_VERSION_SUFFIX, false) val consumerKey = Utils.getNonEmptyString(preferences, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY) val consumerSecret = Utils.getNonEmptyString(preferences, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET) - if (TextUtils.isEmpty(this.apiUrlFormat) || defaultApiChanged) { - this.apiUrlFormat = apiUrlFormat + if (TextUtils.isEmpty(apiConfig.apiUrlFormat) || defaultApiChanged) { + apiConfig.apiUrlFormat = apiUrlFormat } if (defaultApiChanged) { - this.authType = authType + apiConfig.credentialsType = authType } if (defaultApiChanged) { - this.sameOAuthSigningUrl = sameOAuthSigningUrl + apiConfig.isSameOAuthUrl = sameOAuthSigningUrl } if (defaultApiChanged) { - this.noVersionSuffix = noVersionSuffix + apiConfig.isNoVersionSuffix = noVersionSuffix } - if (TextUtils.isEmpty(this.consumerKey) || defaultApiChanged) { - this.consumerKey = consumerKey + if (TextUtils.isEmpty(apiConfig.consumerKey) || defaultApiChanged) { + apiConfig.consumerKey = consumerKey } - if (TextUtils.isEmpty(this.consumerSecret) || defaultApiChanged) { - this.consumerSecret = consumerSecret + if (TextUtils.isEmpty(apiConfig.consumerSecret) || defaultApiChanged) { + apiConfig.consumerSecret = consumerSecret } if (defaultApiChanged) { apiChangeTimestamp = apiLastChange @@ -386,7 +357,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { } private fun setSignInButton() { - when (authType) { + when (apiConfig.credentialsType) { Credentials.Type.XAUTH, Credentials.Type.BASIC -> { passwordSignIn.visibility = View.GONE signIn.isEnabled = editPassword.text.isNotEmpty() && editUsername.text.isNotEmpty() @@ -738,19 +709,19 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { val credentials: Credentials, val user: ParcelableUser, val color: Int = 0, - val accountType: Pair + val accountType: Pair ) { - private fun writeAccountInfo(map: MutableMap) { - map[ACCOUNT_USER_DATA_KEY] = user.key.toString() - map[ACCOUNT_USER_DATA_TYPE] = accountType.first - map[ACCOUNT_USER_DATA_CREDS_TYPE] = credsType + private fun writeAccountInfo(action: (k: String, v: String?) -> Unit) { + action(ACCOUNT_USER_DATA_KEY, user.key.toString()) + action(ACCOUNT_USER_DATA_TYPE, accountType.first) + action(ACCOUNT_USER_DATA_CREDS_TYPE, credsType) - map[ACCOUNT_USER_DATA_ACTIVATED] = true.toString() - map[ACCOUNT_USER_DATA_COLOR] = toHexColor(color) + action(ACCOUNT_USER_DATA_ACTIVATED, true.toString()) + action(ACCOUNT_USER_DATA_COLOR, toHexColor(color)) - map[ACCOUNT_USER_DATA_USER] = LoganSquare.serialize(user) - map[ACCOUNT_USER_DATA_EXTRAS] = accountType.second + action(ACCOUNT_USER_DATA_USER, LoganSquare.serialize(user)) + action(ACCOUNT_USER_DATA_EXTRAS, accountType.second) } private fun writeAuthToken(am: AccountManager, account: Account) { @@ -759,9 +730,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { fun updateAccount(am: AccountManager) { val account = AccountUtils.findByAccountKey(am, user.key) ?: return - val map: MutableMap = HashMap() - writeAccountInfo(map) - for ((k, v) in map) { + writeAccountInfo { k, v -> am.setUserData(account, k, v) } writeAuthToken(am, account) @@ -769,14 +738,13 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { fun addAccount(am: AccountManager): Account { val account = Account(UserKey(user.screen_name, user.key.host).toString(), ACCOUNT_TYPE) - val map: MutableMap = HashMap() - writeAccountInfo(map) - val userData = Bundle() - for ((k, v) in map) { - userData[k] = v + val accountPosition = AccountUtils.getAccounts(am).size + // Don't add UserData in this method, see http://stackoverflow.com/a/29776224/859190 + am.addAccountExplicitly(account, null, null) + writeAccountInfo { k, v -> + am.setUserData(account, k, v) } - userData[ACCOUNT_USER_DATA_POSITION] = AccountUtils.getAccounts(am).size.toString() - am.addAccountExplicitly(account, null, userData) + am.setUserData(account, ACCOUNT_USER_DATA_POSITION, accountPosition.toString()) writeAuthToken(am, account) return account } @@ -1014,7 +982,7 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { private val EXTRA_API_LAST_CHANGE = "api_last_change" private val DEFAULT_TWITTER_API_URL_FORMAT = "https://[DOMAIN.]twitter.com/" - internal fun detectAccountType(twitter: MicroBlog, user: User): Pair { + internal fun detectAccountType(twitter: MicroBlog, user: User): Pair { try { // Get StatusNet specific resource val config = twitter.statusNetConfig @@ -1023,8 +991,8 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { if (site != null) { extra.textLimit = site.textLimit } - return Pair.create(AccountType.STATUSNET, - JsonSerializer.serialize(extra, StatusNetAccountExtras::class.java)) + return Pair(AccountType.STATUSNET, JsonSerializer.serialize(extra, + StatusNetAccountExtras::class.java)) } catch (e: MicroBlogException) { // Ignore } @@ -1036,16 +1004,16 @@ class SignInActivity : BaseActivity(), OnClickListener, TextWatcher { twitter.getActivitiesAboutMe(paging) val extra = TwitterAccountExtras() extra.setIsOfficialCredentials(true) - return Pair.create(AccountType.TWITTER, - JsonSerializer.serialize(extra, TwitterAccountExtras::class.java)) + return Pair(AccountType.TWITTER, JsonSerializer.serialize(extra, + TwitterAccountExtras::class.java)) } catch (e: MicroBlogException) { // Ignore } if (UserKeyUtils.isFanfouUser(user)) { - return Pair.create(AccountType.FANFOU, null) + return Pair(AccountType.FANFOU, null) } - return Pair.create(AccountType.TWITTER, null) + return Pair(AccountType.TWITTER, null) } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/APIEditorActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/APIEditorActivity.kt index 3f8a6310a..4e738a3ee 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/APIEditorActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/iface/APIEditorActivity.kt @@ -46,16 +46,15 @@ import org.mariotaku.restfu.http.HttpResponse import org.mariotaku.restfu.http.RestHttpClient import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.R -import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.activity.BaseActivity import org.mariotaku.twidere.adapter.ArrayAdapter +import org.mariotaku.twidere.constant.IntentConstants.EXTRA_API_CONFIG +import org.mariotaku.twidere.constant.defaultAPIConfigKey import org.mariotaku.twidere.fragment.BaseDialogFragment import org.mariotaku.twidere.model.CustomAPIConfig import org.mariotaku.twidere.model.account.cred.Credentials -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts import org.mariotaku.twidere.util.JsonSerializer import org.mariotaku.twidere.util.MicroBlogAPIFactory -import org.mariotaku.twidere.util.ParseUtils import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.dagger.GeneralComponentHelper import java.io.IOException @@ -103,75 +102,38 @@ class APIEditorActivity : BaseActivity(), OnCheckedChangeListener, OnClickListen } public override fun onSaveInstanceState(outState: Bundle) { - val apiUrlFormat = ParseUtils.parseString(this.editApiUrlFormat.text) - val authType = getCheckedAuthType(this.editAuthType.checkedRadioButtonId) - val sameOAuthSigningUrl = this.editSameOAuthSigningUrl.isChecked - val noVersionSuffix = this.editNoVersionSuffix.isChecked - val consumerKey = ParseUtils.parseString(this.editConsumerKey.text) - val consumerSecret = ParseUtils.parseString(this.editConsumerSecret.text) - outState.putString(Accounts.API_URL_FORMAT, apiUrlFormat) - outState.putString(Accounts.AUTH_TYPE, authType) - outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl) - outState.putBoolean(Accounts.NO_VERSION_SUFFIX, noVersionSuffix) - outState.putString(Accounts.CONSUMER_KEY, consumerKey) - outState.putString(Accounts.CONSUMER_SECRET, consumerSecret) + outState.putParcelable(EXTRA_API_CONFIG, createCustomAPIConfig()) super.onSaveInstanceState(outState) } fun saveAndFinish() { - val apiUrlFormat = ParseUtils.parseString(this.editApiUrlFormat.text) - val authType = getCheckedAuthType(this.editAuthType.checkedRadioButtonId) - val sameOAuthSigningUrl = this.editSameOAuthSigningUrl.isChecked - val noVersionSuffix = this.editNoVersionSuffix.isChecked - val consumerKey = ParseUtils.parseString(this.editConsumerKey.text) - val consumerSecret = ParseUtils.parseString(this.editConsumerSecret.text) val intent = Intent() - intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat) - intent.putExtra(Accounts.AUTH_TYPE, authType) - intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl) - intent.putExtra(Accounts.NO_VERSION_SUFFIX, noVersionSuffix) - intent.putExtra(Accounts.CONSUMER_KEY, consumerKey) - intent.putExtra(Accounts.CONSUMER_SECRET, consumerSecret) + intent.putExtra(EXTRA_API_CONFIG, createCustomAPIConfig()) setResult(Activity.RESULT_OK, intent) finish() } + private fun createCustomAPIConfig(): CustomAPIConfig { + return CustomAPIConfig().apply { + this.apiUrlFormat = editApiUrlFormat.text.toString() + this.credentialsType = getCheckedAuthType(editAuthType.checkedRadioButtonId) + this.isSameOAuthUrl = editSameOAuthSigningUrl.isChecked + this.isNoVersionSuffix = editNoVersionSuffix.isChecked + this.consumerKey = editConsumerKey.text.toString() + this.consumerSecret = editConsumerSecret.text.toString() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - val intent = intent - val extras = intent.extras - setContentView(R.layout.activity_api_editor) - val apiUrlFormat: String? - val authType: String - val sameOAuthSigningUrl: Boolean - val noVersionSuffix: Boolean - val consumerKey: String? - val consumerSecret: String? - - val pref = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - val prefApiUrlFormat = Utils.getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT) - val prefAuthType = pref.getString(KEY_CREDENTIALS_TYPE, Credentials.Type.OAUTH) - val prefSameOAuthSigningUrl = pref.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false) - val prefNoVersionSuffix = pref.getBoolean(KEY_NO_VERSION_SUFFIX, false) - val prefConsumerKey = Utils.getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY) - val prefConsumerSecret = Utils.getNonEmptyString(pref, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET) - val bundle: Bundle + val apiConfig: CustomAPIConfig if (savedInstanceState != null) { - bundle = savedInstanceState - } else if (extras != null) { - bundle = extras + apiConfig = savedInstanceState.getParcelable(EXTRA_API_CONFIG) } else { - bundle = Bundle() + apiConfig = intent.getParcelableExtra(EXTRA_API_CONFIG) ?: kPreferences[defaultAPIConfigKey] } - apiUrlFormat = bundle.getString(Accounts.API_URL_FORMAT, prefApiUrlFormat)?.trim() - authType = bundle.getString(Accounts.AUTH_TYPE, prefAuthType) - sameOAuthSigningUrl = bundle.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL, prefSameOAuthSigningUrl) - noVersionSuffix = bundle.getBoolean(Accounts.NO_VERSION_SUFFIX, prefNoVersionSuffix) - consumerKey = bundle.getString(Accounts.CONSUMER_KEY, prefConsumerKey)?.trim() - consumerSecret = bundle.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret)?.trim() editAuthType.setOnCheckedChangeListener(this) editNoVersionSuffix.setOnCheckedChangeListener(this) @@ -181,13 +143,13 @@ class APIEditorActivity : BaseActivity(), OnCheckedChangeListener, OnClickListen loadDefaults.visibility = View.VISIBLE loadDefaults.setOnClickListener(this) - editApiUrlFormat.setText(apiUrlFormat) - editSameOAuthSigningUrl.isChecked = sameOAuthSigningUrl - editNoVersionSuffix.isChecked = noVersionSuffix - editConsumerKey.setText(consumerKey) - editConsumerSecret.setText(consumerSecret) + editApiUrlFormat.setText(apiConfig.apiUrlFormat) + editSameOAuthSigningUrl.isChecked = apiConfig.isSameOAuthUrl + editNoVersionSuffix.isChecked = apiConfig.isNoVersionSuffix + editConsumerKey.setText(apiConfig.consumerKey) + editConsumerSecret.setText(apiConfig.consumerSecret) - editAuthType.check(getAuthTypeId(authType)) + editAuthType.check(getAuthTypeId(apiConfig.credentialsType)) if (editAuthType.checkedRadioButtonId == -1) { oauth.isChecked = true } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt index f9633e7aa..3df0f2cef 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/constant/PreferenceKeys.kt @@ -29,8 +29,8 @@ val linkHighlightOptionKey = KStringKey(KEY_LINK_HIGHLIGHT_OPTION, VALUE_LINK_HI val statusShortenerKey = KNullableStringKey(KEY_STATUS_SHORTENER, null) val mediaUploaderKey = KNullableStringKey(KEY_MEDIA_UPLOADER, null) val newDocumentApiKey = KBooleanKey(KEY_NEW_DOCUMENT_API, Build.VERSION.SDK_INT == Build.VERSION_CODES.M) -val loadItemLimitKey: KIntKey = KIntKey(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT) -val defaultFeatureLastUpdated: KLongKey = KLongKey("default_feature_last_updated", -1) +val loadItemLimitKey = KIntKey(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT) +val defaultFeatureLastUpdated = KLongKey("default_feature_last_updated", -1) object defaultAPIConfigKey : KPreferenceKey { override fun contains(preferences: SharedPreferences): Boolean { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AddUserFilterDialogFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AddUserFilterDialogFragment.kt index b486aa749..f91be2c7f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AddUserFilterDialogFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AddUserFilterDialogFragment.kt @@ -49,7 +49,7 @@ class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() { companion object { - val FRAGMENT_TAG = "add_user_filter" + const val FRAGMENT_TAG = "add_user_filter" fun show(fm: FragmentManager, user: ParcelableUser): AddUserFilterDialogFragment { val args = Bundle() diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/preference/DefaultAPIPreference.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/preference/DefaultAPIPreference.kt new file mode 100644 index 000000000..47b4215c7 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/preference/DefaultAPIPreference.kt @@ -0,0 +1,152 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2014 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.preference + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.support.v7.preference.DialogPreference +import android.support.v7.preference.PreferenceDialogFragmentCompat +import android.support.v7.preference.PreferenceFragmentCompat +import android.util.AttributeSet +import android.view.View +import android.widget.CheckBox +import android.widget.EditText +import android.widget.RadioGroup +import android.widget.Toast +import org.mariotaku.kpreferences.KPreferences +import org.mariotaku.twidere.R +import org.mariotaku.twidere.activity.iface.APIEditorActivity +import org.mariotaku.twidere.constant.IntentConstants.EXTRA_API_CONFIG +import org.mariotaku.twidere.constant.defaultAPIConfigKey +import org.mariotaku.twidere.fragment.ThemedPreferenceDialogFragmentCompat +import org.mariotaku.twidere.model.CustomAPIConfig +import org.mariotaku.twidere.model.account.cred.Credentials +import org.mariotaku.twidere.preference.iface.IDialogPreference +import org.mariotaku.twidere.util.ParseUtils +import org.mariotaku.twidere.util.dagger.DependencyHolder + +class DefaultAPIPreference @JvmOverloads constructor(context: Context, + attrs: AttributeSet?, + defStyle: Int = R.attr.dialogPreferenceStyle +) : DialogPreference(context, attrs, defStyle), IDialogPreference { + + private var kPreferences: KPreferences + + init { + dialogLayoutResource = R.layout.layout_api_editor + kPreferences = DependencyHolder.get(context).kPreferences + } + + override fun displayDialog(fragment: PreferenceFragmentCompat) { + val df = DefaultAPIPreferenceDialogFragment.newInstance(key) + df.setTargetFragment(fragment, 0) + df.show(fragment.fragmentManager, key) + } + + class DefaultAPIPreferenceDialogFragment : ThemedPreferenceDialogFragmentCompat() { + + private val editAPIUrlFormat: EditText by lazy { dialog.findViewById(R.id.editApiUrlFormat) as EditText } + private val editSameOAuthSigningUrl: CheckBox by lazy { dialog.findViewById(R.id.editSameOAuthSigningUrl) as CheckBox } + private val editNoVersionSuffix: CheckBox by lazy { dialog.findViewById(R.id.editNoVersionSuffix) as CheckBox } + private val editConsumerKey: EditText by lazy { dialog.findViewById(R.id.editConsumerKey) as EditText } + private val editConsumerSecret: EditText by lazy { dialog.findViewById(R.id.editConsumerSecret) as EditText } + private val editAuthType: RadioGroup by lazy { dialog.findViewById(R.id.editAuthType) as RadioGroup } + private val apiFormatHelpButton: View by lazy { dialog.findViewById(R.id.apiUrlFormatHelp) } + + private var editNoVersionSuffixChanged: Boolean = false + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val preference = preference + val dialog = super.onCreateDialog(savedInstanceState) + dialog.setOnShowListener { dialog -> + + editNoVersionSuffix.setOnCheckedChangeListener { buttonView, isChecked -> editNoVersionSuffixChanged = true } + editAuthType.setOnCheckedChangeListener { group, checkedId -> + val authType = APIEditorActivity.getCheckedAuthType(checkedId) + val isOAuth = Credentials.Type.OAUTH == authType || Credentials.Type.XAUTH == authType + editSameOAuthSigningUrl.visibility = if (isOAuth) View.VISIBLE else View.GONE + editConsumerKey.visibility = if (isOAuth) View.VISIBLE else View.GONE + editConsumerSecret.visibility = if (isOAuth) View.VISIBLE else View.GONE + if (!editNoVersionSuffixChanged) { + editNoVersionSuffix.isChecked = Credentials.Type.EMPTY == authType + } + } + apiFormatHelpButton.setOnClickListener { Toast.makeText(context, R.string.api_url_format_help, Toast.LENGTH_LONG).show() } + + if (savedInstanceState != null) { + setValues(savedInstanceState.getParcelable(EXTRA_API_CONFIG)) + } else { + setValues(kPreferences[defaultAPIConfigKey]) + } + } + return dialog + } + + override fun onDialogClosed(positiveResult: Boolean) { + if (!positiveResult) return + kPreferences[defaultAPIConfigKey] = createCustomAPIConfig() + + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + + val apiConfig = createCustomAPIConfig() + + outState.putParcelable(EXTRA_API_CONFIG, apiConfig) + } + + private fun createCustomAPIConfig(): CustomAPIConfig { + val apiConfig = CustomAPIConfig() + apiConfig.apiUrlFormat = ParseUtils.parseString(editAPIUrlFormat.text) + apiConfig.credentialsType = APIEditorActivity.getCheckedAuthType(editAuthType.checkedRadioButtonId) + apiConfig.consumerKey = ParseUtils.parseString(editConsumerKey.text) + apiConfig.consumerSecret = ParseUtils.parseString(editConsumerSecret.text) + apiConfig.isSameOAuthUrl = editSameOAuthSigningUrl.isChecked + apiConfig.isNoVersionSuffix = editNoVersionSuffix.isChecked + return apiConfig + } + + private fun setValues(apiConfig: CustomAPIConfig) { + editAPIUrlFormat.setText(apiConfig.apiUrlFormat) + editSameOAuthSigningUrl.isChecked = apiConfig.isSameOAuthUrl + editNoVersionSuffix.isChecked = apiConfig.isNoVersionSuffix + editConsumerKey.setText(apiConfig.consumerKey) + editConsumerSecret.setText(apiConfig.consumerSecret) + editAuthType.check(APIEditorActivity.getAuthTypeId(apiConfig.credentialsType)) + if (editAuthType.checkedRadioButtonId == -1) { + editAuthType.check(R.id.oauth) + } + } + + companion object { + + fun newInstance(key: String): DefaultAPIPreferenceDialogFragment { + val df = DefaultAPIPreferenceDialogFragment() + val args = Bundle() + args.putString(PreferenceDialogFragmentCompat.ARG_KEY, key) + df.arguments = args + return df + } + } + } + +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateProfileImageTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateProfileImageTask.kt index fb6c99792..2964af4e7 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateProfileImageTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/UpdateProfileImageTask.kt @@ -28,7 +28,7 @@ open class UpdateProfileImageTask( private val accountKey: UserKey, private val imageUri: Uri, private val deleteImage: Boolean -) : AbstractTask, ResultHandler>() { +) : AbstractTask, ResultHandler>() { @Inject lateinit var bus: Bus @@ -36,9 +36,10 @@ open class UpdateProfileImageTask( init { @Suppress("UNCHECKED_CAST") GeneralComponentHelper.build(context).inject(this as UpdateProfileImageTask) + setParams(Unit) } - override fun doLongOperation(params: Any): SingleResponse { + override fun doLongOperation(params: Unit): SingleResponse { try { val microBlog = MicroBlogAPIFactory.getInstance(context, accountKey)!! TwitterWrapper.updateProfileImage(context, microBlog, imageUri, deleteImage) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt index 9e414d677..ef4a908f9 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/AccountMigrator.kt @@ -3,7 +3,6 @@ package org.mariotaku.twidere.util import android.accounts.Account import android.accounts.AccountManager import android.database.sqlite.SQLiteDatabase -import android.os.Bundle import android.support.annotation.ColorInt import com.bluelinelabs.logansquare.LoganSquare import org.mariotaku.twidere.TwidereConstants.* @@ -33,14 +32,15 @@ fun migrateAccounts(am: AccountManager, db: SQLiteDatabase) { while (!cur.isAfterLast) { val credentials = indices.newObject(cur) val account = Account(credentials.account_name, ACCOUNT_TYPE) - val userdata = Bundle() - userdata.putString(ACCOUNT_USER_DATA_KEY, credentials.account_key.toString()) - userdata.putString(ACCOUNT_USER_DATA_TYPE, credentials.account_type) - userdata.putString(ACCOUNT_USER_DATA_ACTIVATED, credentials.is_activated.toString()) - userdata.putString(ACCOUNT_USER_DATA_CREDS_TYPE, credentials.getCredentialsType()) - userdata.putString(ACCOUNT_USER_DATA_COLOR, toHexColor(credentials.color)) - userdata.putString(ACCOUNT_USER_DATA_POSITION, credentials.sort_position) - userdata.putString(ACCOUNT_USER_DATA_USER, LoganSquare.serialize(credentials.account_user ?: run { + // Don't add UserData in this method, see http://stackoverflow.com/a/29776224/859190 + am.addAccountExplicitly(account, null, null) + am.setUserData(account, ACCOUNT_USER_DATA_KEY, credentials.account_key.toString()) + am.setUserData(account, ACCOUNT_USER_DATA_TYPE, credentials.account_type) + am.setUserData(account, ACCOUNT_USER_DATA_ACTIVATED, credentials.is_activated.toString()) + am.setUserData(account, ACCOUNT_USER_DATA_CREDS_TYPE, credentials.getCredentialsType()) + am.setUserData(account, ACCOUNT_USER_DATA_COLOR, toHexColor(credentials.color)) + am.setUserData(account, ACCOUNT_USER_DATA_POSITION, credentials.sort_position) + am.setUserData(account, ACCOUNT_USER_DATA_USER, LoganSquare.serialize(credentials.account_user ?: run { val user = ParcelableUser() user.account_key = credentials.account_key user.key = credentials.account_key @@ -51,8 +51,7 @@ fun migrateAccounts(am: AccountManager, db: SQLiteDatabase) { user.profile_image_url = credentials.profile_image_url return@run user })) - userdata.putString(ACCOUNT_USER_DATA_EXTRAS, credentials.account_extras) - am.addAccountExplicitly(account, null, userdata) + am.setUserData(account, ACCOUNT_USER_DATA_EXTRAS, credentials.account_extras) am.setAuthToken(account, ACCOUNT_AUTH_TOKEN_TYPE, LoganSquare.serialize(credentials.toCredentials())) cur.moveToNext() } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/DependencyHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/DependencyHolder.kt index a83b99409..520e6788d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/DependencyHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/DependencyHolder.kt @@ -22,6 +22,7 @@ package org.mariotaku.twidere.util.dagger import android.content.Context import edu.tsinghua.hotmobi.HotMobiLogger import okhttp3.ConnectionPool +import org.mariotaku.kpreferences.KPreferences import org.mariotaku.restfu.http.RestHttpClient import org.mariotaku.twidere.model.DefaultFeatures import org.mariotaku.twidere.util.* @@ -68,6 +69,9 @@ class DependencyHolder internal constructor(context: Context) { @Inject lateinit var userColorNameManager: UserColorNameManager internal set + @Inject + lateinit var kPreferences: KPreferences + internal set init { GeneralComponentHelper.build(context).inject(this) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt index c811dfd77..4f66f8953 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/dagger/GeneralComponent.kt @@ -43,7 +43,6 @@ import org.mariotaku.twidere.task.twitter.GetStatusesTask import org.mariotaku.twidere.task.twitter.UpdateStatusTask import org.mariotaku.twidere.text.util.EmojiEditableFactory import org.mariotaku.twidere.text.util.EmojiSpannableFactory -import org.mariotaku.twidere.util.AsyncTwitterWrapper import org.mariotaku.twidere.util.MultiSelectEventHandler import javax.inject.Singleton @@ -136,4 +135,6 @@ interface GeneralComponent { fun inject(task: UpdateStatusTask) fun inject(application: TwidereApplication) + + fun inject(fragment: ThemedPreferenceDialogFragmentCompat) } diff --git a/twidere/src/main/res/layout/activity_browser_sign_in.xml b/twidere/src/main/res/layout/activity_browser_sign_in.xml index 866f31ebe..fce095166 100644 --- a/twidere/src/main/res/layout/activity_browser_sign_in.xml +++ b/twidere/src/main/res/layout/activity_browser_sign_in.xml @@ -25,12 +25,12 @@ android:layout_height="match_parent"> diff --git a/twidere/src/main/res/mipmap-hdpi/ic_launcher.png b/twidere/src/main/res/mipmap-hdpi/ic_launcher.png index 73721162d144e680b3e5ec543a667c304010b818..97daeac5f92f23f36470673eef09929b7be6bdc5 100644 GIT binary patch literal 3974 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 literal 4511 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 M07*qoM6N<$f(&JWQ~&?~ literal 0 HcmV?d00001 diff --git a/twidere/src/main/res/mipmap-xhdpi/ic_launcher.png b/twidere/src/main/res/mipmap-xhdpi/ic_launcher.png index 5fe223884594bfacbb889edccf2796f32eac0562..2d7f875d92e6f491bcaf221f66912b2bc88866ac 100644 GIT binary patch literal 5449 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 literal 7284 zcmV-)9E;fu2^xVghlGrkq{cg)Veju$Q<_vw0hj_X1z<{30Hy#;X$rs;fGJG@m;x}RDF9OdrZfd$3c!@6089ax z(iDIx08^R*Fa_YxLer*AYX^q+Ie_{<%%8c^z>z=}_{9`}eOvv90GIU6%AHJ9_!RIk z`&eqhf(87!slUH}8nAr!q5fs3txS%WCr_$8^~>^Uz%%LX=fp|j39se;Nak`z|P5T zH^(mbR~&muGQYQz0D+NG8@ui~_aWd^CP8ZD%9ZRb-FDk;?Z9FM7oTxh;p7`uPesZ;bnz+%THB3UPoSAfjAaCUt_IB9_q&bWet3fC<@INjX!wj z$jAd5H*dZXcoHzLMY}nw-fm93B003Hh_4kWAW1+BD5Z!+2-jR#zV|<#IudwcQUIKM z^2xj!ty{OQ02~EedfI}*sh?P$pE>ss>G0dKhyZB7BBDSHM3&0VGDBa?(_LsMtv$3D zb|w=4LuhvVd}!#0^;OBuz{`8F-CT0U2a>n+&1`Bnfbzl9Ue7WcrGIK_*r3i9!%-!Ni!*P^lV5hY|)$mRjtw<>hWh zemP9Lf<=WKv+_l>(vZY#u!Ntk#hV`AHSn#0fq}0A+xM{DoS6E<>gK(A>0!s)nT3oZ zjs)$2HDE1h4ax%q#6YRk#m@WA{wc78Ns{`|hdx9redjyh@qqn-3ukqwmVW50;vpBG zL9f@A^R(|{!;q+!P%0UQ2O@@Rib@ht3Kcb@F-kMEBVq8@S!O7(fHg5Qv}IwwKyNmW zQVKtbdCXF|u@XN2RR4~D866$H6BvFK?dH;BE=XOlctv#Rv?9I&W#{o%ImJV15l z0yh8rup5C-Od5dqzW2S1*By7@{UBHS#M-{otrc0k2 z8F}jEZQDNF`py)RBG2qTaLtbq1Fc_0SRpw!qk0AnFu|2FgN zgZbsaPbLk(JKyL9rr0^EFrtakM4`nP0I+}t-0$bI z-t7yNhGR;P7nmu~EbAC3r2z1hqGl4(CSra%#leL(azUCwlb9Vo4hs<)dCe3O7pz!==$*MMwoV_z%KfjehmxCZ5)|BvUs@qceU42UNaz;xi4 zu8z#-Z@Q#oc6XPgBBL1%A&LxP489)ABx5XqGhMqCg#{;T#>_XdWy=$7%o>hKdkO{4 z5CK4Ig*b9bEU^`gfR&hnH7v+wnO6t#pQ&8!|7_d-kqsL*d=FSYqyFq>>GjER)2C7N zeXvPWp9idiEiOBhI~E0=b^u~97OJDYY`^dHyMc3lAICk5URPg4T+}Ipn#0QJ`h)I26GO zC?HHCy0N^akd+$>J=-4G@VlR$_HKLnK}XqHodpQ1AWdcHIl`_A8s}Ufjgf6Fh(NV} zp=|uwA)f$lnp6PSTyqUL{on^bP@d<_%Vx75Jh(4=&WdAGJ?+IPWtB&4EI5e(fKtF1 z3@1%_Bw_H;EYoe{x&T^Sk5-LrZSn;R7=c7gJ-`Ee6A@}951+Tgo_Ho67Lo*vYbk-} z48=)-a>ExH1ERD$rm+Gt7NYg1C(k{UISY7TQUSc<9q(Yg?z!h4l}@MU2SKoM?#%38 zt~lE3$>n2Tdmh#_GTo!;mlKGM@bc3G!K_^f0ObH1u(sK`K8RcP0f}`P zj=>646Ct!QWg}RLNfMzuP;~nNy{UknREmNhki;QhJ-EU_Zy!MWF6(^|+gN5|A#uZ2 z1KNh1-uE^1!!PLGk}Re99{>p z^3d6trROj9x^o%hqdWkj*itST1|Q4OV<54DQVN41G(v0*<-`!#dL)KGL3iNMmk#Lm zQ*`{na5t<4NNbIc;t6GV=+c+yn=@vf3UHqp1EE~sw*tP86DZeyaHd1!SZk<^^s(b- zZ@m+^m_5|(x8LqJ8Jhz-oVl}rKI)M!(4BAdyE1Lk5oA>%m6zE0P)m8P1+^+4MGWI`MPe5~OpI zNo7gd2yG*U_B;l+ifmh(9S+N>?}^9_uJxhj&Yim_y~_)N;OI;yechr1b7w3pM4gp& zXl0CQ^8-43O^@#}El5!ad{V9-1WMfgnAys?DF`^@H5#z|#*cVx#Rj_iAQNbm58~FG zUI0qD;Vq4UY;5Bg1-f~a=BgpK5I?^pe(=uzCG|IU&p3nIUG~mw&faW2d$V~uQU%&` zZQ^IzZ7SEUQbE>cw8l3vXcS6;7!3yE7;K_Qc5j6^6b3d0wlUugi0K%hb40*_{C2ci^J z_~h(<7M>g9r6838KTv=L1%9e|g$3effKm{+L2Rt600rf+9;JGWLTMOEtBwvIdvxuu z(gixR1=>=1@|h0n<=a&{Q#7e`k+dY}xC&Y+R6WEhZ0J^DyUlg8M-*Ct6={HWv#&I0 z8Qqi*YnAlRyF0o+`S8OJKLH3$QX;~iqMn`}1>F3uBR~5;cSh^-i)*V`?1!X0g%dRG zYFyT!u>e>U8ea=yA(4c8gHGLO z34pt{YeOK_f!vOi&V8=8xA$wn&e!ave7%&HES|CaUk~n`w|^-bWk0orv#V>Fp2=X5 z-O(7a3c#7JNUTB7cnBJ(ni}sr`YM96{*u^BqlaE0xAi0R@*H6aq8eBOK0YQ15CK2! zqm)H#f+fU6AVwipk5xmYutwZt2yk9u+}76(Q^&RnV+ALaZe+E!jf`)2-l)i0Nf_Le zN|Mq1>O#KlV{_)rc^F7&A+=(~3jS0*_~3&xdeXCQKWE|9ry89Q#WA7T#mUiQEYc+c z9pE7(xL)7jfY8_~40n*{2L~NR+K%9RWzy*q67}QDCJOBdf&nvTl6JqfjTK1*VnG0! z4O9XG7zI9nbCR)2(lqWH5QV2TA{L8-VZqa`QfNRBX$Ay{Fx>A^+LjrXF#D~UGiUx& z>xX=MzXCMyg?Al!)4Qx+O@pA7rc^7jpL&VYOKa%KWH1Pzakc>(?F=#qVG?uqisN~B z{UeytD+HcG`5!5QSt0mRLOafOK3Mur=qS?=!vr4(8@m=1v3 z2Z5w!8Q7RI;ZW}RY_|A`dQ$%g2$@)@8*jXky`fufx#hxB=Un#B2lN~`TPcmFf_i9- zO&E!{b3)};9PO0}JRcF~gEK)3#FAha6xniGHy?fGJb3w6r1~E~sR8nBpi=NT;oSFx_6&y6x_>ddwhyny-h4N0t@YX^_!t{@(PoI7R@HDSN z>TPd(8+$`**RFljjQoLjoIU@YZ^jc88qYnHF*czTmgte^SyEn2XL@WlG%K_T9UmzZ ztB6Z~{~0`;BHFo?M?ij~kA@0S~$mW3RU~W?;DBjfF-F-VSJSpFdb8RR9^_BN8zU8V=m3$3o zD_o?KY&KI${}qB^!q$*b zcK-DXFTC(LU|$d4jCibbpiU^FZ z6(i%@mb)U17d8=ww)<53v%9opzchRH>@Nb_*>jmmIIi>nN1P^fEbB+yGo1b%UA+6bm1GJj5Fo5#k_7vQ?Z_~d z&CkJ>)nvV`6uKg^9iUulj~}KQmjo!3(pYOU#AgWphH)WG}IP-ho zOaFDf-#-AvubVIDx;B*c@xT68i*LRpRuyd#eC?yr&F^MGDFlm%FkD&3RTqAn{SN5` zHwbGZRjz*OGento1PgY|U{ft)>tRYIlF?m6TVF;EJVnOePO&E<)28sW!U-!40L}f| zI%mbb3_`hk1O>kK9Hd518rk77x;a-SNq@KAG5#KSiM=Fs$|Pk-QoLq7QN z?)L6pPx++0Gyvk7vr-xqC=|oxZCr5HzZ1}p?uh9*xZB-0!OiO~W3?O$CI+ogiC~ft z8`Z-YR21%>4`yTs)lDy=hn^vq8KAIVM5dsd9)~yG2LN~ixMKl)T=fV|YAi1|r))To zU!TnsK2;yIcL9~x?bp*?6&!w0$5H=&+JWaRP`*dtrO=|$N?{R11O<%LN}O`cz095W z5+0VpEfv}hfR5SiSObr)U&KH3Urdn8fK32UiN(Y<+^bO}svzYOacPKncqg^3FOjai zL_RxAak?Ru6NnW6M#s%%7vzyyRY7EK6(HB_pb$ny{y*Hg7*B` zP|?@vTi|HfB(>>Y6;?AkKQjH9xoi&@G8 zaOJuiNELH#K@KP%6-5{^NE{#@fk`}idbKXP3$U+fCB zkHW)qPtXz*gSVaw|Ki{9y#N8U0ufDEiKq^jn0|C8Sh()F57Y0@#>w>*8H137h$xT* zlfdEPkzFM9h(`wq2ey!jHj!^D(bi)KvOuB`0i|8$8+Q!UsxYuIoy4Wg<6WIy zAFVGh9|4j#;(yRsd}#NZZ$EzjWe5A7kFNsKei|#nXl)Z0Ec-W##R&I{qm_2U8RBwG ztyHFOaW~(8;T-OW--@R_P@ocnRTcy!iZM1uOoB270K_8I%I?{al!q{N2=VYPqM>bM z;;j_gM=ACQehQQa7(gJ3g^}%^)CMynp5(tVW5$eI)~s2x2@rrcB7m-(-}#-(kGO7` z=Y#fq0(=ImL!5ci51BPmBdJ`f~}1bjtpb#FyfH`lHo06lkK#1muc@6@Du5CL$ znNFv_UjMdst;u|OBLV=p>8d0C_Wij`x@fT^al+w;tm5b+e~rR-GtrXR#*L7tHP(O? zOL=FN+_ac$%U>o*6_6xu+}aug)&L-hL9AdULAi5c4AeuyDyCAw#wC)Wog}4UlFBf) zw37l`@zWJ*^wDQ2{96)Fbvg?VF2cp0K~K zJlgXcSibZwwD`EU{FvCHJOGFzi;s^HM+D1`jTOF@c?Vl(oPmjBJoi%9Bo2UB#MHyu zu_13FBu=mnD1Zqoup7iEwmggpYnWOETOFmceKWeF7q91FG6yUmKYtOO)uD27_s#b| z_4uk!S!;jyMgyQ|XutM!&+X?Ndd*usHONKFzDG8&fCV&(fK4n)1Z5$rS**3hu_3Mr zR_c+!FTA<@wDVdr-JLGu6W6+=@ik~bxvjAV6NhLtN@+wAtTj-pVQW<+s$p!1gb|WN zctK|O^(2lF>k*=;pR>gckL;{3Yd==6hP!~_*E;~^qFEaF$BX8F;IA%T`lC#iZG<%; z4lRO4Ib%d1Q&gl;7x?=f6X^PUZ#Cb!=-#F~0oa6?xqg}6#^8moxJ zU@-t_JolLd96*UfFt+hBK)}7_AyFFHu?79os;V8>a>M4$o9_hH1M+$VpvLcyJ9pkO z2XuV%Qx^>tf>fZu+ih%+5`t_BKkb3%p%o}!0Pr*zG$s)|Ur1^Z?|bs2jJ6$w@?2J1 zv)f2;5^-Aq+n5hl5O)m`l-6h&t1e^W-TMS76bd6k(!UMw>Hn_jfmhbH7mJ^-uZDh7 z|CZozi-A0;0F;YXFtj_)0H^QYSN!z#7v>indvwiDa4x&6X**uR-Ymu?FP@h|)v@g9K~ui`BMg zpU-E~Uz#^>-hbBrlgf5LngS=8Yyhft<~K*`SvWX%Ut=)XG!<=0bq?Zbsr1X9eWDg6ITs@0%H-zpebFC zAfQ%F@SnI(g7s^*Ya89s*Vp&WM<0E3eW_H6Xvj82v+)YBlMR5TtvBwPrgdcq(2>jK z-afZ4`<{d0qyySb6;r?3nG?#o;#V_?8W#gALaY#<_ZwOss?#0f>sLa zAecm9pIw9ZcJXjYH0menrZ20)>Zvg=(I|%?9X6}Lc4S0?1 zoOC*U%`tNe=l#tUN&AfbeTDW=4uFUys)oGx>Axe~??AAE)(TvSh)J+b6Wv%vymbry zs{cshZR@whas1=a(b0$MJ$^G#2C6{lA^~g@3~6D!12cXexc%1*zy#*ES_MsTUc2yI zq=3Bd`zL2I-qjZ@&M&6zg;tgRjy8Tn1ER$CAB1EWm?Ha*fb*Bwq_+6z|8GXK5 zt*)tO{0qP~U2$K%?NZQ8c30=M6)681I#<$~6xPYj?%JMx-9q=5p^>7olb zDhT`~ht0{p>F=+I{hozws=PDesuyo2+t-H{i&dIhCBgg6T@pR}NHwmEzF01oSJ&Ik z3ohe#0V7QrAK|jzZIdR`ZR-})Tp5j+Yyi6T4cLVHxaWx#;xh{_5pVWX5`h4Ts#H*>66{cNf zbY(IbQ>)cnd!cpPXvi{gOW}`H0e|FY82@woav7>y8Q!8&S_7K+2Ch{_X&2HIv@k;^ ziWY{_as||o0oa!S1n{7Bi)qpCX;urPTg?n{TgIPn^(edr5TSKe3r?*+*MQRk-oCvP zc0sElJi&VcCVHGb0knzDcl#3pnZVE%ElL3P`Lm!F$NE(mO-pbSYJ$(THl0@qhZfI# zT2#yAJdWm7n5bF_^#1@_MT_Zg&ymXj O0000_oD2?0W~1O^caWSb<$#0HBO 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 literal 13129 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 literal 19519 zcmV)*K#9MJP)p(AoH&kMDW{PQUMJB0000000000000000000000000000000002|M%(ks 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 literal 0 HcmV?d00001