package org.indywidualni.fblite.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.SQLException;
import android.os.AsyncTask;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import org.indywidualni.fblite.MyApplication;
import org.indywidualni.fblite.R;
import org.indywidualni.fblite.util.database.OfflineDataSource;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Offline {
@SuppressLint("StaticFieldLeak")
private static Context context;
private static String userAgent;
private final OfflineDataSource dataSource;
private final SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(MyApplication.getContextOfApplication());
public Offline() {
context = MyApplication.getContextOfApplication();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
userAgent = preferences.getString("webview_user_agent", System.getProperty("http.agent"));
if (!preferences.getString("custom_user_agent", context.getString(R.string.predefined_user_agent)).isEmpty())
userAgent = preferences.getString("custom_user_agent", context.getString(R.string.predefined_user_agent));
dataSource = OfflineDataSource.getInstance();
syncCookies();
}
public String getPage(String url) throws SQLException {
url = cleanUrl(url);
//Log.v(getClass().getSimpleName(), "Getting: " + url);
return dataSource.getPage(url);
}
public void savePage(String url) throws SQLException {
url = cleanUrl(url);
//Log.v(getClass().getSimpleName(), "Saving: " + url);
new SaveTask().execute(url);
}
public OfflineDataSource getDataSource() {
return dataSource;
}
private class SaveTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... args) throws SQLException {
try {
final Document response = Jsoup.connect(args[0])
.userAgent(userAgent)
.header("Accept-Encoding", "gzip, deflate")
.timeout(5000)
.cookie("https://m.facebook.com", CookieManager.getInstance().getCookie("https://m.facebook.com"))
.get();
String base = "https://m.facebook.com";
if (preferences.getBoolean("touch_mode", false))
base = "https://touch.facebook.com";
else if (preferences.getBoolean("basic_mode", false))
base = "https://mbasic.facebook.com";
if (Connectivity.isConnectedMobile(context) && preferences.getBoolean("facebook_zero", false))
base = "https://0.facebook.com";
Document doc = Jsoup.parse(response.toString(), base);
Elements select = doc.select("a");
for (Element e : select) {
// baseUri will be used by absUrl
String absUrl = e.absUrl("href");
e.attr("href", absUrl);
}
// insert values into a database
dataSource.insertPage(args[0], doc.toString());
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Problem saving the current page");
e.printStackTrace();
}
return null;
}
}
/** CookieSyncManager was deprecated in API level 21.
* We need it for API level lower than 21 though.
* In API level >= 21 it's done automatically.
*/
@SuppressWarnings("deprecation")
private void syncCookies() {
if (Build.VERSION.SDK_INT < 21) {
CookieSyncManager.createInstance(context);
CookieSyncManager.getInstance().sync();
}
}
private static String removeEndingSlash(String url) {
if (url.length() > 0 && url.charAt(url.length()-1)=='/')
url = url.substring(0, url.length()-1);
return url;
}
public static String cleanUrl(String url) {
/**
* remove referrers all the variations of referrers
* remove home.php it's always first and nothing is later (main page)
* replace mobile. to m.
* remove ?_rdr it's always last and nothing is later
* remove &_rdr it's always last and nothing is later
* remove / it's always last and nothing is later
*/
url = url.replaceAll("\\?refid=.*", "").replaceAll("&refid=.*", "").replaceAll("\\?hrc=.*", "")
.replaceAll("&hrc=.*", "").replaceAll("\\?refsrc=.*", "").replaceAll("&refsrc=.*", "")
.replaceAll("\\?fref=.*", "").replaceAll("&fref=.*", "").replaceAll("\\?ref=.*", "")
.replaceAll("&ref=.*", "").replaceAll("\\?ref_type=.*", "").replaceAll("&ref_type=.*", "")
.replaceAll("\\?ref_component=.*", "").replaceAll("&ref_component=.*", "")
.replaceAll("\\?ref_page=.*", "").replaceAll("&ref_page=.*", "")
.replaceAll("\\?fb_ref=.*", "").replaceAll("&fb_ref=.*", "");
url = url.replace("home.php", "").replace("mobile.", "m.").replace("?_rdr", "").replace("&_rdr", "");
return removeEndingSlash(url);
}
}