package com.etiennelawlor.loop.activities; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import com.etiennelawlor.loop.R; import com.etiennelawlor.loop.models.AccessToken; import com.etiennelawlor.loop.network.ServiceGenerator; import com.etiennelawlor.loop.network.VimeoService; import com.etiennelawlor.loop.network.interceptors.UnauthorizedNetworkInterceptor; import com.etiennelawlor.loop.network.models.response.AuthorizedUser; import com.etiennelawlor.loop.network.models.response.OAuthResponse; import com.etiennelawlor.loop.prefs.LoopPrefs; import com.etiennelawlor.loop.utilities.NetworkLogUtility; import com.etiennelawlor.loop.utilities.NetworkUtility; import butterknife.BindView; import butterknife.ButterKnife; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * Created by etiennelawlor on 6/13/15. */ public class LoginActivity extends AppCompatActivity { // region Views @BindView(R.id.wv) WebView webView; @BindView(R.id.fl) FrameLayout frameLayout; // endregion // region Member Variables private VimeoService vimeoService; private WebViewClient webViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Uri uri = Uri.parse(url); String code = uri.getQueryParameter("code"); String state = uri.getQueryParameter("state"); if(!TextUtils.isEmpty(code) && !TextUtils.isEmpty(state) && state.equals(getString(R.string.vimeo_state))) { frameLayout.setVisibility(View.VISIBLE); Call exchangeCodeCall = vimeoService.exchangeCode("authorization_code", code, getString(R.string.client_redirect_uri)); exchangeCodeCall.enqueue(exchangeCodeCallback); } return super.shouldOverrideUrlLoading(view, url); } }; // endregion // region Callbacks private Callback<OAuthResponse> exchangeCodeCallback = new Callback<OAuthResponse>() { @Override public void onResponse(Call<OAuthResponse> call, Response<OAuthResponse> response) { if (!response.isSuccessful()) { int responseCode = response.code(); if(responseCode == 504) { // 504 Unsatisfiable Request (only-if-cached) // errorTextView.setText("Can't load data.\nCheck your network connection."); // errorLinearLayout.setVisibility(View.VISIBLE); } return; } OAuthResponse oAuthResponse = response.body(); if (oAuthResponse != null) { String accessToken = oAuthResponse.getAccessToken(); String tokenType = oAuthResponse.getTokenType(); AuthorizedUser authorizedUser = oAuthResponse.getUser(); AccessToken token = new AccessToken(tokenType, accessToken); LoopPrefs.saveAccessToken(getApplicationContext(), token); LoopPrefs.saveAuthorizedUser(getApplicationContext(), authorizedUser); Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); finish(); } } @Override public void onFailure(Call<OAuthResponse> call, Throwable t) { NetworkLogUtility.logFailure(call, t); if (!call.isCanceled()){ if(NetworkUtility.isKnownException(t)){ // errorTextView.setText("Can't load data.\nCheck your network connection."); // errorLinearLayout.setVisibility(View.VISIBLE); } } } }; // endregion // region Lifecycle Methods @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ButterKnife.bind(this); vimeoService = ServiceGenerator.createService( VimeoService.class, VimeoService.BASE_URL, new UnauthorizedNetworkInterceptor(this)); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setBuiltInZoomControls(true); webSettings.setSupportZoom(true); webSettings.setUseWideViewPort(true); webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webView.setWebViewClient(webViewClient); webView.loadUrl(setUpUrl()); } // endregion // region Helper Methods private String setUpUrl() { String authroizeUrl = getString(R.string.authorize_url); String webLoginClientId = getString(R.string.client_id); String redirectUri = getString(R.string.client_redirect_uri); String scope = TextUtils.join(" ", getResources().getStringArray(R.array.scopes)); String state = getString(R.string.vimeo_state); String url = String.format("%s?client_id=%s&response_type=code&redirect_uri=%s&state=%s&scope=%s", authroizeUrl, webLoginClientId, redirectUri, state, scope); return url; } // endregion }