/* * Copyright (C) 2010 Nullbyte <http://nullbyte.eu> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.liato.bankdroid; import com.liato.bankdroid.banking.Bank; import com.liato.bankdroid.banking.Bank.SessionPackage; import com.liato.bankdroid.banking.BankFactory; import org.apache.commons.io.IOUtils; import org.apache.http.client.CookieStore; import org.apache.http.cookie.Cookie; import android.content.res.Resources.NotFoundException; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import java.io.IOException; import eu.nullbyte.android.urllib.Urllib; import timber.log.Timber; import static android.graphics.Color.WHITE; public class WebViewActivity extends LockableActivity implements OnClickListener { private WebView mWebView; private boolean mFirstPageLoaded = false; private Handler mMainThreadhandler = new Handler(Looper.getMainLooper()); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.webview); //TODO // this.addTitleButton(R.drawable.title_icon_back, "back", this); // this.addTitleButton(R.drawable.title_icon_forward, "forward", this); // this.addTitleButton(R.drawable.title_icon_refresh, "refresh", this); // this.setTitleButtonEnabled("forward", false); // this.setTitleButtonEnabled("back", false); // this.setTitleButtonEnabled("refresh", false); final CookieSyncManager csm = CookieSyncManager.createInstance(this); mWebView = (WebView) findViewById(R.id.wvBank); mWebView.setBackgroundColor(0); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.getSettings().setUserAgentString(Urllib.DEFAULT_USER_AGENT); mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // activity.setProgressBar(progress); if (progress == 100) { Handler handler = new Handler(); Runnable runnable = new Runnable() { public void run() { // activity.hideProgressBar(); if (mFirstPageLoaded) { mWebView.setBackgroundColor(WHITE); } } }; // Let the progress bar hit 100% before we hide it. handler.postDelayed(runnable, 100); } else if (mFirstPageLoaded) { // activity.showProgressBar(); } } }); mWebView.setWebViewClient(new BankWebViewClient()); String preloader = "Error..."; try { preloader = IOUtils.toString(getResources().openRawResource(R.raw.loading)); preloader = String.format(preloader, "", // Javascript function "" // HTML ); } catch (NotFoundException | IOException e) { Timber.w(e, "Error loading loading.html"); } mWebView.loadDataWithBaseURL("what://is/this/i/dont/even", preloader, "text/html", "utf-8", null); Bundle extras = getIntent().getExtras(); final long bankId = extras.getLong("bankid", -1); //final long bankId = -1; if (bankId >= 0) { Runnable generateLoginPage = new Runnable() { public void run() { Bank bank = BankFactory.bankFromDb(bankId, WebViewActivity.this, false); final SessionPackage loginPackage = bank .getSessionPackage(WebViewActivity.this); final CookieStore cookieStore = loginPackage.getCookiestore(); mMainThreadhandler.post(new Runnable() { @Override public void run() { if ((cookieStore != null) && !cookieStore.getCookies().isEmpty()) { CookieManager cookieManager = CookieManager.getInstance(); CookieManager.getInstance().removeSessionCookie(); String cookieString; for (Cookie cookie : cookieStore.getCookies()) { cookieString = String.format("%s=%s;%spath=%s; domain=%s;", cookie.getName(), cookie.getValue(), cookie.getExpiryDate() == null ? "" : "expires=" + cookie.getExpiryDate() + "; ", cookie.getPath() == null ? "/" : cookie.getPath(), cookie.getDomain()); cookieManager.setCookie(cookie.getDomain(), cookieString); } csm.sync(); } mWebView.loadDataWithBaseURL("what://is/this/i/dont/even", loginPackage.getHtml(), "text/html", "utf-8", null); } }); } }; new Thread(generateLoginPage).start(); } } public void onResume() { super.onResume(); } //Handle the back key @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (mWebView != null) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } } return super.onKeyDown(keyCode, event); } @Override public void onClick(View v) { String tag = (String) v.getTag(); if ("refresh".equals(tag)) { mWebView.reload(); } else if ("back".equals(tag)) { mWebView.goBack(); } else if ("forward".equals(tag)) { mWebView.goForward(); } } // Make sure clicked links are loaded in our webview. private class BankWebViewClient extends WebViewClient { @Override public void onLoadResource(WebView view, String url) { super.onLoadResource(view, url); if (mFirstPageLoaded) { handleHistoryChange(); } } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!mFirstPageLoaded) { //This is the generated POST page. if (url.startsWith("what:")) { return; } //This is the first real page. //Remove the generated page from history. mWebView.clearHistory(); mFirstPageLoaded = true; // activity.setTitleButtonEnabled("refresh", true); return; } } @Override public void onFormResubmission(WebView view, Message dontResend, Message resend) { // TODO Auto-generated method stub //super.onFormResubmission(view, dontResend, resend); resend.sendToTarget(); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } public void handleHistoryChange() { // activity.setTitleButtonEnabled("back", mWebView.canGoBack()); // activity.setTitleButtonEnabled("forward", mWebView.canGoForward()); } } }