Browser: add homepage and bookmark feature
Add specified homepage and bookmarks for carrier.
CRs-Fixed: 516137 516140 516141
Change-Id: I923e41e376685e0d5c45b8ce8f2e523d56492680
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 4166b11..3ecdcb4 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -22,6 +22,7 @@
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
+import android.os.Handler;
import android.os.PowerManager;
import android.util.Log;
import android.view.ActionMode;
@@ -33,8 +34,11 @@
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
+import android.webkit.JavascriptInterface;
+import com.android.browser.UI.ComboViews;
import com.android.browser.stub.NullController;
+
import com.google.common.annotations.VisibleForTesting;
public class BrowserActivity extends Activity {
@@ -50,6 +54,7 @@
private final static boolean LOGV_ENABLED = Browser.LOGV_ENABLED;
private ActivityController mController = NullController.INSTANCE;
+ private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle icicle) {
@@ -304,4 +309,29 @@
super.dispatchGenericMotionEvent(ev);
}
+ // add for carrier homepage feature
+ @JavascriptInterface
+ public void loadBookmarks() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mController instanceof Controller) {
+ ((Controller)mController).bookmarksOrHistoryPicker(ComboViews.Bookmarks);
+ }
+ }
+ });
+ }
+
+ // add for carrier homepage feature
+ @JavascriptInterface
+ public void loadHistory() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mController instanceof Controller) {
+ ((Controller)mController).bookmarksOrHistoryPicker(ComboViews.History);
+ }
+ }
+ });
+ }
}
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 95afa71..c390ab6 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -22,14 +22,17 @@
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.content.res.AssetManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Message;
+import android.os.SystemProperties;
import android.preference.PreferenceManager;
import android.provider.Browser;
import android.provider.Settings;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.GeolocationPermissions;
import android.webkit.WebIconDatabase;
@@ -49,9 +52,11 @@
import com.android.browser.search.SearchEngine;
import com.android.browser.search.SearchEngines;
+import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.LinkedList;
+import java.util.Locale;
import java.util.WeakHashMap;
/**
@@ -129,6 +134,9 @@
private static String sFactoryResetUrl;
+ // add for carrier feature
+ private static Context sResPackageCtx;
+
public static void initialize(final Context context) {
sInstance = new BrowserSettings(context);
}
@@ -144,6 +152,16 @@
mManagedSettings = new LinkedList<WeakReference<WebSettings>>();
mCustomUserAgents = new WeakHashMap<WebSettings, String>();
mAutofillHandler.asyncLoadFromDb();
+
+ // add for carrier feature
+ try {
+ sResPackageCtx = context.createPackageContext(
+ "com.android.browser.res",
+ Context.CONTEXT_IGNORE_SECURITY);
+ } catch (Exception e) {
+ Log.e("Res_Update", "Create Res Apk Failed");
+ }
+
BackgroundHandler.execute(mSetup);
}
@@ -225,7 +243,60 @@
mPrefs.edit().remove(PREF_TEXT_SIZE).apply();
}
- sFactoryResetUrl = mContext.getResources().getString(R.string.homepage_base);
+
+ // add for carrier homepage feature
+ String browserRes = SystemProperties.get("persist.env.c.browser.resource", "default");
+ if ("cu".equals(browserRes)) {
+ int resID = sResPackageCtx.getResources().getIdentifier(
+ "homepage_base", "string", "com.android.browser.res");
+ sFactoryResetUrl = sResPackageCtx.getResources().getString(resID);
+ } else if ("ct".equals(browserRes)) {
+ int resID = sResPackageCtx.getResources().getIdentifier(
+ "homepage_base", "string", "com.android.browser.res");
+ sFactoryResetUrl = sResPackageCtx.getResources().getString(resID);
+
+ int pathID = sResPackageCtx.getResources().getIdentifier(
+ "homepage_path", "string", "com.android.browser.res");
+ String path = sResPackageCtx.getResources().getString(pathID);
+ Locale locale = Locale.getDefault();
+ path = path.replace("%y", locale.getLanguage().toLowerCase());
+ path = path.replace("%z", '_'+locale.getCountry().toLowerCase());
+ boolean useCountry = true;
+ boolean useLanguage = true;
+ InputStream is = null;
+ AssetManager am = mContext.getAssets();
+ try {
+ is = am.open(path);
+ } catch (Exception ignored) {
+ useCountry = false;
+ path = sResPackageCtx.getResources().getString(pathID);
+ path = path.replace("%y", locale.getLanguage().toLowerCase());
+ path = path.replace("%z", "");
+ try {
+ is = am.open(path);
+ } catch (Exception ignoredlanguage) {
+ useLanguage = false;
+ }
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (Exception ignored) {}
+ }
+ }
+
+ if (!useCountry && !useLanguage) {
+ sFactoryResetUrl = sFactoryResetUrl.replace("%y%z", "en");
+ } else {
+ sFactoryResetUrl = sFactoryResetUrl.replace("%y",
+ locale.getLanguage().toLowerCase());
+ sFactoryResetUrl = sFactoryResetUrl.replace("%z", useCountry ?
+ '_' + locale.getCountry().toLowerCase() : "");
+ }
+ } else {
+ sFactoryResetUrl = mContext.getResources().getString(R.string.homepage_base);
+ }
+
if (sFactoryResetUrl.indexOf("{CID}") != -1) {
sFactoryResetUrl = sFactoryResetUrl.replace("{CID}",
BrowserProvider.getClientId(mContext.getContentResolver()));
diff --git a/src/com/android/browser/BrowserWebViewFactory.java b/src/com/android/browser/BrowserWebViewFactory.java
index 66d9e78..441ac6a 100644
--- a/src/com/android/browser/BrowserWebViewFactory.java
+++ b/src/com/android/browser/BrowserWebViewFactory.java
@@ -17,6 +17,7 @@
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.SystemProperties;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.WebView;
@@ -61,6 +62,15 @@
|| pm.hasSystemFeature(PackageManager.FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT);
w.getSettings().setDisplayZoomControls(!supportsMultiTouch);
+ // add for carrier homepage feature
+ String browserRes = SystemProperties.get("persist.env.c.browser.resource", "default");
+ if ("ct".equals(browserRes)) {
+ w.getSettings().setJavaScriptEnabled(true);
+ if (mContext instanceof BrowserActivity) {
+ w.addJavascriptInterface(mContext, "default_homepage");
+ }
+ }
+
// Add this WebView to the settings observer list and update the
// settings
final BrowserSettings s = BrowserSettings.getInstance();
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 150ece0..10de8a1 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -17,6 +17,7 @@
package com.android.browser;
import android.os.Bundle;
+import android.os.SystemProperties;
import android.util.Log;
import android.webkit.WebView;
@@ -408,6 +409,22 @@
// sNextId to be set correctly.
continue;
}
+
+ // add for carrier homepage feature
+ // If the webview restore successfully, add javascript interface again.
+ WebView view = t.getWebView();
+ if (view != null) {
+ String browserRes = SystemProperties.get("persist.env.c.browser.resource",
+ "default");
+ if ("ct".equals(browserRes)) {
+ view.getSettings().setJavaScriptEnabled(true);
+ if (mController.getActivity() instanceof BrowserActivity) {
+ view.addJavascriptInterface(mController.getActivity(),
+ "default_homepage");
+ }
+ }
+ }
+
tabMap.put(id, t);
// Me must set the current tab before restoring the state
// so that all the client classes are set.
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 014a32d..9577af6 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -36,6 +36,7 @@
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
+import android.os.SystemProperties;
import android.provider.BaseColumns;
import android.provider.Browser;
import android.provider.Browser.BookmarkColumns;
@@ -52,6 +53,7 @@
import android.provider.ContactsContract.RawContacts;
import android.provider.SyncStateContract;
import android.text.TextUtils;
+import android.util.Log;
import com.android.browser.R;
import com.android.browser.UrlUtils;
@@ -68,6 +70,8 @@
public class BrowserProvider2 extends SQLiteContentProvider {
+ private static final String TAG = "BrowserProvider2";
+
public static final String PARAM_GROUP_BY = "groupBy";
public static final String PARAM_ALLOW_EMPTY_ACCOUNTS = "allowEmptyAccounts";
@@ -651,6 +655,11 @@
db.insertOrThrow(TABLE_BOOKMARKS, null, values);
addDefaultBookmarks(db, FIXED_ID_ROOT);
+ // add for carrier bookmark feature
+ String browserRes = SystemProperties.get("persist.env.c.browser.resource", "default");
+ if ("ct".equals(browserRes)) {
+ addDefaultCarrierBookmarks(db, FIXED_ID_ROOT);
+ }
}
private void addDefaultBookmarks(SQLiteDatabase db, long parentId) {
@@ -710,6 +719,91 @@
}
}
+ // add for carrier bookmark feature
+ private void addDefaultCarrierBookmarks(SQLiteDatabase db, long parentId) {
+ Context mResPackageCtx = null;
+ try {
+ mResPackageCtx = getContext().createPackageContext(
+ "com.android.browser.res",
+ Context.CONTEXT_IGNORE_SECURITY);
+ } catch (Exception e) {
+ Log.e(TAG, "Create Res Apk Failed");
+ }
+ if (mResPackageCtx == null)
+ return;
+
+ CharSequence[] bookmarks = null;
+ TypedArray preloads = null;
+ Resources res = mResPackageCtx.getResources();
+ int resBookmarksID = res.getIdentifier("bookmarks", "array", "com.android.browser.res");
+ int resPreloadsID = res.getIdentifier("bookmark_preloads", "array",
+ "com.android.browser.res");
+ if (resBookmarksID != 0 && resPreloadsID != 0) {
+ bookmarks = res.getTextArray(resBookmarksID);
+ preloads = res.obtainTypedArray(resPreloadsID);
+ } else {
+ return;
+ }
+
+ // The Default Carrier bookmarks size
+ int size = bookmarks.length;
+
+ // googleSize the Default Google bookmarks size.
+ // The Default Carrier Bookmarks original position need move to googleSize index.
+ final CharSequence[] googleBookmarks = getContext().getResources().getTextArray(
+ R.array.bookmarks);
+ int googleSize = googleBookmarks.length;
+ try {
+ String parent = Long.toString(parentId);
+ String now = Long.toString(System.currentTimeMillis());
+ for (int i = 0; i < size; i = i + 2) {
+ CharSequence bookmarkDestination = replaceSystemPropertyInString(getContext(),
+ bookmarks[i + 1]);
+ db.execSQL("INSERT INTO bookmarks (" +
+ Bookmarks.TITLE + ", " +
+ Bookmarks.URL + ", " +
+ Bookmarks.IS_FOLDER + "," +
+ Bookmarks.PARENT + "," +
+ Bookmarks.POSITION + "," +
+ Bookmarks.DATE_CREATED +
+ ") VALUES (" +
+ "'" + bookmarks[i] + "', " +
+ "'" + bookmarkDestination + "', " +
+ "0," +
+ parent + "," +
+ Integer.toString(googleSize + i) + "," +
+ now +
+ ");");
+
+ int faviconId = preloads.getResourceId(i, 0);
+ int thumbId = preloads.getResourceId(i + 1, 0);
+ byte[] thumb = null, favicon = null;
+ try {
+ thumb = readRaw(res, thumbId);
+ } catch (IOException e) {
+ }
+ try {
+ favicon = readRaw(res, faviconId);
+ } catch (IOException e) {
+ }
+ if (thumb != null || favicon != null) {
+ ContentValues imageValues = new ContentValues();
+ imageValues.put(Images.URL, bookmarkDestination.toString());
+ if (favicon != null) {
+ imageValues.put(Images.FAVICON, favicon);
+ }
+ if (thumb != null) {
+ imageValues.put(Images.THUMBNAIL, thumb);
+ }
+ db.insert(TABLE_IMAGES, Images.FAVICON, imageValues);
+ }
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ } finally {
+ preloads.recycle();
+ }
+ }
+
private byte[] readRaw(Resources res, int id) throws IOException {
if (id == 0) {
return null;