[
  {
    "path": ".classpath",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" path=\"gen\"/>\n\t<classpathentry kind=\"con\" path=\"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK\"/>\n\t<classpathentry exported=\"true\" kind=\"con\" path=\"com.android.ide.eclipse.adt.LIBRARIES\"/>\n\t<classpathentry exported=\"true\" kind=\"con\" path=\"com.android.ide.eclipse.adt.DEPENDENCIES\"/>\n\t<classpathentry kind=\"output\" path=\"bin/classes\"/>\n</classpath>\n"
  },
  {
    "path": ".gitignore",
    "content": "/gen\n/bin\n"
  },
  {
    "path": ".project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>TintBrowser</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>com.android.ide.eclipse.adt.ApkBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.android.ide.eclipse.adt.AndroidNature</nature>\n\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": ".settings/org.eclipse.jdt.ui.prefs",
    "content": "#Wed Feb 15 09:45:43 CET 2012\r\neclipse.preferences.version=1\r\norg.eclipse.jdt.ui.javadoc=false\r\norg.eclipse.jdt.ui.text.custom_code_templates=<?xml version\\=\"1.0\" encoding\\=\"UTF-8\" standalone\\=\"no\"?><templates><template autoinsert\\=\"true\" context\\=\"gettercomment_context\" deleted\\=\"false\" description\\=\"Comment for getter method\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.gettercomment\" name\\=\"gettercomment\">/**\\r\\n * @return the ${bare_field_name}\\r\\n */</template><template autoinsert\\=\"true\" context\\=\"settercomment_context\" deleted\\=\"false\" description\\=\"Comment for setter method\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.settercomment\" name\\=\"settercomment\">/**\\r\\n * @param ${param} the ${bare_field_name} to set\\r\\n */</template><template autoinsert\\=\"true\" context\\=\"constructorcomment_context\" deleted\\=\"false\" description\\=\"Comment for created constructors\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.constructorcomment\" name\\=\"constructorcomment\">/**\\r\\n * ${tags}\\r\\n */</template><template autoinsert\\=\"true\" context\\=\"filecomment_context\" deleted\\=\"false\" description\\=\"Comment for created Java files\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.filecomment\" name\\=\"filecomment\">/**\\r\\n * \\r\\n */</template><template autoinsert\\=\"true\" context\\=\"typecomment_context\" deleted\\=\"false\" description\\=\"Comment for created types\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.typecomment\" name\\=\"typecomment\">/**\\r\\n * @author ${user}\\r\\n *\\r\\n * ${tags}\\r\\n */</template><template autoinsert\\=\"true\" context\\=\"fieldcomment_context\" deleted\\=\"false\" description\\=\"Comment for fields\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.fieldcomment\" name\\=\"fieldcomment\">/**\\r\\n * \\r\\n */</template><template autoinsert\\=\"true\" context\\=\"methodcomment_context\" deleted\\=\"false\" description\\=\"Comment for non-overriding methods\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.methodcomment\" name\\=\"methodcomment\">/**\\r\\n * ${tags}\\r\\n */</template><template autoinsert\\=\"true\" context\\=\"overridecomment_context\" deleted\\=\"false\" description\\=\"Comment for overriding methods\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.overridecomment\" name\\=\"overridecomment\">/* (non-Javadoc)\\r\\n * ${see_to_overridden}\\r\\n */</template><template autoinsert\\=\"true\" context\\=\"delegatecomment_context\" deleted\\=\"false\" description\\=\"Comment for delegate methods\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.delegatecomment\" name\\=\"delegatecomment\">/**\\r\\n * ${tags}\\r\\n * ${see_to_target}\\r\\n */</template><template autoinsert\\=\"false\" context\\=\"newtype_context\" deleted\\=\"false\" description\\=\"Newly created files\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.newtype\" name\\=\"newtype\">/*\\r\\n * Tint Browser for Android\\r\\n * \\r\\n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\\r\\n *\\r\\n * This program is free software; you can redistribute it and/or\\r\\n * modify it under the terms of the GNU General Public License\\r\\n * version 3 as published by the Free Software Foundation.\\r\\n *\\r\\n * This program is distributed in the hope that it will be useful,\\r\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\r\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\r\\n * GNU General Public License for more details.\\r\\n */\\r\\n\\r\\n${filecomment}\\r\\n${package_declaration}\\r\\n\\r\\n${typecomment}\\r\\n${type_declaration}</template><template autoinsert\\=\"true\" context\\=\"classbody_context\" deleted\\=\"false\" description\\=\"Code in new class type bodies\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.classbody\" name\\=\"classbody\">\\r\\n</template><template autoinsert\\=\"true\" context\\=\"interfacebody_context\" deleted\\=\"false\" description\\=\"Code in new interface type bodies\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.interfacebody\" name\\=\"interfacebody\">\\r\\n</template><template autoinsert\\=\"true\" context\\=\"enumbody_context\" deleted\\=\"false\" description\\=\"Code in new enum type bodies\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.enumbody\" name\\=\"enumbody\">\\r\\n</template><template autoinsert\\=\"true\" context\\=\"annotationbody_context\" deleted\\=\"false\" description\\=\"Code in new annotation type bodies\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.annotationbody\" name\\=\"annotationbody\">\\r\\n</template><template autoinsert\\=\"true\" context\\=\"catchblock_context\" deleted\\=\"false\" description\\=\"Code in new catch blocks\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.catchblock\" name\\=\"catchblock\">// ${todo} Auto-generated catch block\\r\\n${exception_var}.printStackTrace();</template><template autoinsert\\=\"true\" context\\=\"methodbody_context\" deleted\\=\"false\" description\\=\"Code in created method stubs\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.methodbody\" name\\=\"methodbody\">// ${todo} Auto-generated method stub\\r\\n${body_statement}</template><template autoinsert\\=\"true\" context\\=\"constructorbody_context\" deleted\\=\"false\" description\\=\"Code in created constructor stubs\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.constructorbody\" name\\=\"constructorbody\">${body_statement}\\r\\n// ${todo} Auto-generated constructor stub</template><template autoinsert\\=\"true\" context\\=\"getterbody_context\" deleted\\=\"false\" description\\=\"Code in created getters\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.getterbody\" name\\=\"getterbody\">return ${field};</template><template autoinsert\\=\"true\" context\\=\"setterbody_context\" deleted\\=\"false\" description\\=\"Code in created setters\" enabled\\=\"true\" id\\=\"org.eclipse.jdt.ui.text.codetemplates.setterbody\" name\\=\"setterbody\">${field} \\= ${param};</template></templates>\r\n"
  },
  {
    "path": "AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"org.tint\"\n    android:installLocation=\"auto\"\n    android:versionCode=\"10\"\n    android:versionName=\"1.8\">\n\n    <uses-sdk android:minSdkVersion=\"14\" android:targetSdkVersion=\"17\" />\n    \n    <permission android:name=\"org.tint.permissions.bookmarksprovider.READ\"\n        android:label=\"@string/PermissionReadBookmarksLabel\"\n        android:description=\"@string/PermissionReadBookmarksDescription\"\n        android:permissionGroup=\"android.permission-group.PERSONAL_INFO\"\n        android:protectionLevel=\"dangerous\" />\n    \n    <permission android:name=\"org.tint.permissions.bookmarksprovider.WRITE\"\n        android:label=\"@string/PermissionWriteBookmarksLabel\"\n        android:description=\"@string/PermissionWriteBookmarksDescription\"\n        android:permissionGroup=\"android.permission-group.PERSONAL_INFO\"\n        android:protectionLevel=\"dangerous\" />\n    \n    <permission android:name=\"org.tint.permissions.services.ADDONS\"\n        android:label=\"@string/PermissionBindAddonServiceLabel\"\n        android:description=\"@string/PermissionBindAddonServiceDescription\"\n        android:protectionLevel=\"dangerous\" />\n    \n    <uses-permission android:name=\"org.tint.permissions.services.ADDONS\" />\n    \n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>\n\n    <application\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/ApplicationName\"\n        android:theme=\"@style/ApplicationTheme\"\n        android:allowBackup=\"true\" \n        android:hardwareAccelerated=\"true\">\n\n        <activity\n            android:label=\"@string/ApplicationName\"\n            android:name=\".ui.activities.TintBrowserActivity\"\n            android:launchMode=\"singleTask\"\n            android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\">\n            <intent-filter >\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n            <intent-filter>\n\t\t\t\t<action android:name=\"android.intent.action.VIEW\" />\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t\t<category android:name=\"android.intent.category.BROWSABLE\" />\n\t\t\t\t<data android:scheme=\"http\" />\n\t\t\t\t<data android:scheme=\"https\" />\n\t\t\t</intent-filter>\n        </activity>\n\n        <activity android:name=\".ui.preferences.PreferencesActivity\" android:label=\"@string/PreferencesActivityTitle\"></activity>\n        <activity android:name=\".ui.activities.BookmarksActivity\"></activity>\n        <activity android:name=\".ui.activities.EditBookmarkActivity\" android:theme=\"@android:style/Theme.Holo.DialogWhenLarge\"></activity>\n        \n        <provider\n            android:name=\".providers.BookmarksProvider\"\n            android:authorities=\"org.tint.providers.bookmarksprovider\"\n            android:exported=\"true\"\n            android:readPermission=\"org.tint.permissions.bookmarksprovider.READ\"\n            android:writePermission=\"org.tint.permissions.bookmarksprovider.WRITE\" />\n        \n        <provider\n            android:name=\".providers.SslExceptionsProvider\"\n            android:authorities=\"org.tint.providers.sslexceptionsprovider\"\n            android:exported=\"false\" />\n        \n    </application>\n\n</manifest>"
  },
  {
    "path": "README.textile",
    "content": "h1. Tint Browser\n\nThis project is licensed under the \"GPL v3\":http://www.gnu.org/licenses/gpl-3.0.en.html license.\n\nTo build it, it is needed to clone the \"Tint Browser Addon Framework Library\":https://github.com/Anasthase/TintBrowserAddonFrameworkLibrary project.\n\nh1. Writting addons\n\nSee \"TintBrowserSampleAddon\":https://github.com/Anasthase/TintBrowserSampleAddon .\n\nh1. How to translate Tint Browser in your language\n\nBefore starting a translation, you must agree that your work will be released under the same license as Tint Browser, e.g. \"GPL version 3\":http://www.gnu.org/licenses/gpl-3.0.en.html. Also do not forget that a software translation is not a one-shot work, and that new translations may be needed after your initial work.\n\nTranslations are done is a language-specific XML file. A single translation string look like this :\n\nbq. &lt;string name=&quot;Bookmarks&quot;&gt;Bookmarks&lt;/string&gt;\n\nWhere the part in the name parameter is the string key, which you must leave unchanged, and the part between ??&lt;string …&gt;?? and ??&lt;/string&gt;?? the translated string.\n\nh2. Translation steps\n\nh3. Get the last reference language file\n\n\"https://raw.github.com/Anasthase/TintBrowser/master/res/values/strings.xml\":https://raw.github.com/Anasthase/TintBrowser/master/res/values/strings.xml\n\nThen select “Save as...” in your browser, and save it where you want on your computer.\n\nh3. Translate\n\nOpen the file you downloaded with a decent text editor (hint: Windows Notepad is *NOT* a decent text editor). Do not change the default encoding (UTF-8) and the default line breaks (Unix style).\n\nTranslate every required strings.\n\nh3. Specials cases\n\nh4. String-arrays\n\nDo not translate anything within a ??&lt;string-array&gt;?? tag.\n\nh4. Apostrophes\n\nApostrophes must be preceded by a “\\” character. \n\nExample:\n\nbq. &lt;string name=&quot;ContextMenuCopyLinkUrl&quot;&gt;Copier l\\'adresse du lien&lt;/string&gt;\n\nh4. Formatted strings\n\nSome strings may contains dynamic values, filled at runtime by the application. The place where the dynamics values are inserted in the string are represented by a %s, %1$s %2$s, etc. You must include the original %s-type in your translation, at the appropriate place.\n\nExamples:\n\nbq. &lt;string name=&quot;SslWarningsHeader&quot;&gt;There are problems with the security certificate for this site (%s).&lt;/string&gt;\n\nbq. &lt;string name=&quot;HttpAuthenticationDialogDialogTitle&quot;&gt;Sign in to %1$s - %2$s&lt;/string&gt;\n\nWhen there is several values to dynamically change in a single string, the %s part change to %1$s, %2$s, etc. You may change the order of the %s in your translation, if its make sense in you language, e.g. you can do something like:\n\nbq. &lt;string name=&quot;HttpAuthenticationDialog.DialogTitle&quot;&gt;SomeText %2$s AnotherText %1$s&lt;/string&gt;\n\nh4. Misc.\n\n* Use &#8230; instead of writing three points (...);\n\nh2. Submit your translation\n\nEither send me an e-mail, with your modified file and the language you translated, or open an \"issue\":https://github.com/Anasthase/TintBrowser/issues and post your file there. \n"
  },
  {
    "path": "changelog",
    "content": "1.8:\n- Fix file select dialog not opening.\n- Added download confirmation dialog.\n- Ability to redirect JS logs to logcat.\n- \"Incognito by default\" option.\n- Cookies are now sent with download requests.\n- Ability to redirect JS logs to logcat.\n- Images can be opened in a new tab through the context menu.\n- Back key return to the start page if no browsing history (if the start page is used).\n- Spanish, Japanese, and Simplified Chinese translations.\n\n1.7:\n- New user interface for phones. The legacy one is still available under preferences.\n- Opened tabs can now be restored at start-up.\n- New preference to choose user interface type.\n- Various bug fix.\n\n1.6.1:\n- Fix FC when opening a tab in background on tablets.\n- Hide application instead of finishing it on back pressed.\n\n1.6:\n- New export format for bookmarks and history; Bookmarks folders are now handled in export and import; Old format still supported for import.\n- Full screen mode (Exit full screen icon on tablets designed by Olyn LeRoy from The Noun Project).\n- UI improvements for 7in tablets.\n- German translation (thanks to Lars-Dominik).\n- Russian translation (thanks to Anton).\n\n1.5:\n- User choice for SSL security exceptions can now be saved on a per-website basis.\n- Better search engine customization.\n- Handle search key on devices which has one.\n- Bookmarks can now be sorted in three ways (Most used, Alphabetically, Most recently visited).\n- Various bug fixes.\n- Portuguese translation (thanks to Rui).\n\n1.4:\n- Add accessibility settings: minimum font size, text scaling, and inverted screen rendering;\n- Add progress bar when loading history and bookmarks;\n- On url suggestions, add a button to paste the suggested url in the url bar, without loading it;\n- On phones, tab switching use a quick fade in/out animation;\n\n1.3: Features:\n- Folders can be created in bookmarks;\n- Various minor improvements in layouts;\n- Fix some force close;\n\n1.2: Features:\n- Incognito mode;\n- Open links in background;\n- Various bug fixes (tabs are no longer lost when docking/undocking keyboard on Asus Transformer(s), ...)\n\n1.1: Bug fixes:\n- Long-click on image links now work as intended;\n- Stop plugins when closing a tab;\n- keyboard no longer hide along with toolbar during a search in phone mode;\n- Deleting items in history no longer bring back to the first section;\n\n1.0: Initial release."
  },
  {
    "path": "lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n    <issue id=\"AlwaysShowAction\">\n        <ignore path=\"res/menu-sw600dp/main_activity_menu.xml\" />\n    </issue>\n    <issue id=\"IconDuplicatesConfig\">\n        <ignore path=\"res/drawable-mdpi/ab_bottom_solid_dark_holo.9.png\" />\n        <ignore path=\"res/drawable-mdpi/ab_solid_dark_holo.9.png\" />\n        <ignore path=\"res/drawable-mdpi/browser_thumbnail.png\" />\n        <ignore path=\"res/drawable-mdpi/divider_vertical_dark_opaque.9.png\" />\n        <ignore path=\"res/drawable-mdpi/ic_folder.png\" />\n    </issue>\n</lint>"
  },
  {
    "path": "proguard.cfg",
    "content": "-optimizationpasses 5\n-dontusemixedcaseclassnames\n-dontskipnonpubliclibraryclasses\n-dontpreverify\n-verbose\n-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*\n\n-keep public class * extends android.app.Activity\n-keep public class * extends android.app.Application\n-keep public class * extends android.app.Service\n-keep public class * extends android.content.BroadcastReceiver\n-keep public class * extends android.content.ContentProvider\n-keep public class * extends android.app.backup.BackupAgentHelper\n-keep public class * extends android.preference.Preference\n-keep public class com.android.vending.licensing.ILicensingService\n\n-keepclasseswithmembernames class * {\n    native <methods>;\n}\n\n-keepclasseswithmembers class * {\n    public <init>(android.content.Context, android.util.AttributeSet);\n}\n\n-keepclasseswithmembers class * {\n    public <init>(android.content.Context, android.util.AttributeSet, int);\n}\n\n-keepclassmembers class * extends android.app.Activity {\n   public void *(android.view.View);\n}\n\n-keepclassmembers enum * {\n    public static **[] values();\n    public static ** valueOf(java.lang.String);\n}\n\n-keep class * implements android.os.Parcelable {\n  public static final android.os.Parcelable$Creator *;\n}\n"
  },
  {
    "path": "project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system use,\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n\n# Project target.\ntarget=android-14\nandroid.library.reference.1=../TintBrowserAddonFrameworkLibrary\n"
  },
  {
    "path": "res/animator/fade_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<objectAnimator xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/linear_interpolator\"\n    android:valueFrom=\"0\"\n    android:valueTo=\"1\"\n    android:propertyName=\"alpha\"\n    android:duration=\"@android:integer/config_shortAnimTime\"\n/>\n"
  },
  {
    "path": "res/animator/fade_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<objectAnimator xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/linear_interpolator\"\n    android:valueFrom=\"1.0\"\n    android:valueTo=\"0.0\"\n    android:propertyName=\"alpha\"\n    android:duration=\"@android:integer/config_shortAnimTime\"\n/>\n"
  },
  {
    "path": "res/drawable/bookmark_list_favicon_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <solid android:color=\"@color/bookmarkListFaviconBackground\" />\n    <padding\n        android:left=\"@dimen/list_favicon_padding\"\n        android:right=\"@dimen/list_favicon_padding\"\n        android:top=\"@dimen/list_favicon_padding\"\n        android:bottom=\"@dimen/list_favicon_padding\" />\n    <corners android:radius=\"@dimen/list_favicon_corner_radius\" />\n</shape>\n"
  },
  {
    "path": "res/drawable/btn_star.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_checked=\"true\"\n          android:drawable=\"@drawable/ic_bookmark_on\" />\n    <item android:state_checked=\"false\"\n          android:drawable=\"@drawable/ic_bookmark_off\" />\n</selector>\n"
  },
  {
    "path": "res/drawable/ic_back.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:state_enabled=\"true\"\n        android:drawable=\"@drawable/ic_back_enabled\" />\n    <item android:state_enabled=\"false\"\n         android:drawable=\"@drawable/ic_back_disabled\" />\n</selector>\n"
  },
  {
    "path": "res/drawable/ic_forward.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:state_enabled=\"true\"\n        android:drawable=\"@drawable/ic_forward_enabled\" />\n    <item android:state_enabled=\"false\"\n         android:drawable=\"@drawable/ic_forward_disabled\" />\n</selector>\n"
  },
  {
    "path": "res/drawable/ic_querybuilder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:state_enabled=\"false\"\n        android:drawable=\"@drawable/ic_querybuilder_disabled\" />\n\n    <item android:state_enabled=\"true\" android:state_pressed=\"true\"\n        android:drawable=\"@drawable/ic_querybuilder_pressed\" />\n\n    <item android:state_enabled=\"true\" android:state_focused=\"true\"\n        android:state_window_focused=\"true\"\n        android:drawable=\"@drawable/ic_querybuilder_pressed\" />\n\n    <item android:state_enabled=\"true\" android:state_selected=\"true\"\n        android:drawable=\"@drawable/ic_querybuilder_pressed\" />\n\n    <item android:state_enabled=\"true\"\n        android:drawable=\"@drawable/ic_querybuilder_normal\" />\n</selector>\n"
  },
  {
    "path": "res/drawable/tab_panel_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:state_enabled=\"true\" android:state_pressed=\"true\"\n        android:drawable=\"@drawable/tab_panel_button_pressed\" />\n\n    <item android:state_enabled=\"true\"\n        android:drawable=\"@drawable/tab_panel_button_normal\" />\n</selector>\n"
  },
  {
    "path": "res/layout/about_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingTop=\"10dip\"\n    android:paddingBottom=\"10dip\"\n    android:orientation=\"vertical\" >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"15dip\"\n        android:orientation=\"horizontal\" >\n\n        <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginRight=\"10dip\"\n            android:contentDescription=\"@string/ContentDescriptionApplicationIcon\"\n            android:src=\"@drawable/ic_launcher\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:orientation=\"vertical\" >\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/ApplicationName\"\n                android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n            <TextView\n                android:id=\"@+id/AboutVersionText\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:text=\"@string/AboutVersionText\"\n                android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n        </LinearLayout>\n    </LinearLayout>\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dip\"\n        android:text=\"@string/ApplicationDescription\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dip\"\n        android:text=\"@string/AboutLicenseText\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dip\"\n        android:autoLink=\"web\"\n        android:text=\"@string/AboutUrlText\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/accessibility_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"5dip\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/AccessibilityPreviewTitle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n    <TextView\n        android:id=\"@+id/AccessibilityPreviewSummary\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <WebView\n        android:id=\"@+id/AccessibilityPreviewWebView\"\n        android:paddingTop=\"10dip\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"180dp\" />\n    \n</LinearLayout>"
  },
  {
    "path": "res/layout/addon_details_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:id=\"@+id/AddonName\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"5dip\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n        <TextView\n            android:id=\"@+id/AddonShortDesc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"10dip\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" >\n\n            <Switch\n                android:id=\"@+id/AddonEnabled\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:textOff=\"@string/Off\"\n                android:textOn=\"@string/On\" />\n\n            <Button\n                android:id=\"@+id/AddonPreferences\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:text=\"@string/Preferences\" />\n        </RelativeLayout>\n\n        <TextView\n            android:id=\"@+id/AddonLongDesc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"10dip\"\n            android:layout_marginTop=\"10dip\"\n            android:autoLink=\"web\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <TextView\n            android:id=\"@+id/AddonContact\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:autoLink=\"web|email\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dip\"\n            android:text=\"@string/AddonDetailsUsedCallbacksTitle\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <TextView\n            android:id=\"@+id/AddonCallbacks\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dip\"\n            android:text=\"@string/AddonDetailsUsedPermissionsTitle\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <TextView\n            android:id=\"@+id/AddonPermissions\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n    </LinearLayout>\n\n</ScrollView>"
  },
  {
    "path": "res/layout/addon_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:descendantFocusability=\"blocksDescendants\" >\n    \n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_toLeftOf=\"@+id/AddonEnabled\"\n        android:layout_gravity=\"center_vertical\"\n        android:paddingRight=\"3dip\"\n        android:paddingTop=\"8dip\"\n        android:paddingBottom=\"8dip\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:id=\"@+id/AddonName\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\"\n            android:singleLine=\"true\"\n            android:ellipsize=\"end\"\n            style=\"@style/ApplicationTheme.ListMainItem\" />        \n\n        <TextView\n            android:id=\"@+id/AddonShortDesc\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"\"\n            android:singleLine=\"true\"\n            android:ellipsize=\"end\"\n            android:textColor=\"#888888\" />\n\n    </LinearLayout>\n\n    <Switch\n        android:id=\"@+id/AddonEnabled\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerVertical=\"true\"        \n        android:layout_alignParentRight=\"true\"\n        android:textOn=\"@string/On\"\n        android:textOff=\"@string/Off\" />\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/addons_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n\n    <LinearLayout\n        android:id=\"@+id/AddonsWarningLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dip\"\n            android:layout_marginBottom=\"5dip\"\n            android:text=\"@string/AddonsWarningText\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <TextView\n            android:id=\"@+id/AddonsGetAddons\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/AddonsGetAddons\"\n            android:layout_marginBottom=\"8dip\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n        \n        <ImageView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dip\"\n            android:contentDescription=\"@string/ContentDescriptionDivider\"            \n            android:src=\"#404040\" />\n\n    </LinearLayout>\n\n    <ListView\n        android:id=\"@+id/AddonsList\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_above=\"@+id/AddonsButtonLayout\"\n        android:layout_below=\"@+id/AddonsWarningLayout\" >\n    </ListView>\n    \n    <LinearLayout\n        android:id=\"@+id/AddonsButtonLayout\"\n        style=\"?android:attr/buttonBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginBottom=\"5dip\"\n        android:layout_marginTop=\"5dip\"\n        android:gravity=\"center_horizontal\" >\n\n        <Button\n            android:id=\"@+id/AddonsDisableAll\"\n            style=\"?android:attr/buttonBarButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"0.5\"\n            android:text=\"@string/AddonsDisableAll\" />\n\n        <Button\n            android:id=\"@+id/AddonsEnableAll\"\n            style=\"?android:attr/buttonBarButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"0.5\"\n            android:text=\"@string/AddonsEnableAll\" />\n\n    </LinearLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/ask_user_input_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:padding=\"10dip\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/AskUserInputMessage\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dip\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n    <EditText\n        android:id=\"@+id/AskUserInput\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:inputType=\"text\" >\n\n        <requestFocus />\n    </EditText>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/bookmark_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:paddingTop=\"5dip\"\n\tandroid:paddingBottom=\"5dip\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:orientation=\"vertical\">\n\n\t<ImageView\n\t    android:id=\"@+id/BookmarkRow.Thumbnail\"\n\t    android:layout_height=\"wrap_content\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_gravity=\"center_vertical\"\n\t\tandroid:contentDescription=\"@string/ContentDescriptionBookmarkThumbnail\"\n\t\tandroid:src=\"@drawable/browser_thumbnail\" />\n\t\n\t<LinearLayout\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_marginTop=\"5dip\"\n\t\tandroid:layout_gravity=\"center_vertical\"\n\t\tandroid:orientation=\"horizontal\" >\n\t\n\t\t<ImageView\n\t        android:id=\"@+id/divider\"\n\t        android:layout_width=\"wrap_content\"\n\t        android:layout_height=\"fill_parent\"\n\t        android:paddingRight=\"5dip\"\n\t        android:scaleType=\"fitXY\"\n\t        android:contentDescription=\"@string/ContentDescriptionDivider\"\n\t        android:src=\"?android:attr/dividerVertical\" />\n\t\n\t\t<LinearLayout\n\t\t    android:layout_width=\"wrap_content\"\n\t\t    android:layout_height=\"wrap_content\"\n\t\t    android:layout_gravity=\"center_vertical\"\t\t    \n\t\t    android:orientation=\"vertical\" >\n\n\t\t    <TextView\n\t\t        android:id=\"@+id/BookmarkRow.Title\"\n\t\t        android:layout_width=\"fill_parent\"\n\t\t        android:layout_height=\"wrap_content\"\n\t\t        android:layout_gravity=\"center_vertical\"\n\t\t        android:ellipsize=\"marquee\"\n\t\t        android:singleLine=\"true\"\n\t\t        android:text=\"\" />\n\n\t\t    <TextView\n\t\t        android:id=\"@+id/BookmarkRow.Url\"\n\t\t        android:layout_width=\"fill_parent\"\n\t\t        android:layout_height=\"wrap_content\"\n\t\t        android:ellipsize=\"marquee\"\n\t\t        android:singleLine=\"true\"\n\t\t        android:text=\"\"\n\t\t        android:textColor=\"#888888\" />\n\n\t\t</LinearLayout>\n\t\n\t</LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/bookmarks_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    android:padding=\"0dip\"\n    android:orientation=\"vertical\" >\n    \n    <LinearLayout\n        android:id=\"@+id/BookmarksBreadCrumbGroup\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\" >\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"@dimen/bookmarks_fragment_margin_top_bottom\"\n            android:layout_marginBottom=\"10dip\"\n            android:layout_marginLeft=\"@dimen/bookmarks_fragment_breadcrumb_margin_left_right\"\n            android:layout_marginRight=\"@dimen/bookmarks_fragment_breadcrumb_margin_left_right\"            \n            android:orientation=\"horizontal\" >\n\n            <ImageView\n                android:id=\"@+id/BookmarksBreadCrumbBackHierarchy\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?android:attr/selectableItemBackground\"\n                android:contentDescription=\"@string/ContentDescriptionBookmarksFoldersBack\"\n                android:focusable=\"true\"\n                android:src=\"@drawable/ic_back_hierarchy\" />\n\n            <android.app.FragmentBreadCrumbs\n                android:id=\"@+id/BookmarksBreadCrumb\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:gravity=\"center_vertical|left\" />\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/divider\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"@dimen/bookmarks_fragment_margin_left_right\"\n            android:layout_marginRight=\"@dimen/bookmarks_fragment_margin_left_right\"\n            android:contentDescription=\"@string/ContentDescriptionDivider\"\n            android:paddingRight=\"5dip\"\n            android:scaleType=\"fitXY\"\n            android:src=\"?android:attr/dividerHorizontal\" />\n        \n\t</LinearLayout>    \n\n    <RelativeLayout\n        android:gravity=\"center\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" >\n\n        <GridView\n            android:id=\"@+id/BookmarksGridView\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"fill_parent\"\n            android:layout_marginBottom=\"@dimen/bookmarks_fragment_margin_top_bottom\"\n            android:layout_marginLeft=\"@dimen/bookmarks_fragment_margin_left_right\"\n            android:layout_marginRight=\"@dimen/bookmarks_fragment_margin_left_right\"\n            android:layout_marginTop=\"10dip\"\n            android:columnWidth=\"@dimen/bookmarks_fragment_column_width\"\n            android:gravity=\"center\"\n            android:horizontalSpacing=\"@dimen/bookmarks_fragment_horizontal_spacing\"\n            android:numColumns=\"auto_fit\"\n            android:stretchMode=\"columnWidth\"\n            android:verticalSpacing=\"@dimen/bookmarks_fragment_vertical_spacing\" />\n\n        <ProgressBar\n            android:id=\"@+id/BookmarksProgressBar\"\n            style=\"?android:attr/progressBarStyleLarge\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/checkbox_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:padding=\"10dip\"\n    android:orientation=\"vertical\" >\n\n    <CheckBox\n        android:id=\"@+id/RemenberChoiceCheckBox\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/RememberMyChoice\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/download_confirm_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"4dp\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/DownloadOverlayDialog.FileName\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"4dp\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n    <TextView\n        android:id=\"@+id/DownloadOverlayDialog.FileSource\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"4dp\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <CheckBox\n        android:id=\"@+id/DownloadOverlayDialog.Incognito\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"4dp\"\n        android:text=\"@string/DownloadInIncognito\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/edit_bookmark_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:ignore=\"UselessParent\" >\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dip\"\n        android:layout_weight=\"1\" >\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" >\n\n            <TableLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingLeft=\"20dip\"\n                android:paddingRight=\"20dip\"\n                android:paddingTop=\"10dip\"\n                android:shrinkColumns=\"1\"\n                android:stretchColumns=\"1\" >\n\n                <TableRow android:layout_marginBottom=\"10dip\" >\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:text=\"@string/BookmarkText\"\n                        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n                    <EditText\n                        android:id=\"@+id/EditBookmarkActivity.LabelEdit\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginLeft=\"20dip\"\n                        android:ellipsize=\"end\"\n                        android:inputType=\"textCapSentences|textNoSuggestions\"\n                        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n                </TableRow>\n\n                <TableRow android:layout_marginBottom=\"10dip\" >\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:text=\"@string/UrlText\"\n                        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n                    <EditText\n                        android:id=\"@+id/EditBookmarkActivity.UrlEdit\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginLeft=\"20dip\"\n                        android:ellipsize=\"end\"\n                        android:hint=\"@string/UrlHint\"\n                        android:inputType=\"textUri\"\n                        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n                </TableRow>\n\n                <TableRow android:layout_marginBottom=\"10dip\" >\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:text=\"@string/Folder\"\n                        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n                    <Spinner\n                        android:id=\"@+id/EditBookmarkActivity.FolderSpinner\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginLeft=\"20dip\" />\n                </TableRow>\n\n                <EditText\n                    android:id=\"@+id/EditBookmarkActivity.FolderValue\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"10dip\"\n                    android:hint=\"@string/NewFolderHint\"\n                    android:inputType=\"text\" >\n                </EditText>\n            </TableLayout>\n        </ScrollView>\n    </FrameLayout>\n\n    <ImageView\n        android:id=\"@+id/divider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"@string/ContentDescriptionDivider\"\n        android:scaleType=\"fitXY\"\n        android:src=\"?android:attr/dividerHorizontal\" />\n\n    <LinearLayout\n        style=\"?android:attr/buttonBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\" >\n\n        <Button\n            android:id=\"@+id/EditBookmarkActivity.Cancel\"\n            style=\"?android:attr/buttonBarButtonStyle\"\n            android:layout_width=\"0dip\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"right\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"2\"\n            android:text=\"@string/Cancel\" />\n\n        <Button\n            android:id=\"@+id/EditBookmarkActivity.OK\"\n            style=\"?android:attr/buttonBarButtonStyle\"\n            android:layout_width=\"0dip\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"left\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"2\"\n            android:text=\"@string/OK\" />\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/expandable_list_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\" \n        android:layout_width=\"match_parent\" \n        android:layout_height=\"wrap_content\"\n        android:minHeight=\"?android:attr/listPreferredItemHeight\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:paddingLeft=\"35dip\"\n        android:gravity=\"center_vertical\"\n        android:background=\"?android:attr/activatedBackgroundIndicator\"\n        />\n"
  },
  {
    "path": "res/layout/expandable_list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ApplicationTheme.ListMainItem\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"    \n    android:gravity=\"center_vertical\"\n    android:paddingLeft=\"35dip\"    \n    android:paddingRight=\"?android:attr/listPreferredItemPaddingRight\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n/>\n"
  },
  {
    "path": "res/layout/history_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <ExpandableListView\n        android:id=\"@+id/HistoryExpandableList\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/HistoryProgressBar\"\n        style=\"?android:attr/progressBarStyleLarge\"\n        android:layout_centerInParent=\"true\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/history_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:descendantFocusability=\"blocksDescendants\"\n    android:orientation=\"horizontal\"\n    android:paddingBottom=\"@dimen/history_row_padding_top_bottom\"\n    android:paddingLeft=\"@dimen/history_row_padding_left_right\"\n    android:paddingRight=\"@dimen/history_row_padding_left_right\"\n    android:paddingTop=\"@dimen/history_row_padding_top_bottom\" >\n\n    <LinearLayout\n        android:id=\"@+id/ThumbnailContainer\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerVertical=\"true\"\n        android:orientation=\"vertical\" >\n\n        <ImageView\n            android:id=\"@+id/HistoryRow.Thumbnail\"\n            android:layout_width=\"32dip\"\n            android:layout_height=\"32dip\"\n            android:layout_marginLeft=\"8dip\"\n            android:layout_marginRight=\"8dip\"\n            android:background=\"@drawable/bookmark_list_favicon_bg\"\n            android:contentDescription=\"@string/ContentDescriptionFavicon\"\n            android:gravity=\"center_vertical\"\n            android:scaleType=\"fitXY\"\n            android:src=\"@drawable/app_web_browser_sm\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_toLeftOf=\"@+id/HistoryRow.BookmarkStar\"\n        android:layout_toRightOf=\"@+id/ThumbnailContainer\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:id=\"@+id/HistoryRow.Title\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:text=\"\" />\n\n        <TextView\n            android:id=\"@+id/HistoryRow.Url\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:text=\"\"\n            android:textColor=\"#888888\" />\n    </LinearLayout>\n\n    <CheckBox\n        android:id=\"@+id/HistoryRow.BookmarkStar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_gravity=\"center_vertical\"\n        android:button=\"@drawable/btn_star\" />\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/http_authentication_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<TableLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"vertical\">\n\n    <TextView \n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"wrap_content\"\n        android:textSize=\"18sp\"\n        android:text=\"@string/HttpAuthenticationDialogUserName\"\n        android:gravity=\"left\"\n        android:layout_marginTop=\"12dip\"\n        android:layout_marginLeft=\"20dip\"\n        android:layout_marginRight=\"20dip\" />\n            \n    <EditText\n        android:id=\"@+id/username_edit\"\n        android:textSize=\"18sp\"\n        android:scrollHorizontally=\"true\"\n        android:inputType=\"text\"\n        android:gravity=\"fill_horizontal\"\n        android:layout_weight=\"1\"\n        android:layout_marginLeft=\"20dip\"\n        android:layout_marginRight=\"20dip\"\n        android:layout_marginBottom=\"12dip\" />\n\n    <TextView\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"wrap_content\"\n        android:textSize=\"18sp\"\n        android:text=\"@string/HttpAuthenticationDialogPassword\"\n        android:gravity=\"left\"\n        android:layout_marginLeft=\"20dip\"\n        android:layout_marginRight=\"20dip\" />\n            \n    <EditText\n        android:id=\"@+id/password_edit\"\n        android:textSize=\"18sp\"\n        android:scrollHorizontally=\"true\"\n        android:inputType=\"textPassword\"\n        android:gravity=\"fill_horizontal\"\n        android:layout_weight=\"1\"\n        android:layout_marginLeft=\"20dip\"\n        android:layout_marginRight=\"20dip\"\n        android:layout_marginBottom=\"12dip\" />\n</TableLayout>"
  },
  {
    "path": "res/layout/javascript_prompt_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    >\n\n    <TextView android:id=\"@+id/JavaScriptPromptMessage\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\"\n        android:layout_marginBottom=\"10dip\"\n        android:layout_marginTop=\"10dip\"\n        android:layout_marginLeft=\"10dip\"\n        android:layout_marginRight=\"10dip\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n    <EditText android:id=\"@+id/JavaScriptPromptInput\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:selectAllOnFocus=\"true\"\n            android:scrollHorizontally=\"true\"\n            android:minWidth=\"250dp\"\n            android:inputType=\"text\"\n            android:layout_marginBottom=\"5dip\"\n            android:layout_marginTop=\"5dip\"\n            android:layout_marginLeft=\"10dip\"\n            android:layout_marginRight=\"10dip\"/>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/legacy_phone_main_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"fill_parent\"\n    android:orientation=\"vertical\" >\n    \n    <FrameLayout\n        android:id=\"@+id/WebViewContainer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"#dcdcdc\"\n        android:orientation=\"vertical\" >\n\n    </FrameLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/TopBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?android:attr/actionBarSize\"        \n        android:layout_alignParentTop=\"true\"\n        android:layout_margin=\"0dip\"\n        android:padding=\"0dip\"\n        android:background=\"@drawable/ab_solid_dark_holo\"\n        android:scaleType=\"fitXY\"\n        android:orientation=\"horizontal\" >       \t            \n        \n        <ImageView\n            android:id=\"@+id/FaviconView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_marginBottom=\"3dip\"\n            android:layout_marginTop=\"3dip\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            android:contentDescription=\"@string/ContentDescriptionFavicon\"\n            android:focusable=\"true\"\n            android:padding=\"5dip\"\n            android:src=\"@drawable/ic_launcher\" />\n\n        <ProgressBar\n            android:id=\"@+id/WebViewProgress\"\n            style=\"?android:attr/progressBarStyleSmall\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerInParent=\"true\"\n            android:layout_toLeftOf=\"@+id/UrlBar\"\n            android:visibility=\"invisible\" />\n\n        <org.tint.ui.views.PhoneUrlBar\n            android:id=\"@+id/UrlBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_toRightOf=\"@+id/FaviconView\" />\n        \n    </RelativeLayout>\n    \n    <ImageView\n        android:id=\"@+id/PreviousTabView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_above=\"@+id/BottomBar\"\n        android:contentDescription=\"@string/ContentDescriptionPreviousTabButton\"\n        android:src=\"@drawable/ic_previous_tab\" >\n    </ImageView>\n\n    <ImageView\n        android:id=\"@+id/NextTabView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_above=\"@+id/BottomBar\"\n        android:contentDescription=\"@string/ContentDescriptionNextTabButton\"\n        android:src=\"@drawable/ic_next_tab\" >\n    </ImageView>\n    \n    <ImageView\n        android:id=\"@+id/BubbleLeftView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:contentDescription=\"@string/ContentDescriptionLeftBubble\"\n        android:src=\"@drawable/ic_bubble_left\" >\n    </ImageView>\n    \n    <ImageView\n        android:id=\"@+id/BubbleRightView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentRight=\"true\"\n        android:contentDescription=\"@string/ContentDescriptionRightBubble\"\n        android:src=\"@drawable/ic_bubble_right\" >\n    </ImageView>\n    \n    <LinearLayout\n        android:id=\"@+id/BottomBar\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"        \n        android:layout_alignParentBottom=\"true\"\n        android:background=\"@drawable/ab_bottom_solid_dark_holo\"\n        android:scaleType=\"fitXY\"\n        android:weightSum=\"5\" >\n        \n        <ImageView android:id=\"@+id/BtnBack\"\n\t\t\tandroid:layout_width=\"wrap_content\" android:layout_height=\"match_parent\"\n\t\t\tandroid:layout_gravity=\"center_vertical\" android:background=\"?android:attr/selectableItemBackground\"\n\t\t\tandroid:paddingTop=\"8dip\"\n        \tandroid:paddingBottom=\"8dip\"\n\t\t\tandroid:contentDescription=\"@string/ContentDescriptionBackButton\"\n\t\t\tandroid:focusable=\"true\" android:paddingLeft=\"8dip\"\n\t\t\tandroid:paddingRight=\"8dip\" android:src=\"@drawable/ic_back\"\n\t\t\tandroid:layout_weight=\"1\" />\n\t\t\t\n\t\t<ImageView android:id=\"@+id/BtnCloseTab\"\n\t\t\tandroid:layout_width=\"wrap_content\" android:layout_height=\"match_parent\"\n\t\t\tandroid:layout_gravity=\"center_vertical\" android:background=\"?android:attr/selectableItemBackground\"\n\t\t\tandroid:paddingTop=\"8dip\"\n        \tandroid:paddingBottom=\"8dip\"\n\t\t\tandroid:contentDescription=\"@string/ContentDescriptionCloseTabButton\"\n\t\t\tandroid:focusable=\"true\" android:paddingLeft=\"8dip\"\n\t\t\tandroid:paddingRight=\"8dip\" android:src=\"@android:drawable/ic_menu_close_clear_cancel\"\n\t\t\tandroid:layout_weight=\"1\" />\n\t\t\t\n\t\t<ImageView android:id=\"@+id/BtnBookmarks\"\n\t\t\tandroid:layout_width=\"wrap_content\" android:layout_height=\"match_parent\"\n\t\t\tandroid:layout_gravity=\"center_vertical\" android:background=\"?android:attr/selectableItemBackground\"\n\t\t\tandroid:paddingTop=\"8dip\"\n        \tandroid:paddingBottom=\"8dip\"\n\t\t\tandroid:contentDescription=\"@string/ContentDescriptionBookmarksButton\"\n\t\t\tandroid:focusable=\"true\" android:paddingLeft=\"8dip\"\n\t\t\tandroid:paddingRight=\"8dip\" android:src=\"@drawable/ic_bookmarks\"\n\t\t\tandroid:layout_weight=\"1\" />\n\t\t\t\n\t\t<ImageView android:id=\"@+id/BtnAddTab\"\n\t\t\tandroid:layout_width=\"wrap_content\" android:layout_height=\"match_parent\"\n\t\t\tandroid:layout_gravity=\"center_vertical\" android:background=\"?android:attr/selectableItemBackground\"\n\t\t\tandroid:paddingTop=\"8dip\"\n        \tandroid:paddingBottom=\"8dip\"\n\t\t\tandroid:contentDescription=\"@string/ContentDescriptionNewTabButton\"\n\t\t\tandroid:focusable=\"true\" android:paddingLeft=\"8dip\"\n\t\t\tandroid:paddingRight=\"8dip\" android:src=\"@android:drawable/ic_menu_add\"\n\t\t\tandroid:layout_weight=\"1\" />\n\n\t\t<ImageView android:id=\"@+id/BtnForward\" android:layout_width=\"wrap_content\"\n\t\t\tandroid:layout_height=\"match_parent\" android:layout_gravity=\"center_vertical\"\n\t\t\tandroid:background=\"?android:attr/selectableItemBackground\"\n\t\t\tandroid:paddingTop=\"8dip\"\n        \tandroid:paddingBottom=\"8dip\"\n\t\t\tandroid:contentDescription=\"@string/ContentDescriptionForwardButton\"\n\t\t\tandroid:focusable=\"true\" android:paddingLeft=\"8dip\"\n\t\t\tandroid:paddingRight=\"8dip\" android:src=\"@drawable/ic_forward\"\n\t\t\tandroid:layout_weight=\"1\" />\n        \n    </LinearLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/legacy_phone_start_page_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"?android:attr/actionBarSize\"\n    android:paddingTop=\"?android:attr/actionBarSize\" >\n\n    <GridView\n        android:id=\"@+id/StartPageFragmentGrid\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"@dimen/startpage_fragment_margin_top_bottom\"\n        android:layout_marginLeft=\"@dimen/startpage_fragment_margin_left_right\"\n        android:layout_marginRight=\"@dimen/startpage_fragment_margin_left_right\"\n        android:layout_marginTop=\"@dimen/startpage_fragment_margin_top_bottom\"\n        android:columnWidth=\"@dimen/startpage_fragment_column_width\"\n        android:gravity=\"center\"\n        android:horizontalSpacing=\"@dimen/startpage_fragment_horizontal_spacing\"\n        android:numColumns=\"auto_fit\"\n        android:stretchMode=\"columnWidth\"\n        android:verticalSpacing=\"@dimen/startpage_fragment_vertical_spacing\" >\n    </GridView>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/panel_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <RelativeLayout\n        android:id=\"@+id/panel\"\n        android:layout_width=\"225dip\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:orientation=\"vertical\" >\n\n        <LinearLayout\n            android:id=\"@+id/TopPanel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?android:attr/actionBarSize\"\n            android:layout_alignParentTop=\"true\"\n            android:background=\"@drawable/ab_solid_dark_holo\"\n            android:scaleType=\"fitXY\"\n            android:weightSum=\"3\" >\n\n            <ImageView\n                android:id=\"@+id/BtnBack\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_weight=\"1\"\n                android:background=\"?android:attr/selectableItemBackground\"\n                android:contentDescription=\"@string/ContentDescriptionBackButton\"\n                android:focusable=\"true\"\n                android:paddingBottom=\"8dip\"\n                android:paddingLeft=\"8dip\"\n                android:paddingRight=\"8dip\"\n                android:paddingTop=\"8dip\"\n                android:src=\"@drawable/ic_back\" />\n\n            <ImageView\n                android:id=\"@+id/BtnHome\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_weight=\"1\"\n                android:background=\"?android:attr/selectableItemBackground\"\n                android:contentDescription=\"@string/ContentDescriptionHomeButton\"\n                android:focusable=\"true\"\n                android:paddingBottom=\"8dip\"\n                android:paddingLeft=\"8dip\"\n                android:paddingRight=\"8dip\"\n                android:paddingTop=\"8dip\"\n                android:src=\"@drawable/ic_home\" />\n\n            <ImageView\n                android:id=\"@+id/BtnForward\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_weight=\"1\"\n                android:background=\"?android:attr/selectableItemBackground\"\n                android:contentDescription=\"@string/ContentDescriptionForwardButton\"\n                android:focusable=\"true\"\n                android:paddingBottom=\"8dip\"\n                android:paddingLeft=\"8dip\"\n                android:paddingRight=\"8dip\"\n                android:paddingTop=\"8dip\"\n                android:src=\"@drawable/ic_forward\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/SecondaryPanel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/TopPanel\"\n            android:layout_marginBottom=\"5dip\"\n            android:layout_marginLeft=\"12dip\"\n            android:layout_marginRight=\"12dip\"\n            android:layout_marginTop=\"10dip\"\n            android:scaleType=\"fitXY\"\n            android:weightSum=\"2\" >\n\n            <ImageView\n                android:id=\"@+id/BtnBookmarks\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginRight=\"5dip\"\n                android:layout_weight=\"1\"\n                android:background=\"@drawable/tab_panel_button\"\n                android:contentDescription=\"@string/ContentDescriptionBookmarksButton\"\n                android:focusable=\"true\"\n                android:paddingBottom=\"8dip\"\n                android:paddingLeft=\"8dip\"\n                android:paddingRight=\"8dip\"\n                android:paddingTop=\"8dip\"\n                android:src=\"@drawable/ic_bookmarks\" />\n\n            <ImageView\n                android:id=\"@+id/BtnAddTab\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginLeft=\"5dip\"\n                android:layout_weight=\"1\"\n                android:background=\"@drawable/tab_panel_button\"\n                android:contentDescription=\"@string/ContentDescriptionNewTabButton\"\n                android:focusable=\"true\"\n                android:paddingBottom=\"8dip\"\n                android:paddingLeft=\"8dip\"\n                android:paddingRight=\"8dip\"\n                android:paddingTop=\"8dip\"\n                android:src=\"@android:drawable/ic_menu_add\" />\n        </LinearLayout>\n\n        <org.tint.ui.views.TabsScroller\n            android:id=\"@+id/tabs_scroller\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_below=\"@+id/SecondaryPanel\" />\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/main_content\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:orientation=\"vertical\" >\n\n        <RelativeLayout\n            android:id=\"@+id/TopBar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?android:attr/actionBarSize\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_margin=\"0dip\"\n            android:background=\"@drawable/ab_solid_dark_holo\"\n            android:orientation=\"horizontal\"\n            android:padding=\"0dip\"\n            android:scaleType=\"fitXY\" >\n\n            <org.tint.ui.components.BadgedImageView\n                android:id=\"@+id/FaviconView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_alignParentLeft=\"true\"\n                android:background=\"?android:attr/selectableItemBackground\"\n                android:contentDescription=\"@string/ContentDescriptionFavicon\"\n                android:focusable=\"true\"\n                android:paddingBottom=\"5dip\"\n                android:paddingTop=\"5dip\"\n                android:src=\"@drawable/ic_tabs\" />\n\n            <org.tint.ui.views.PhoneUrlBar\n                android:id=\"@+id/UrlBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_toRightOf=\"@+id/FaviconView\" />\n        </RelativeLayout>\n\n        <FrameLayout\n            android:id=\"@+id/WebViewContainer\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_below=\"@+id/TopBar\"\n            android:background=\"#dcdcdc\"\n            android:orientation=\"vertical\" />\n\n        <ImageView\n            android:id=\"@+id/ExitFullScreen\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginBottom=\"10dip\"\n            android:layout_marginRight=\"10dip\"\n            android:contentDescription=\"@string/ContentDescriptionExitFullScreen\"\n            android:src=\"@drawable/ic_exit_fullscreen\"\n            android:visibility=\"gone\" />\n\n        <ProgressBar\n            android:id=\"@+id/WebViewProgress\"\n            style=\"@android:style/Widget.Holo.ProgressBar.Horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/TopBar\"\n            android:layout_marginLeft=\"0dip\"\n            android:layout_marginRight=\"0dip\"\n            android:layout_marginTop=\"-8dip\"\n            android:indeterminate=\"false\" />\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/phone_main_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n\n    <org.tint.ui.views.PanelLayout\n        android:id=\"@+id/panel_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/phone_start_page_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"0dip\"\n    android:paddingTop=\"0dip\" >\n\n    <GridView\n        android:id=\"@+id/StartPageFragmentGrid\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"@dimen/startpage_fragment_margin_top_bottom\"\n        android:layout_marginLeft=\"@dimen/startpage_fragment_margin_left_right\"\n        android:layout_marginRight=\"@dimen/startpage_fragment_margin_left_right\"\n        android:layout_marginTop=\"@dimen/startpage_fragment_margin_top_bottom\"\n        android:columnWidth=\"@dimen/startpage_fragment_column_width\"\n        android:gravity=\"center\"\n        android:horizontalSpacing=\"@dimen/startpage_fragment_horizontal_spacing\"\n        android:numColumns=\"auto_fit\"\n        android:stretchMode=\"columnWidth\"\n        android:verticalSpacing=\"@dimen/startpage_fragment_vertical_spacing\" >\n    </GridView>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/phone_url_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/UrlBarContainer\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\" >\n\n    <ImageView\n        android:id=\"@+id/ImagePrivateBrowsing\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentLeft=\"true\"\n        android:contentDescription=\"@string/ContentDescriptionPrivateBrowsingIndicator\"\n        android:gravity=\"center_vertical\"\n        android:paddingLeft=\"8dip\"\n        android:paddingRight=\"8dip\"\n        android:src=\"@drawable/ic_incognito_holo_dark\"\n        android:visibility=\"gone\" />\n\n    <RelativeLayout\n        android:id=\"@+id/UrlBarLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_toRightOf=\"@+id/ImagePrivateBrowsing\" >\n\n        <LinearLayout\n            android:id=\"@+id/UrlBarTitleLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerInParent=\"true\"\n            android:layout_toLeftOf=\"@+id/UrlBarGoStopReload\"\n            android:orientation=\"vertical\" >\n\n            <TextView\n                android:id=\"@+id/UrlBarTitle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:singleLine=\"true\"\n                android:text=\"\"\n                android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n            <TextView\n                android:id=\"@+id/UrlBarSubTitle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"5dip\"\n                android:ellipsize=\"end\"\n                android:singleLine=\"true\"\n                android:text=\"\"\n                android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/UrlBarUrlLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerInParent=\"true\"\n            android:layout_toLeftOf=\"@+id/UrlBarGoStopReload\"\n            android:visibility=\"invisible\"\n            android:orientation=\"horizontal\" >\n\n            <AutoCompleteTextView\n                android:id=\"@+id/UrlBarUrlEdit\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:hint=\"@string/UrlBarUrlHint\"\n                android:inputType=\"textUri\"\n                android:selectAllOnFocus=\"true\" >\n            </AutoCompleteTextView>\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/UrlBarGoStopReload\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toLeftOf=\"@+id/MenuButton\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            android:contentDescription=\"@string/ContentDescriptionGoStopReloadButton\"\n            android:focusable=\"true\"\n            android:paddingLeft=\"8dip\"\n            android:paddingRight=\"8dip\"\n            android:src=\"@drawable/ic_go\" />\n\n        <ImageView\n            android:id=\"@+id/MenuButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            android:contentDescription=\"@string/ContentDescriptionMenuButton\"\n            android:focusable=\"true\"\n            android:paddingLeft=\"8dip\"\n            android:paddingRight=\"8dip\"\n            android:src=\"@drawable/ic_menu_overflow\" />\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/search_engine_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"10dip\"\n    android:paddingRight=\"10dip\"\n    android:paddingTop=\"10dip\" >\n\n    <LinearLayout\n        android:id=\"@+id/DummyLayoutToSteelFuckingFocusOnUrlEditText\"\n        android:layout_width=\"0dip\"\n        android:layout_height=\"0dip\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:orientation=\"horizontal\" />\n\n    <TextView\n        android:id=\"@+id/SearchUrlText1\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:text=\"@string/SearchUrlDialogText1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <TextView\n        android:id=\"@+id/CurrentSearchEngine\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/SearchUrlText1\"\n        android:layout_marginTop=\"5dip\"\n        android:layout_marginBottom=\"5dip\"\n        android:gravity=\"center\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n    \n    <TextView\n        android:id=\"@+id/SearchUrlText2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/CurrentSearchEngine\"\n        android:text=\"@string/SearchUrlDialogText2\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <EditText\n        android:id=\"@+id/SearchUrlEditText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/SearchUrlText2\"\n        android:layout_marginTop=\"5dip\"\n        android:layout_marginBottom=\"5dip\"        \n        android:inputType=\"textUri\"\n        android:selectAllOnFocus=\"true\" />    \n\n    <ImageView\n        android:id=\"@+id/divider1\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/SearchUrlEditText\"\n        android:layout_marginTop=\"10dip\"\n        android:contentDescription=\"@string/ContentDescriptionDivider\"\n        android:scaleType=\"fitXY\"\n        android:src=\"?android:attr/dividerHorizontal\" />\n\n    <ExpandableListView\n        android:id=\"@+id/SearchUrlList\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_above=\"@+id/divider2\"\n        android:layout_below=\"@+id/divider1\" />\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignBottom=\"@+id/SearchUrlList\"\n        android:layout_below=\"@+id/divider1\"\n        android:layout_centerHorizontal=\"true\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\" >\n\n        <ProgressBar\n            android:id=\"@+id/SearchUrlProgressBar\"\n            style=\"?android:attr/progressBarStyleLarge\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/SearchUrlProgressText\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:paddingLeft=\"10dip\"\n            android:paddingRight=\"10dip\"\n            android:gravity=\"center\"\n            android:text=\"@string/SearchUrlConnecting\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n    </LinearLayout>\n    \n    <ImageView\n        android:id=\"@+id/divider2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_above=\"@+id/SearchUrlManualEdit\"\n        android:contentDescription=\"@string/ContentDescriptionDivider\"\n        android:scaleType=\"fitXY\"\n        android:src=\"?android:attr/dividerHorizontal\" />\n    \n    <TextView\n        android:id=\"@+id/SearchUrlManualEdit\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"        \n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginTop=\"10dip\"\n        android:layout_marginBottom=\"15dip\"\n        android:gravity=\"center\"        \n        android:text=\"@string/SearchUrlGetOnline\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/seekbar_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"5dip\" >\n\n    <TextView\n        android:id=\"@+id/SeekBarPreferenceTitle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n    <TextView\n        android:id=\"@+id/SeekBarPreferenceSummary\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <RelativeLayout\n        android:id=\"@+id/SeekBarLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"5dip\" >\n\n        <SeekBar\n            android:id=\"@+id/SeekBarPreferenceSeekBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_toLeftOf=\"@+id/SeekBarPreferenceValue\" />\n\n        <TextView\n            android:id=\"@+id/SeekBarPreferenceValue\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:paddingLeft=\"5dip\"\n            android:paddingRight=\"5dip\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/spinner_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingTop=\"15dip\"\n    android:paddingBottom=\"15dip\"\n    android:paddingLeft=\"5dip\"\n    android:paddingRight=\"5dip\"\n    android:orientation=\"vertical\" >\n\n    <Spinner\n        android:id=\"@+id/SpinnerPreferenceSpinner\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n    <EditText\n        android:id=\"@+id/SpinnerPreferenceEdit\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:inputType=\"text\" >\n    </EditText>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/ssl_exception_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:descendantFocusability=\"blocksDescendants\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/history_row_padding_top_bottom\"\n    android:paddingLeft=\"@dimen/history_row_padding_left_right\"\n    android:paddingRight=\"@dimen/history_row_padding_left_right\"\n    android:paddingTop=\"@dimen/history_row_padding_top_bottom\" >\n\n    <TextView\n        android:id=\"@+id/SslExceptionRow.Title\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n    <RelativeLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"        \n        android:paddingBottom=\"5dip\"\n        android:orientation=\"horizontal\" >\n\n        <TextView\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toLeftOf=\"@+id/SslExceptionRow.AllowSwitch\"\n            android:text=\"@string/Authorized\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <Switch\n            android:id=\"@+id/SslExceptionRow.AllowSwitch\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:paddingRight=\"5dip\"\n            android:text=\"\"\n            android:textOff=\"@string/No\"\n            android:textOn=\"@string/Yes\" />\n    </RelativeLayout>\n\n    <TextView\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:singleLine=\"false\"\n        android:text=\"@string/Reasons\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <TextView\n        android:id=\"@+id/SslExceptionRow.Reasons\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingLeft=\"15dip\"\n        android:singleLine=\"false\"\n        android:text=\"\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    <TextView\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"5dip\"\n        android:paddingBottom=\"5dip\"\n        android:singleLine=\"false\"\n        android:text=\"@string/SslExceptionWebsitesText\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/start_page_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:paddingTop=\"5dip\"\n\tandroid:paddingBottom=\"5dip\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:orientation=\"vertical\">\n\n\t<ImageView\n\t    android:id=\"@+id/BookmarkRow.Thumbnail\"\n\t    android:layout_height=\"wrap_content\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_gravity=\"center_vertical\"\n\t\tandroid:contentDescription=\"@string/ContentDescriptionBookmarkThumbnail\"\n\t\tandroid:src=\"@drawable/browser_thumbnail\" />\n\t\n\t<LinearLayout\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_marginTop=\"5dip\"\n\t\tandroid:layout_gravity=\"center_vertical\"\n\t\tandroid:orientation=\"horizontal\" >\n\t\n\t\t<ImageView\n\t        android:id=\"@+id/divider\"\n\t        android:layout_width=\"wrap_content\"\n\t        android:layout_height=\"fill_parent\"\n\t        android:paddingRight=\"5dip\"\n\t        android:scaleType=\"fitXY\"\n\t        android:contentDescription=\"@string/ContentDescriptionDivider\"\n\t        android:src=\"@drawable/divider_vertical_dark_opaque\" />\n\t\n\t\t<LinearLayout\n\t\t    android:layout_width=\"wrap_content\"\n\t\t    android:layout_height=\"wrap_content\"\n\t\t    android:layout_gravity=\"center_vertical\"\t\t    \n\t\t    android:orientation=\"vertical\" >\n\n\t\t    <TextView\n\t\t        android:id=\"@+id/StartPageRowTitle\"\n\t\t        android:layout_width=\"fill_parent\"\n\t\t        android:layout_height=\"wrap_content\"\n\t\t        android:layout_gravity=\"center_vertical\"\n\t\t        android:ellipsize=\"marquee\"\n\t\t        android:singleLine=\"true\"\n\t\t        android:text=\"\"\n\t\t        android:textAppearance=\"@style/RowSmallLight\" />\n\n\t\t    <TextView\n\t\t        android:id=\"@+id/StartPageRowUrl\"\n\t\t        android:layout_width=\"fill_parent\"\n\t\t        android:layout_height=\"wrap_content\"\n\t\t        android:ellipsize=\"marquee\"\n\t\t        android:singleLine=\"true\"\n\t\t        android:text=\"\"\n\t\t        android:textAppearance=\"@style/RowVerySmallLight\" />\n\n\t\t</LinearLayout>\n\t\n\t</LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/tab_view.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/main\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/nav_tab_bg\"\n    android:focusable=\"false\"\n    android:orientation=\"vertical\" >\n\n    <LinearLayout\n        android:id=\"@+id/titlebar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"32dip\"\n        android:layout_gravity=\"center_horizontal\"\n        android:orientation=\"horizontal\"\n        android:paddingLeft=\"8dip\" >\n\n        <TextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"0dip\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1.0\"\n            android:drawablePadding=\"8dip\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:lines=\"1\"\n            android:scrollHorizontally=\"true\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n        <ImageView\n            android:id=\"@+id/closetab\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            android:contentDescription=\"@string/ContentDescriptionCloseTabButton\"\n            android:paddingLeft=\"8dip\"\n            android:paddingRight=\"16dip\"\n            android:src=\"@drawable/ic_tab_close\" />\n    </LinearLayout>\n\n    <ImageView\n        android:id=\"@+id/tab_view\"\n        android:contentDescription=\"@string/ContentDescriptionTabPreview\"\n        android:layout_width=\"200dip\"\n        android:layout_height=\"120dip\"\n        android:focusable=\"false\"\n        android:paddingLeft=\"2dip\"\n        android:paddingRight=\"2dip\"\n        android:src=\"@drawable/start_page\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/tablet_main_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n\n    <FrameLayout\n        android:id=\"@+id/WebViewContainer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@+id/UrlBar\"\n        android:background=\"#dcdcdc\"\n        android:orientation=\"vertical\" />\n\n    <org.tint.ui.views.TabletUrlBar\n        android:id=\"@+id/UrlBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\" />\n\n    <ImageView\n        android:id=\"@+id/ExitFullScreen\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_marginRight=\"10dip\"\n        android:layout_marginBottom=\"10dip\"\n        android:contentDescription=\"@string/ContentDescriptionExitFullScreen\"\n        android:src=\"@drawable/ic_exit_fullscreen\"\n        android:visibility=\"gone\" />\n    \n    <ProgressBar\n        android:id=\"@+id/WebViewProgress\"\n        style=\"@android:style/Widget.Holo.ProgressBar.Horizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/UrlBar\"        \n        android:layout_marginLeft=\"0dip\"\n        android:layout_marginRight=\"0dip\"\n        android:layout_marginTop=\"-8dip\"\n        android:indeterminate=\"false\" >\n    </ProgressBar>\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/tablet_start_page_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingTop=\"0dip\"\n    android:paddingBottom=\"0dip\"    \n    android:orientation=\"vertical\" >\n\n    <GridView\n        android:id=\"@+id/StartPageFragmentGrid\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"@dimen/startpage_fragment_margin_top_bottom\"\n        android:layout_marginLeft=\"@dimen/startpage_fragment_margin_left_right\"\n        android:layout_marginRight=\"@dimen/startpage_fragment_margin_left_right\"\n        android:layout_marginTop=\"@dimen/startpage_fragment_margin_top_bottom\"        \n        android:gravity=\"center\"\n        android:numColumns=\"auto_fit\"\n        android:stretchMode=\"columnWidth\"\n        android:columnWidth=\"@dimen/startpage_fragment_column_width\"\n        android:horizontalSpacing=\"@dimen/startpage_fragment_horizontal_spacing\"\n        android:verticalSpacing=\"@dimen/startpage_fragment_vertical_spacing\" >\n\n    </GridView>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/tablet_url_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"    \n    android:background=\"@drawable/ab_solid_dark_holo\"\n    android:orientation=\"vertical\" >\n    \n    <LinearLayout\n        android:id=\"@+id/DummyLayoutToSteelFuckingFocusOnUrlEditText\"\n        android:layout_width=\"0dip\"\n        android:layout_height=\"0dip\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:orientation=\"horizontal\" />\n    \n    <LinearLayout\n        android:id=\"@+id/UrlBarLeftLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"horizontal\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignBottom=\"@+id/UrlBarUrlLayout\">\n        \n        <ImageView\n    \t    android:id=\"@+id/UrlBarGoBack\"\n    \t    android:layout_width=\"wrap_content\"\n    \t    android:layout_height=\"match_parent\"\n    \t    android:layout_gravity=\"center_vertical\"\n    \t    android:background=\"?android:attr/selectableItemBackground\"\n    \t    android:contentDescription=\"@string/ContentDescriptionBackButton\"\n    \t    android:focusable=\"true\"\n    \t    android:paddingLeft=\"8dip\"\n    \t    android:paddingRight=\"8dip\"\n    \t    android:src=\"@drawable/ic_back\" />\n        \n        <ImageView\n    \t    android:id=\"@+id/UrlBarGoForward\"\n    \t    android:layout_width=\"wrap_content\"\n    \t    android:layout_height=\"match_parent\"\n    \t    android:layout_gravity=\"center_vertical\"\n    \t    android:background=\"?android:attr/selectableItemBackground\"\n    \t    android:contentDescription=\"@string/ContentDescriptionForwardButton\"\n    \t    android:focusable=\"true\"\n    \t    android:paddingLeft=\"8dip\"\n    \t    android:paddingRight=\"8dip\"\n    \t    android:src=\"@drawable/ic_forward\" />\n        \n        <ImageView\n    \t    android:id=\"@+id/UrlBarHome\"\n    \t    android:layout_width=\"wrap_content\"\n    \t    android:layout_height=\"match_parent\"\n    \t    android:layout_gravity=\"center_vertical\"\n    \t    android:background=\"?android:attr/selectableItemBackground\"\n    \t    android:contentDescription=\"@string/ContentDescriptionHomeButton\"\n    \t    android:focusable=\"true\"\n    \t    android:paddingLeft=\"8dip\"\n    \t    android:paddingRight=\"8dip\"\n    \t    android:src=\"@drawable/ic_home\" />\n        \n    </LinearLayout>\n        \n    <LinearLayout\n        android:id=\"@+id/UrlBarUrlLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        android:paddingTop=\"5dip\"\n    \tandroid:paddingBottom=\"3dip\"\n        android:layout_toRightOf=\"@+id/UrlBarLeftLayout\"\n        android:layout_toLeftOf=\"@+id/UrlBarRightLayout\">\n        \n    \t<AutoCompleteTextView\n        \tandroid:id=\"@+id/UrlBarUrlEdit\"\n        \tandroid:layout_width=\"match_parent\"\n        \tandroid:layout_height=\"wrap_content\"\n        \tandroid:hint=\"@string/UrlBarUrlHint\"\n        \tandroid:inputType=\"textUri\"\n        \tandroid:selectAllOnFocus=\"true\" >\n    \t</AutoCompleteTextView>    \t    \t\n    \t\n\t</LinearLayout>    \n\t\n    <LinearLayout\n        android:id=\"@+id/UrlBarRightLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"horizontal\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignBottom=\"@+id/UrlBarUrlLayout\">\n    \t\n        <ImageView\n            android:id=\"@+id/UrlBarGoStopReload\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            android:contentDescription=\"@string/ContentDescriptionGoStopReloadButton\"\n            android:focusable=\"true\"\n            android:paddingLeft=\"8dip\"\n            android:paddingRight=\"8dip\"\n            android:src=\"@drawable/ic_go\" />\n        \n        <ImageView\n    \t    android:id=\"@+id/UrlBarBookmarks\"\n    \t    android:layout_width=\"wrap_content\"\n    \t    android:layout_height=\"match_parent\"\n    \t    android:layout_gravity=\"center_vertical\"\n    \t    android:background=\"?android:attr/selectableItemBackground\"\n    \t    android:contentDescription=\"@string/ContentDescriptionBookmarksButton\"\n    \t    android:focusable=\"true\"\n    \t    android:paddingLeft=\"8dip\"\n    \t    android:paddingRight=\"8dip\"\n    \t    android:src=\"@drawable/ic_bookmarks\" />\n    \t\n\t</LinearLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/url_autocomplete_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"    \n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:descendantFocusability=\"blocksDescendants\" >\n\n    <ImageView\n        android:id=\"@+id/AutocompleteImageView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"fill_parent\"\n        android:layout_alignParentLeft=\"true\"        \n        android:layout_alignBottom=\"@+id/AutocompleteContainer\"\n        android:paddingLeft=\"5dip\"\n        android:layout_margin=\"5dip\"\n        android:contentDescription=\"@string/ContentDescriptionSuggestionIcon\" >\n    </ImageView>\n\n    <LinearLayout\n        android:id=\"@+id/AutocompleteContainer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_toLeftOf=\"@+id/AutoCompleteQueryBuilder\"\n        android:layout_toRightOf=\"@+id/AutocompleteImageView\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:id=\"@+id/AutocompleteTitle\"\n            android:text=\"\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"5dip\"\n            android:layout_marginRight=\"5dip\"\n            android:layout_marginTop=\"5dip\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n        <TextView\n            android:id=\"@+id/AutocompleteUrl\"\n            android:text=\"\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"5dip\"\n            android:layout_marginLeft=\"5dip\"\n            android:layout_marginRight=\"5dip\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"            \n            android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n\n    </LinearLayout>\n    \n    <ImageView\n        android:id=\"@+id/AutoCompleteQueryBuilder\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignBottom=\"@+id/AutocompleteContainer\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_toRightOf=\"@+id/AutocompleteUrl\"\n        android:background=\"?android:attr/selectableItemBackground\"\n        android:contentDescription=\"@string/ContentDescriptionAutocompleteQueryBuilder\"\n        android:focusable=\"true\"\n        android:paddingLeft=\"8dip\"\n        android:paddingRight=\"8dip\"\n        android:src=\"@drawable/ic_querybuilder\" />\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/video_loading_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n         android:orientation=\"vertical\"\n         android:layout_centerInParent=\"true\"\n         android:layout_width=\"wrap_content\"\n         android:layout_height=\"wrap_content\">\n\n       <ProgressBar android:id=\"@android:id/progress\"\n           style=\"?android:attr/progressBarStyleLarge\"\n           android:layout_gravity=\"center\"\n           android:layout_width=\"wrap_content\"\n           android:layout_height=\"wrap_content\" />\n\n       <TextView android:paddingTop=\"5dip\"\n           android:layout_width=\"wrap_content\"\n           android:layout_height=\"wrap_content\"\n           android:layout_gravity=\"center\"\n           android:text=\"@string/VideoLoading\"\n           android:textSize=\"14sp\"\n           android:textColor=\"?android:attr/textColorPrimary\" />\n </LinearLayout>"
  },
  {
    "path": "res/layout/websites_settings_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n\n    <ListView\n        android:id=\"@android:id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n    \n    <TextView android:id=\"@android:id/empty\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_horizontal\"\n        android:layout_gravity=\"center_vertical\"\n        android:text=\"@string/WebsitesSettingsEmpty\"/>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/websites_settings_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingTop=\"5dip\"\n    android:paddingBottom=\"5dip\"\n    android:orientation=\"horizontal\" >\n    \n    <ImageView\n        android:id=\"@+id/WebsitesSettingsIcon\"\n        android:layout_width=\"32dip\"\n        android:layout_height=\"32dip\"\n        android:layout_marginLeft=\"0dip\"\n        android:layout_marginRight=\"8dip\"\n        android:layout_marginTop=\"8dip\"\n        android:layout_marginBottom=\"8dip\"        \n        android:padding=\"2dip\"\n        android:gravity=\"center_vertical\"\n\t\tandroid:scaleType=\"fitXY\"\n\t\tandroid:contentDescription=\"@string/ContentDescriptionFavicon\"\n        android:src=\"@drawable/app_web_browser_sm\" \n        android:background=\"@drawable/bookmark_list_favicon_bg\" />\n    \n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:orientation=\"vertical\" >\n\n    \t<TextView\n    \t    android:id=\"@+id/WebsitesSettingsTitle\"\n    \t    android:layout_width=\"wrap_content\"\n    \t    android:layout_height=\"wrap_content\"\n    \t    android:text=\"\"\n    \t    android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n    \t\n    \t<TextView\n    \t    android:id=\"@+id/WebsitesSettingsSubTitle\"\n    \t    android:layout_width=\"wrap_content\"\n    \t    android:layout_height=\"wrap_content\"\n    \t    android:text=\"\"\n    \t    android:textAppearance=\"?android:attr/textAppearanceSmall\" />\n    \n    </LinearLayout>\n\n    <LinearLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:gravity=\"right\"        \n        android:orientation=\"horizontal\" >\n    \t\n    \t<ImageView\n            android:id=\"@+id/WebsitesSettingsLocationIcon\"\n            android:layout_width=\"32dip\"\n            android:layout_height=\"32dip\"\n            android:padding=\"2dip\"\n            android:contentDescription=\"@string/ContentDescriptionWebsiteSettingsLocation\" />\n\n        <ImageView\n            android:id=\"@+id/WebsitesSettingsUsageIcon\"\n            android:layout_width=\"32dip\"\n            android:layout_height=\"32dip\"\n            android:padding=\"2dip\"\n            android:contentDescription=\"@string/ContentDescriptionWebsiteSettingsUsage\" />\n\n        <ImageView\n            android:id=\"@+id/WebsitesSettingsFeatureIcon\"\n            android:layout_width=\"32dip\"\n            android:layout_height=\"32dip\"\n            android:padding=\"2dip\"\n            android:contentDescription=\"@string/ContentDescriptionWebsiteSettingsFeature\" />\n    \n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/webview_container_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"    \n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" />"
  },
  {
    "path": "res/layout/webview_dialog_preference.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\" >\n\n    <WebView\n        android:id=\"@+id/PreferenceWebView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>"
  },
  {
    "path": "res/layout/yes_no_remember_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"    \n    android:orientation=\"vertical\" >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:padding=\"15dip\" >\n\n        <TextView\n            android:id=\"@+id/DialogMessage\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"15dip\"\n            android:text=\"\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n        <CheckBox\n            android:id=\"@+id/DialogRemember\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/RememberMyChoice\" />\n    </LinearLayout>\n\n    <ImageView\n        android:id=\"@+id/divider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:contentDescription=\"@string/ContentDescriptionDivider\"\n        android:scaleType=\"fitXY\"\n        android:src=\"?android:attr/dividerHorizontal\" />\n\n    <LinearLayout\n        style=\"?android:attr/buttonBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" >\n\n        <Button\n            android:id=\"@+id/DialogNegativeButton\"\n            style=\"?android:attr/buttonBarButtonStyle\"\n            android:layout_width=\"0dip\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"right\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"2\"\n            android:text=\"@string/No\" />\n\n        <Button\n            android:id=\"@+id/DialogPositiveButton\"\n            style=\"?android:attr/buttonBarButtonStyle\"\n            android:layout_width=\"0dip\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"right\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"2\"\n            android:text=\"@string/Yes\" />\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/layout-sw600dp/history_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:baselineAligned=\"false\"\n    android:orientation=\"horizontal\" >\n    \n    <LinearLayout\n        android:id=\"@+id/history_group\"\n        android:layout_width=\"0px\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginBottom=\"32dp\"\n        android:layout_marginLeft=\"@dimen/tablet_history_fragment_header_margin_left\"\n        android:layout_marginRight=\"0dp\"\n        android:layout_marginTop=\"32dp\"\n        android:layout_weight=\"10\"\n        android:orientation=\"vertical\" >\n\n        <ListView\n            android:id=\"@+id/history_group_list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:cacheColorHint=\"@android:color/transparent\"\n            android:drawSelectorOnTop=\"false\"\n            android:listPreferredItemHeight=\"48dp\"\n            android:scrollbarAlwaysDrawVerticalTrack=\"true\" />\n        \n    </LinearLayout>    \n    \n    <LinearLayout        \n        android:layout_width=\"0px\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:layout_marginLeft=\"0dip\"\n        android:layout_marginRight=\"@dimen/tablet_history_fragment_values_margin_right\"        \n        android:layout_weight=\"20\"\n        android:background=\"?android:attr/detailsElementBackground\"\n        android:orientation=\"vertical\" >\n        \n        <android.app.FragmentBreadCrumbs\n                android:id=\"@+id/history_child_breadcrumbs\"\n                android:layout_height=\"72dip\"\n                android:layout_width=\"match_parent\"\n                android:paddingTop=\"16dip\"\n                android:paddingBottom=\"8dip\"\n                android:gravity=\"center_vertical|left\"\n                android:layout_marginLeft=\"32dip\"\n                android:layout_marginRight=\"48dip\"\n                />\n        \n        <ImageView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dip\"\n            android:paddingLeft=\"32dip\"\n            android:paddingRight=\"32dip\"\n            android:contentDescription=\"@string/ContentDescriptionDivider\"\n            android:src=\"#404040\" />\n        \n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" >\n\n            <ListView\n                android:id=\"@+id/history_child_list\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:cacheColorHint=\"@android:color/transparent\"\n                android:drawSelectorOnTop=\"false\"\n                android:listPreferredItemHeight=\"48dp\"\n                android:paddingLeft=\"32dip\"\n                android:paddingRight=\"32dip\"\n                android:scrollbarAlwaysDrawVerticalTrack=\"true\" />\n\n            <ProgressBar\n                android:id=\"@+id/HistoryProgressBar\"\n                style=\"?android:attr/progressBarStyleLarge\"\n                android:layout_centerInParent=\"true\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n            \n        </RelativeLayout>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "res/menu/bookmarks_activity_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item\n\t    android:id=\"@+id/BookmarksActivityMenuAddBookmark\"\n\t    android:title=\"@string/AddBookmark\"\n\t    android:icon=\"@drawable/ic_add_bookmark\"\n\t    android:showAsAction=\"ifRoom|withText\" />\n    \n    <item\n\t    android:id=\"@+id/BookmarksActivityMenuSortBookmarks\"\n\t    android:title=\"@string/SortBookmarks\" />\n    \n    <item\n\t    android:id=\"@+id/BookmarksActivityMenuImportHistoryBookmarks\"\n\t    android:title=\"@string/ImportHistoryBookmarks\" />\n    \n    <item\n\t    android:id=\"@+id/BookmarksActivityMenuExportHistoryBookmarks\"\n\t    android:title=\"@string/ExportHistoryBookmarks\" />\n    \n    <item\n\t    android:id=\"@+id/BookmarksActivityMenuClearHistoryBookmarks\"\n\t    android:title=\"@string/ClearHistoryBookmarks\" />    \n    \n    <group\n        android:id=\"@+id/BookmarksActivity.AddonsMenuGroup\" />\n\n</menu>"
  },
  {
    "path": "res/menu/main_activity_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >        \n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuAddBookmark\"\n\t    android:title=\"@string/AddBookmark\"\n\t    android:icon=\"@drawable/ic_add_bookmark\"/>\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuBookmarks\"\n\t    android:title=\"@string/Bookmarks\"\n\t    android:icon=\"@drawable/ic_bookmarks\"/>\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuIncognitoTab\"\n\t    android:title=\"@string/IncognitoTab\"\n\t    android:icon=\"@drawable/ic_incognito_holo_dark\" \n\t    android:checkable=\"true\" />\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuFullScreen\"\n\t    android:title=\"@string/FullScreen\" \n\t    android:checkable=\"true\" />\n    \n    <group android:id=\"@+id/MainActivity.DisabledOnStartPageMenuGroup\">\n    \t<item\n    \t    android:id=\"@+id/MainActivity.MenuSharePage\"\n    \t    android:icon=\"@android:drawable/ic_menu_share\"\n    \t    android:title=\"@string/SharePage\"/>\n    \t<item\n    \t    android:id=\"@+id/MainActivity.MenuSearch\"\n    \t    android:icon=\"@android:drawable/ic_menu_search\"\n    \t    android:title=\"@string/Search\"/>\n    </group>\n    \n    <group\n        android:id=\"@+id/MainActivity.AddonsMenuGroup\"\n        android:orderInCategory=\"1\" />\n    \n\t<item\n\t    android:id=\"@+id/MainActivity.MenuPreferences\"\n\t    android:title=\"@string/Preferences\"\n\t    android:icon=\"@android:drawable/ic_menu_preferences\"\n\t    android:orderInCategory=\"2\" />\n    \n</menu>"
  },
  {
    "path": "res/menu/main_activity_menu_tablet.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item\n\t    android:id=\"@+id/MainActivity.MenuCloseTab\"\n\t    android:title=\"@string/CloseTab\"\n\t    android:icon=\"@android:drawable/ic_menu_close_clear_cancel\"\n\t    android:showAsAction=\"always\" />\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuAddTab\"\n\t    android:title=\"@string/NewTab\"\n\t    android:icon=\"@android:drawable/ic_menu_add\"\n\t    android:showAsAction=\"always\" />\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuAddBookmark\"\n\t    android:title=\"@string/AddBookmark\"\n\t    android:icon=\"@drawable/ic_add_bookmark\"/>\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuBookmarks\"\n\t    android:title=\"@string/Bookmarks\"\n\t    android:icon=\"@drawable/ic_bookmarks\"/>\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuIncognitoTab\"\n\t    android:title=\"@string/IncognitoTab\"\n\t    android:icon=\"@drawable/ic_incognito_holo_dark\" \n\t    android:checkable=\"true\" />\n    \n    <item\n\t    android:id=\"@+id/MainActivity.MenuFullScreen\"\n\t    android:title=\"@string/FullScreen\" \n\t    android:checkable=\"true\" />\n    \n    <group android:id=\"@+id/MainActivity.DisabledOnStartPageMenuGroup\">\n    \t<item\n    \t    android:id=\"@+id/MainActivity.MenuSharePage\"\n    \t    android:icon=\"@android:drawable/ic_menu_share\"\n    \t    android:title=\"@string/SharePage\"/>\n    \t<item\n    \t    android:id=\"@+id/MainActivity.MenuSearch\"\n    \t    android:icon=\"@android:drawable/ic_menu_search\"\n    \t    android:title=\"@string/Search\"/>\n    </group>\n    \n    <group\n        android:id=\"@+id/MainActivity.AddonsMenuGroup\"\n        android:orderInCategory=\"1\" />\n    \n\t<item\n\t    android:id=\"@+id/MainActivity.MenuPreferences\"\n\t    android:title=\"@string/Preferences\"\n\t    android:icon=\"@android:drawable/ic_menu_preferences\"\n\t    android:orderInCategory=\"2\" />\n    \n</menu>"
  },
  {
    "path": "res/raw/changelog_html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<style>\n\t\t* {\n\t\t\tfont-size: 95%;\n\t\t}\n\t\tbody {\n\t\t\tfont-family: sans-serif;\n\t\t}\n\t\tul.header {\n\t\t\tpadding: 0 1em 0 1em ;\n\t\t\tmargin: 0 1em 0 1em;\n\t\t}\n\t\tul.details {\n\t\t\tbackground-color: #eee;\n\t\t\tpadding: 1em 2.5em 1em 2.5em;\n\t\t\tmargin: .5em 0 .5em 0;\n\t\t}\n\t\tul.details>li {\n\t\t\tfont-family: monospace;\n\t\t\twhite-space: pre-wrap;\n\t\t\tmargin: .2em 0 .2em 0;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<ul class=\"header\">\n\t\t<li>Version 1.8\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Fix file select dialog not opening.</li>\n\t\t\t\t<li>Added download confirmation dialog.</li>\t\t\t\t\n\t\t\t\t<li>\"Incognito by default\" option.</li>\n\t\t\t\t<li>Cookies are now sent with download requests.</li>\n\t\t\t\t<li>Ability to redirect JS logs to logcat.</li>\n\t\t\t\t<li>Images can be opened in a new tab through the context menu.</li>\n\t\t\t\t<li>Back key return to the start page if no browsing history (if the start page is used).</li>\n\t\t\t\t<li>Spanish, Japanese, and Simplified Chinese translations.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.7\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>New user interface for phones. The legacy one is still available under preferences.</li>\n\t\t\t\t<li>Opened tabs can now be restored at start-up.</li>\n\t\t\t\t<li>New preference to choose user interface type.</li>\n\t\t\t\t<li>Various bug fix.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.6.1\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Fix FC when opening a tab in background on tablets.</li>\n\t\t\t\t<li>Hide application instead of finishing it on back pressed.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.6\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>New export format for bookmarks and history; Bookmarks folders are now handled in export and import; Old format still supported for import.</li>\n\t\t\t\t<li>Full screen mode.</li>\n\t\t\t\t<li>UI improvements for 7in tablets.</li>\n\t\t\t\t<li>German translation (thanks to Lars-Dominik).</li>\n\t\t\t\t<li>Russian translation (thanks to Anton).</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.5\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>User choice for SSL security exceptions can now be saved on a per-website basis.</li>\n\t\t\t\t<li>Better search engine customization.</li>\n\t\t\t\t<li>Handle search key on devices which has one.</li>\n\t\t\t\t<li>Bookmarks can now be sorted in three ways (Most used, Alphabetically, Most recently visited).</li>\n\t\t\t\t<li>Portuguese translation (thanks to Rui).</li>\n\t\t\t\t<li>Various bug fixes.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.4\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Add accessibility settings: minimum font size, text scaling, and inverted screen rendering.</li>\n\t\t\t\t<li>Add progress bar when loading history and bookmarks.</li>\n\t\t\t\t<li>On url suggestions, add a button to paste the suggested url in the url bar, without loading it.</li>\n\t\t\t\t<li>On phones, tab switching use a quick fade in/out animation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.3\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Folders can be created in bookmarks.</li>\n\t\t\t\t<li>Various minor improvements in layouts.</li>\n\t\t\t\t<li>Fix some force close.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.2\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Incognito mode.</li>\n\t\t\t\t<li>Open links in background.</li>\n\t\t\t\t<li>Various bug fixes (tabs are no longer lost when docking/undocking keyboard on Asus Transformer(s), ...).</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.1\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Long-click on image links now work as intended.</li>\n\t\t\t\t<li>Stop plugins when closing a tab.</li>\n\t\t\t\t<li>Keyboard no longer hide along with toolbar during a search in phone mode.</li>\n\t\t\t\t<li>Deleting items in history no longer bring back to the first section.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Version 1.0\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Initial release.</li>\n\t\t\t</ul>\n\t\t</li>\n\t</ul>\n</body>\n</html>"
  },
  {
    "path": "res/raw/contributors_html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<style>\n\t\t* {\n\t\t\tfont-size: 95%;\n\t\t}\n\t\tbody {\n\t\t\tfont-family: sans-serif;\n\t\t}\n\t\tul.header {\n\t\t\tpadding: 0 1em 0 1em ;\n\t\t\tmargin: 0 1em 0 1em;\n\t\t}\n\t\tul.details {\n\t\t\tbackground-color: #eee;\n\t\t\tpadding: 1em 2.5em 1em 2.5em;\n\t\t\tmargin: .5em 0 .5em 0;\n\t\t}\n\t\tul.details>li {\n\t\t\tfont-family: monospace;\n\t\t\twhite-space: pre-wrap;\n\t\t\tmargin: .2em 0 .2em 0;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<ul class=\"header\">\n\t\t<li>Dorian 'gravgun' Wouters\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Features &amp; fixes.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Rui\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Portuguese translation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Lars-Dominik\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>German translation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Anton\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Russian translation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Xphnx\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Spanish translation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Pikatenor\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Japanese translation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>JingYunLiu\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Simplified Chinese translation.</li>\n\t\t\t</ul>\n\t\t</li>\n\t</ul>\n</body>\n</html>"
  },
  {
    "path": "res/raw/licenses_html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<style>\n\t\t* {\n\t\t\tfont-size: 95%;\n\t\t}\n\t\tbody {\n\t\t\tfont-family: sans-serif;\n\t\t}\n\t\tul.header {\n\t\t\tpadding: 0 1em 0 1em ;\n\t\t\tmargin: 0 1em 0 1em;\n\t\t}\n\t\tul.details {\n\t\t\tbackground-color: #eee;\n\t\t\tpadding: 1em 2.5em 1em 2.5em;\n\t\t\tmargin: .5em 0 .5em 0;\n\t\t}\n\t\tul.details>li {\n\t\t\tfont-family: monospace;\n\t\t\twhite-space: pre-wrap;\n\t\t\tmargin: .2em 0 .2em 0;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<ul class=\"header\">\n\t\t<li>Application icon\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Designed by Brsev under CC BY-NC-ND 3.0.</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<li>Exit full screen icon\n\t\t\t<ul class=\"details\">\n\t\t\t\t<li>Designed by Olyn LeRoy from The Noun Project.</li>\n\t\t\t</ul>\n\t\t</li>\n\t</ul>\n</body>\n</html>"
  },
  {
    "path": "res/raw/phone_tutorial_html",
    "content": "<!DOCTYPE html >\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\" />\n\t<title>Tutorial</title>\n\t<style>\n\t\t* {\n\t\t\tfont-size: 95%;\n\t\t}\n\t\tbody {\n\t\t\tfont-family: sans-serif;\n\t\t}\n\t\t.details {\n\t\t\tfont-size: 90%;\n\t\t\tbackground-color: #eee;\n\t\t\tpadding: 1em 1.5em 1em 1.5em;\n\t\t\tmargin: .5em 0 .5em 0;\n\t\t}\n\t\t.center {\n\t\t\ttext-align: center;\n\t\t}\n\t\timg {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 auto;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<h3 class=\"center\">Welcome to Tint Browser</h3>\n\t<ul>\n\t<li>Touch the top-left icon to open the side panel, wich give access to the list of opened tabs.</li>\n\t</ul>\n\t<img src=\"button.png\" />\n\t<ul>\n\t<li>Alternatively, you can open the side panel by dragging the left edge of the browser.</li>\n\t</ul>\n\t<img src=\"slide_panel.png\" />\n\t<ul>\n\t<li>Close a tab by clicking on its close icon, or swipe it left or right.</li>\n\t</ul>\n\t<img src=\"close_tab.png\" />\n\t<p class=\"details\">If you miss the previous user interface for phones, you can still enable it through preferences.</p>\n</body>\n</html>"
  },
  {
    "path": "res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n    \n\t<declare-styleable name=\"TabletMode\">\n    \t<attr name=\"tabletMode\" format=\"boolean\" />\n\t</declare-styleable>\n\t\n\t<declare-styleable name=\"SeekBarPreference\">\n    \t<attr name=\"android:defaultValue\" />\n    \t<attr name=\"minValue\" format=\"integer\" />\n    \t<attr name=\"maxValue\" format=\"integer\" />\n    \t<attr name=\"stepValue\" format=\"integer\" />\n    \t<attr name=\"symbol\" format=\"string\" />\n\t</declare-styleable>\n\t\n\t<declare-styleable name=\"WebViewDialogPreference\">\n\t    <attr name=\"html\" format=\"string\" />\n\t</declare-styleable>\t\n    \n</resources>"
  },
  {
    "path": "res/values/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <bool name=\"isTablet\">false</bool>\n</resources>\n"
  },
  {
    "path": "res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <color name=\"bookmarkListFaviconBackground\">#23ffffff</color>\n\n</resources>"
  },
  {
    "path": "res/values/dimensions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <dimen name=\"list_favicon_padding\">5dip</dimen>\n    <dimen name=\"list_favicon_corner_radius\">3dip</dimen>\n    \n    <dimen name=\"bookmarks_fragment_margin_top_bottom\">10dip</dimen>\n    <dimen name=\"bookmarks_fragment_margin_left_right\">10dip</dimen>\n    <dimen name=\"bookmarks_fragment_breadcrumb_margin_left_right\">5dip</dimen>\n    \n    <dimen name=\"bookmarks_fragment_column_width\">90dip</dimen>\n    <dimen name=\"bookmarks_fragment_vertical_spacing\">10dip</dimen>\n    <dimen name=\"bookmarks_fragment_horizontal_spacing\">10dip</dimen>\n    \n    <dimen name=\"startpage_fragment_margin_top_bottom\">5dip</dimen>\n    <dimen name=\"startpage_fragment_margin_left_right\">10dip</dimen>\n    \n    <dimen name=\"startpage_fragment_column_width\">90dip</dimen>\n    <dimen name=\"startpage_fragment_vertical_spacing\">5dip</dimen>\n    <dimen name=\"startpage_fragment_horizontal_spacing\">10dip</dimen>\n    \n    <dimen name=\"history_row_padding_left_right\">0dip</dimen>\n    <dimen name=\"history_row_padding_top_bottom\">5dip</dimen>\n</resources>\n"
  },
  {
    "path": "res/values/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    \n    <integer name=\"default_start_page_items_number\">9</integer>\n    \n    <integer name=\"favicon_size\">20</integer>\n    <integer name=\"application_button_size\">50</integer>\n    \n    <integer name=\"tab_title_length\">30</integer>\n    \n</resources>\n"
  },
  {
    "path": "res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Tint Browser is an open-source browser for Android.</string>\n    \n    <string name=\"AboutVersionText\">Version: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">License: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    \n    <string name=\"PermissionReadBookmarksLabel\">Read Tint Browser bookmarks</string>\n    <string name=\"PermissionReadBookmarksDescription\">Allow third-party applications or addons to read Tint Browser\\'s history and bookmarks database.</string>\n    \n\t<string name=\"PermissionWriteBookmarksLabel\">Write Tint Browser bookmarks</string>\n    <string name=\"PermissionWriteBookmarksDescription\">Allow third-party applications or addons to write Tint Browser\\'s history and bookmarks database.</string>    \n    \n    <string name=\"PermissionBindAddonServiceLabel\">Bind Tint Browser addons services</string>\n    <string name=\"PermissionBindAddonServiceDescription\">Allow an application to bind to Tint Browser\\'s addons services. Only Tint Browser itself should have this permission.</string>\n    \n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Cancel</string>\n    <string name=\"Yes\">Yes</string>\n    <string name=\"No\">No</string>\n    <string name=\"On\">ON</string>\n    <string name=\"Off\">OFF</string>\n    <string name=\"Clear\">Clear</string>\n    <string name=\"Continue\">Continue</string>\n    <string name=\"Proceed\">Proceed</string>\n    <string name=\"VideoLoading\">Loading video\\u2026</string>\n    <string name=\"History\">History</string>\n    <string name=\"All\">All</string>\n    <string name=\"Bookmarks\">Bookmarks</string>\n    <string name=\"Preferences\">Settings</string>\n    \n    <string name=\"UrlBarUrlDefaultSubTitle\">Tap to enter an URL or a search.</string>\n    <string name=\"UrlBarUrlHint\">Enter a search or an URL</string>\n    \n    <string name=\"ShareChooserTitle\">Share via</string>\n    <string name=\"FileChooserPrompt\">Choose file for upload</string>\n    \n    <string name=\"Download\">Download</string>\n    <string name=\"DownloadDialogTitle\">Download</string>\n    <string name=\"DownloadInIncognito\">Incognito download</string>\n    <string name=\"DownloadStart\">Downloading %1$s&#8230;</string>\n    <string name=\"DownloadComplete\">Download complete.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">Download failed: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Disk error, check if you have a storage media, and if it has enough space left.</string>\n    <string name=\"DownloadErrorHttp\">HTTP error</string>\n    <string name=\"DownloadErrorRedirection\">Too many redirections</string>\n    <string name=\"DownloadErrorUnknown\">Unknown error</string>\n    \n    <string name=\"ContextMenuOpen\">Open</string>\n    <string name=\"ContextMenuOpenNewTab\">Open in a new tab</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Copy link URL</string>\n    <string name=\"ContextMenuDownload\">Download</string>\n    <string name=\"ContextMenuShareLinkUrl\">Share link</string>\n    \n    <string name=\"ContextMenuViewImage\">View image</string>\n    <string name=\"ContextMenuCopyImageUrl\">Copy image url</string>\n    <string name=\"ContextMenuDownloadImage\">Download image</string>\n    <string name=\"ContextMenuShareImageUrl\">Share image</string>\n    \n    <string name=\"ContextMenuSendEmail\">Send email</string>\n    <string name=\"ContextMenuCopyEmailUrl\">Copy email url</string>\n    <string name=\"ContextMenuShareEmailUrl\">Share email</string>\n    \n    <string name=\"UrlCopyToastMessage\">Url copied to clipboard.</string>\n    <string name=\"ContextMenuShareUrl\">Share</string>\n    \n    <string name=\"JavaScriptAlertDialog\">JavaScript alert dialog</string>\n    <string name=\"JavaScriptConfirmDialog\">JavaScript confirm dialog</string>\n    <string name=\"JavaScriptPromptDialog\">JavaScript prompt dialog</string>    \n\t\n\t<string name=\"SslWarning\">Security warning</string>\n\t<string name=\"SslWarningsHeader\">There are problems with the security certificate for this site (%s).</string>\n\t<string name=\"SslUntrusted\">This certificate is not from a trusted authority.</string>\n\t<string name=\"SslIDMismatch\">The name of the site does not match the name on the certificate.</string>\n\t<string name=\"SslExpired\">This certificate has expired.</string>\n\t<string name=\"SslNotYetValid\">This certificate is not valid yet.</string>    \n        \n    <string name=\"NewTab\">New tab</string>\n        \n    <string name=\"CloseTab\">Close current tab</string>\n    <string name=\"AddBookmark\">Add bookmark</string>\n    <string name=\"SharePage\">Share page</string>\n    <string name=\"Search\">Find on page</string>\n    \n    <string name=\"BookmarksTitle\">Bookmarks &amp; History</string>\n    <string name=\"BookmarksTabTitle\">Bookmarks</string>\n    <string name=\"HistoryTabTitle\">History</string>\n    \n    <string name=\"ImportHistoryBookmarks\">Import</string>\n    <string name=\"ExportHistoryBookmarks\">Export</string>\n    <string name=\"ClearHistoryBookmarks\">Clear</string>\n    \n    <string name=\"AddBookmarkTitle\">Add bookmark</string>\n    <string name=\"BookmarkText\">Label</string>\n    <string name=\"UrlText\">Address</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Please provide a valid label and url.</string>\n    \n    <string name=\"OpenInTab\">Open in a new tab</string>\n    <string name=\"EditBookmark\">Edit bookmark</string>\n    <string name=\"CopyUrl\">Copy url</string>\n    <string name=\"DeleteBookmark\">Delete bookmark</string>\n    <string name=\"DeleteHistoryItem\">Delete from history</string>\n    \n    <string name=\"PreferencesActivityTitle\">Settings</string>\n        \n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">General settings</string>\n    \n    <string name=\"PreferenceGeneralHomepageTitle\">Home page</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Set the home page to load when opening a new tab, etc.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Home page</string>\n    \n    <string name=\"PreferenceGeneralSearchUrlTitle\">Search engine</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Set the search engine used to make default search from the url bar.</string>\n    \n    <string name=\"PreferenceCategoryStartPageTitle\">Start page</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Number of items in the start page</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Set the number of items to show in the start page.</string>\n    \n    <string name=\"PreferenceCategoryUITitle\">User interface</string>\n        \n    <string name=\"PreferenceBubblePositionTitle\">Bubble position</string>\n    <string name=\"PreferenceBubblePositionSummary\">Position of the bubble allowing to show the toolbars.</string>\n    \n    <string name=\"PreferenceBubblePositionRight\">Right</string>\n    <string name=\"PreferenceBubblePositionLeft\">Left</string>\n    <string name=\"PreferenceBubblePositionBoth\">Both</string>\n    \n    <string-array name=\"PreferenceBubblePositionEntries\">\n\t\t<item>@string/PreferenceBubblePositionRight</item>\n\t\t<item>@string/PreferenceBubblePositionLeft</item>\n\t\t<item>@string/PreferenceBubblePositionBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceBubblePositionValues\">\n\t\t<item>RIGHT</item>\n\t\t<item>LEFT</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Toolbars display duration</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Set how long toolbars are shown, in seconds.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodTitle\">Switch tabs method</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Set how you can switch between tabs.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodButtons\">Buttons</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Fling</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Both</string>\n    \n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n\t\t<item>@string/PreferenceSwitchTabsMethodButtons</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodFling</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n\t\t<item>BUTTONS</item>\n\t\t<item>FLING</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n    \n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Browser settings</string>\n    \n    <string name=\"PreferenceEnableJavascriptTitle\">Enable JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript is enabled.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript is disabled.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Enable images</string>\n    <string name=\"PreferenceEnableImagesSummary\">Check if you want to load images.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Use wide view port</string>\n    <string name=\"PreferenceUseWideViewportSummary\">If checked, browser will use a viewport similar to desktop browsers.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Load pages with overview</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Check if you want to load pages zoomed out to show an overview of the page.</string>\n    <string name=\"PreferencePluginsTitle\">Enable plugins</string>\n    <string name=\"PreferencePluginsSummary\">Choose how to manage plugins.</string>\n    \n    <string name=\"PreferencePluginsAlwaysOff\">Always off</string>\n    <string name=\"PreferencePluginsOnDemand\">On demand</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Always on</string>\n    \n    <string-array name=\"PreferencePluginsEntries\">\n\t\t<item>@string/PreferencePluginsAlwaysOff</item>\n\t\t<item>@string/PreferencePluginsOnDemand</item>\n\t\t<item>@string/PreferencePluginsAlwaysOn</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferencePluginsValues\">\n\t\t<item>OFF</item>\n\t\t<item>ON_DEMAND</item>\n\t\t<item>ON</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUserAgentTitle\">User-agent</string>\n    <string name=\"PreferenceUserAgentSummary\">Set the user-agent string used by the browser.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">User-agent</string>\n    \n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Privacy &amp; security settings</string>\n    \n    <string name=\"PreferencePrivacyClearCacheTitle\">Clear cache</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Clear locally cached content and databases.</string>\n        \n    <string name=\"PreferenceCategoryHistoryTitle\">History</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">History size</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Define the history size, in days.</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Clear history</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Clear the browser navigation history.</string>\n        \n    <string name=\"PreferenceCategoryCookiesTitle\">Cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Accept cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Allow sites to save and read cookie data.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Clear cookies</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Clear all browser cookies.</string>\n    \n    <string name=\"PreferenceCategoryGeolocationTitle\">Location</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Enable location</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Allow sites to request access to your location.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Clear location access</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Clear location access for all websites.</string>\n    \n    <string name=\"PreferenceCategoryFormDataTitle\">Form Data</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Remember form data</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Remember data i type in forms for later use.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Clear form data</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Clear all saved form data.</string>\n    \n    <string name=\"PreferenceCategoryPasswordsTitle\">Passwords</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Remember passwords</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Save usernames and passwords for websites.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Clear passwords</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Clear all saved passwords.</string>\n    \n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Websites settings</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Advanced settings for individual websites.</string>\n    \n    <string name=\"PreferencePrivacyIncognitoTitle\">Incognito mode</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Incognito by default</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Open new tabs in incognito mode</string>\n    \n    <string name=\"HistoryToday\">Today</string>\n    <string name=\"HistoryYesterday\">Yesterday</string>\n    <string name=\"HistoryLastSevenDays\">Last 7 days</string>\n    <string name=\"HistoryLastMonth\">Last month</string>\n    <string name=\"HistoryOlder\">Older</string>\n    \n    <string name=\"ClearCacheMessage\">Delete locally cached content and databases?</string>\n    <string name=\"ClearHistoryMessage\">Delete the browser navigation history?</string>\n    <string name=\"ClearCookiesMessage\">Delete all cookies?</string>\n    <string name=\"ClearGeolocationMessage\">Clear websites location access?</string>\n    <string name=\"ClearFormDataMessage\">Delete all saved form data?</string>\n    <string name=\"ClearPasswordsMessage\">Delete all saved passwords?</string>\n    \n    <string name=\"PreferenceHomepageStart\">Start page</string>\n    <string name=\"PreferenceHomepageBlank\">Blank page</string>\n    <string name=\"PreferenceHomepageCustom\">Custom page</string>\n    \n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n    \n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">Desktop</string>\n    <string name=\"PreferenceUserAgentOther\">Other</string>\n    \n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n    \n    <string name=\"SearchUrlGoogle\">http://www.google.com/m?q={searchTerms}</string>\n    \n    <string name=\"PreferenceHeaderAddonsTitle\">Addons</string>    \n    \n    <string name=\"PreferenceHeaderAboutTitle\">About</string>\n    \n    <string name=\"HttpAuthenticationDialogDialogTitle\">Sign in to %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Name</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Password</string>\n    \n    <string name=\"FormResubmitTitle\">Form resubmission</string>\n    <string name=\"FormResubmitMessage\">The page you\\'re trying to view contains data that has already been submitted (\\\"POSTDATA\\\"). If you resend the data, any action the form on the page carried out (such as a search or online purchase) will be repeated.</string>\n    \n    <string name=\"BookmarkAdded\">Added to bookmarks.</string>\n    <string name=\"BookmarkRemoved\">Removed from bookmarks.</string>\n    \n    <string name=\"SDCardErrorNoSDMsg\">No SD Card found.</string>\n    <string name=\"SDCardErrorSDUnavailable\">SD Card is not available.</string>\n    \n    <string name=\"HistoryBookmarksClearTitle\">Clear</string>\n    \n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n    \n    <string name=\"HistoryBookmarksImportSourceTitle\">Import file</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Unavailable file, either it does not exists or is unreadable.</string>\n    <string name=\"HistoryBookmarksImportTitle\">History &amp; bookmarks import</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">Importing history &amp; bookmarks&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">Reading file&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">Parsing file&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">Reading item %1$s of %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">Inserting values&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Error during import</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">An error occurred during history &amp; bookmarks import: %s</string>\n    \n    <string name=\"HistoryBookmarksExportTitle\">History &amp; bookmarks export</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">Exporting history &amp; bookmarks&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">Checking external storage&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">Exporting item %1$s of %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Error during export</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">An error occurred during history &amp; bookmarks export: %s</string>\n    \n    <string name=\"GeolocationTitle\">Location request</string>\n    <string name=\"GeolocationMessage\">Website %s request access to your location.</string>    \n    <string name=\"GeolocationAccept\">Accept</string>\n    <string name=\"GeolocationDecline\">Decline</string>\n    \n    <string name=\"WebsitesSettingsEmpty\">No settings for websites.</string>\n    \n    <string name=\"WebsitesSettingsSiteTitle\">Settings for %s</string>\n    \n    <string name=\"WebsitesSettingsDataUsage\">%s MB stored on your device.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Click to clear stored data.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Delete data</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Delete all data stored by this website?</string>\n    \n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Click to clear location access.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">This site can access to your location.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">This site cannot access to your location.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Clear location access</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Clear location access for this website?</string>\n    \n    <string name=\"AddonsWarningText\">Please install only addons from developers you trust. If you experience weird behaviors, disable all your addons.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Get addons</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Android Market not found</string>\n    <string name=\"AddonsMarketNotFoundMessage\">You do not seems to have the Android Market application on your device.</string>\n    <string name=\"AddonsEnableAll\">Enable all</string>\n    <string name=\"AddonsDisableAll\">Disable all</string>\n    \n    <string name=\"AddonDetailsContact\">Contact: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">This addon:</string>\n    \n    <string name=\"AddonCallbackPageStarted\">Is notified when a page starts loading.</string>\n    <string name=\"AddonCallbackPageFinished\">Is notified when a page finish loading.</string>\n    <string name=\"AddonCallbackTabOpened\">Is notified when a tab is opened.</string>\n    <string name=\"AddonCallbackTabClosed\">Is notified when a tab is closed.</string>\n    <string name=\"AddonCallbackTabSwitched\">Is notified when switching tabs.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">Has a settings page.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Can contribute to the main menu.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Can contribute to the link context menu.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Can contribute to the bookmarks &amp; history menu.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Can contribute to the bookmark context menu.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Can contribute to the history context menu.</string>\n    \n    <string name=\"AddonDetailsUsedPermissionsTitle\">Has the following permissions:</string>\n    <string name=\"AddonDetailsPermissionsNone\">None.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Unable to get permissions. Check them with the application manager of your device.</string>\n    \n    <string name=\"ContentDescriptionDivider\">divider</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Application icon</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Suggestion favicon</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Bookmark thumbnail</string>\n    <string name=\"ContentDescriptionFavicon\">Website`s favicon</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Go / Stop / Reload button</string>\n    <string name=\"ContentDescriptionMenuButton\">Menu button</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Previous tab button</string>\n    <string name=\"ContentDescriptionNextTabButton\">Next tab button</string>\n    <string name=\"ContentDescriptionLeftBubble\">Left bubble</string>\n    <string name=\"ContentDescriptionRightBubble\">Right bubble</string>\n    <string name=\"ContentDescriptionBackButton\">Back button</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Close tab button</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Bookmarks button</string>\n    <string name=\"ContentDescriptionNewTabButton\">New tab button</string>\n    <string name=\"ContentDescriptionForwardButton\">Forward button</string>\n    <string name=\"ContentDescriptionHomeButton\">Home button</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Website location</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Website usage</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Website feature</string>\n    \n    <string-array name=\"DefaultBookmarksTitles\">\n\t\t<item>Google</item>\n\t\t<item>Wikipedia</item>\n\t\t<item>YouTube</item>\n\t\t<item>Yahoo!</item>\n\t\t<item>BBC</item>\n\t\t<item>eBay</item>\n\t</string-array>\n\t\n    <string-array name=\"DefaultBookmarksUrls\">\n\t\t<item>http://www.google.com/</item>\n\t\t<item>http://en.wikipedia.org/</item>\n\t\t<item>http://www.youtube.com/</item>\n\t\t<item>http://www.yahoo.com/</item>\n\t\t<item>http://www.bbc.co.uk/</item>\n\t\t<item>http://www.ebay.com/</item>\n\t</string-array>\n\t\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">Incognito tab</string>\n    <string name=\"ContextMenuOpenInBackground\">Open in background</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Private browsing indicator</string>\n    \n    <!-- 1.3 -->\n    <string name=\"Folder\">Folder</string>\n    <string name=\"NewFolder\">New folder</string>    \n    <string name=\"NewFolderHint\">Name of the new folder</string>\n    <string name=\"ProvideNewFolderName\">Please provide a name for the new folder, or choose an existing one.</string>\n    \n    <string name=\"DeleteFolder\">Delete folder</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Delete this folder and all its content?</string>\n    <string name=\"DeleteFolderTitle\">Deleting folder</string>\n    <string name=\"DeleteFolderMessage\">Please wait while the folder and its content is being deleted&#8230;</string>\n    \n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Go back in bookmarks folders hierarchy</string>\n    \n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Accessibility settings</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Text size</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Text size preview</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Text scaling</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Minimum font size</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Set the minimum font size used to display text in the browser.</string>\n    \n    <string name=\"FontPreviewTextTiny\">Tiny</string>\n    <string name=\"FontPreviewTextSmall\">Small</string>\n    <string name=\"FontPreviewTextNormal\">Normal</string>\n    <string name=\"FontPreviewTextLarge\">Large</string>\n    <string name=\"FontPreviewTextHuge\">Huge</string>\n    \n    <string-array name=\"FontPreviewText\">\n\t\t<item>@string/FontPreviewTextTiny</item>\n\t\t<item>@string/FontPreviewTextSmall</item>\n\t\t<item>@string/FontPreviewTextNormal</item>\n\t\t<item>@string/FontPreviewTextLarge</item>\n\t\t<item>@string/FontPreviewTextHuge</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Inverted screen rendering</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Inverted rendering</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Invert the screen colors. This may not works on all devices.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Contrast</string>\n    \n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">Put suggestion url in the url bar, without navigating to it.</string>\n    \n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">unknown authority</string>\n    <string name=\"RememberMyChoice\">Remember my choice</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">SSL security exception: Access allowed to %s by user.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">SSL security exception: Access disallowed to %s by user.</string>\n    \n    <string name=\"PreferenceSslExceptionsTitle\">SSL security exceptions</string>\n    <string name=\"PreferenceSslExceptionsSummary\">List of SSL security exceptions by websites.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Click to remove the exception.</i></string>\n    <string name=\"SslExceptionEmptyText\">You do not have any SSL security exception.</string>\n    \n    <string name=\"RemoveSslExceptionTitle\">Remove exception</string>\n    <string name=\"RemoveSslExceptionMessage\">Do you want to remove the security exception for this website?</string>\n    \n    <string name=\"SslInvalid\">This certificate is invalid.</string>\n    <string name=\"SslDateInvalid\">This certificate date is invalid.</string>\n    \n    <string name=\"Authorized\">Authorized:</string>\n    <string name=\"Reasons\">Reasons:</string>\n    \n    <string name=\"SearchUrlDialogText1\">Your search engine is currently set to:</string>\n    <string name=\"SearchUrlDialogText2\">You can customize it by choosing a search engine proposed below.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Manually edit the search engine</a></string>    \n    <string name=\"SearchUrlConnecting\">Connecting&#8230;</string>\n    <string name=\"SearchUrlParsing\">Parsing results&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Unable to connect to search engine repository (response code: %s).</string>\n    \n    <string name=\"SearchUrlDefault\">Google worldwide</string>\n    <string name=\"SearchUrlCustom\">Custom search engine</string>\n    \n    <string name=\"SortBookmarks\">Sort bookmarks</string>    \n    <string name=\"MostUsedSortMode\">Most used</string>\n    <string name=\"AlphaSortMode\">Alphabetically</string>\n    <string name=\"RecentSortMode\">Most recently visited</string>\n\n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Invalid file format</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">Reading folder %1$s of %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">Linking folders&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">Reading bookmark %1$s of %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">Reading history item %1$s of %2$s.</string>\n    \n    <string name=\"FullScreen\">Full screen</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Exit full screen button</string>\n    \n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">Start page</string>\n\n    <string name=\"RestartDialogTitle\">Restart required</string>\n    <string name=\"RestartDialogMessage\">This change will not take effect until the application restart. Do you want to do it now?</string>\n    \n    <string name=\"ContentDescriptionTabPreview\">Tab preview</string>\n    \n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Close side panel on new tab</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">If checked, the side panel will close when openning a new tab.</string>\n    \n    <string name=\"AboutChangelogTitle\">Changelog</string>\n    <string name=\"AboutContributorsTitle\">Contributors</string>\n    <string name=\"AboutLicensesTitle\">Other licenses</string>\n    \n    <string name=\"RestoreTabsDialogTitle\">Tabs restoration</string>\n    <string name=\"RestoreTabsDialogMessage\">Do you want to restore the tabs from your previous session?</string>\n    \n    <string name=\"PreferenceRestoreTabsTitle\">Tabs restoration</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Select how you want tabs to be restored from a previous session.</string>\n    \n    <string name=\"PreferenceRestoreTabsAsk\">Ask</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Always</string>\n    <string name=\"PreferenceRestoreTabsNever\">Never</string>\n    \n    <string-array name=\"PreferenceRestoreTabsEntries\">\n\t\t<item>@string/PreferenceRestoreTabsAsk</item>\n\t\t<item>@string/PreferenceRestoreTabsAlways</item>\n\t\t<item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceRestoreTabsValues\">\n\t\t<item>ASK</item>\n\t\t<item>ALWAYS</item>\n\t\t<item>NEVER</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUITypeTitle\">UI type</string>\n    <string name=\"PreferenceUITypeSummary\">Select the type of user interface.</string>\n    \n    <string name=\"PreferenceUITypeAuto\">Automatic</string>\n    <string name=\"PreferenceUITypePhone\">Phone</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Phone (legacy)</string>\n    <string name=\"PreferenceUITypeTablet\">Tablet</string>\n    \n    <string-array name=\"PreferenceUITypeEntries\">\n\t\t<item>@string/PreferenceUITypeAuto</item>\n\t\t<item>@string/PreferenceUITypePhone</item>\n\t\t<item>@string/PreferenceUITypeLegacyPhone</item>\n\t\t<item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceUITypeValues\">\n\t\t<item>AUTO</item>\n\t\t<item>PHONE</item>\n\t\t<item>LEGACY_PHONE</item>\n\t\t<item>TABLET</item>\n\t</string-array>\n\t\n    <!-- 1.8 -->\n    <string name=\"PreferenceDevelopersTitle\">Developers</string>\n    \n    <string name=\"PreferenceJsLogOnLocatTitle\">Log JS logs to logcat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Redirect javascript logs to the logcat buffer.</string>\n    \n    <string name=\"ContextMenuViewImageInNewTab\">View image in a new tab</string>\n    \n</resources>"
  },
  {
    "path": "res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n\n    <style name=\"ApplicationTheme\" parent=\"@android:style/Theme.Holo\">\n    </style>\n    \n    <style name=\"ApplicationTheme.ListMainItem\">\n\t\t<item name=\"android:textSize\">16sp</item>\n\t</style>\n    \n    <style name=\"RowSmallLight\">\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:textColor\">#000000</item>\n    </style>\n    \n    <style name=\"RowVerySmallLight\">\n        <item name=\"android:textSize\">10sp</item>\n        <item name=\"android:textColor\">#787878</item>\n    </style>\n    \n</resources>"
  },
  {
    "path": "res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Tint Browser ist ein freier Browser für Android.</string>\n    \n    <string name=\"AboutVersionText\">Version: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">Lizenz: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    \n    <string name=\"PermissionReadBookmarksLabel\">Lesezeichen von Tint Browser lesen</string>\n    <string name=\"PermissionReadBookmarksDescription\">Erlaube anderen Anwendungen den Verlauf und die Lesezeichen von Tint Browser zu lesen.</string>\n    \n\t<string name=\"PermissionWriteBookmarksLabel\">Lesezeichen zu Tint Browser hinzufügen</string>\n    <string name=\"PermissionWriteBookmarksDescription\">Erlaube anderen Anwendungen den Verlauf und die Lesezeichen von Tint Browser zu ändern.</string>    \n    \n    <string name=\"PermissionBindAddonServiceLabel\">Zugriff auf Tint Browser Erweiterungsschnittstellen</string>\n    <string name=\"PermissionBindAddonServiceDescription\">Erlaube anderen Anwendungen den Zugriff auf die Erweiterungsschnittstellen von Tint Browser. Nur Tint Browser selber sollte diese Berechtigung besitzen.</string>\n    \n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Abbrechen</string>\n    <string name=\"Yes\">Ja</string>\n    <string name=\"No\">Nein</string>\n    <string name=\"On\">An</string>\n    <string name=\"Off\">Aus</string>\n    <string name=\"Clear\">Leeren</string>\n    <string name=\"Continue\">Fortfahren</string>\n    <string name=\"Proceed\">Fortfahren</string>\n    <string name=\"VideoLoading\">Lade Video\\u2026</string>\n    <string name=\"History\">Verlauf</string>\n    <string name=\"All\">Alle</string>\n    <string name=\"Bookmarks\">Lesezeichen</string>\n    <string name=\"Preferences\">Einstellungen</string>\n    \n    <string name=\"UrlBarUrlDefaultSubTitle\">Berühren, um eine URL einzugeben oder zu suchen.</string>\n    <string name=\"UrlBarUrlHint\">URL oder Suchbegriff eingeben</string>\n    \n    <string name=\"ShareChooserTitle\">Teilen mit</string>\n    <string name=\"FileChooserPrompt\">Datei zum Hochladen auswählen</string>\n    \n    <string name=\"Download\">Herunterladen</string>\n    <string name=\"DownloadDialogTitle\">Download</string>\n    <string name=\"DownloadInIncognito\">Herunterladen incognito</string>\n    <string name=\"DownloadStart\">Herunterladen %1$s&#8230;</string>\n    <string name=\"DownloadComplete\">Herunterladen beendet.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">Herunterladen fehlgeschlagen: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Medienfehler. Stelle sicher, dass ein Speichermedium mit freiem Speicherplatz zur Verfügung steht.</string>\n    <string name=\"DownloadErrorHttp\">HTTP-Fehler</string>\n    <string name=\"DownloadErrorRedirection\">Zu viele Weiterleitungen</string>\n    <string name=\"DownloadErrorUnknown\">Unbekannter Fehler</string>\n    \n    <string name=\"ContextMenuOpen\">Öffnen</string>\n    <string name=\"ContextMenuOpenNewTab\">In neuem Reiter öffnen</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Verweisziel kopieren</string>\n    <string name=\"ContextMenuDownload\">Herunterladen</string>\n    <string name=\"ContextMenuShareLinkUrl\">Verweis teilen</string>\n    \n    <string name=\"ContextMenuViewImage\">Bild anzeigen</string>\n    <string name=\"ContextMenuCopyImageUrl\">Bildadresse kopieren</string>\n    <string name=\"ContextMenuDownloadImage\">Bild herunterladen</string>\n    <string name=\"ContextMenuShareImageUrl\">Bild teilen</string>\n    \n    <string name=\"ContextMenuSendEmail\">E-Mail versenden</string>\n    <string name=\"ContextMenuCopyEmailUrl\">E-Mail-Adresse kopieren</string>\n    <string name=\"ContextMenuShareEmailUrl\">E-Mail-Adresse teilen</string>\n    \n    <string name=\"UrlCopyToastMessage\">URL wurde in die Zwischenablage kopiert.</string>\n    <string name=\"ContextMenuShareUrl\">Teilen</string>\n    \n    <string name=\"JavaScriptAlertDialog\">JavaScript-Warndialog</string>\n    <string name=\"JavaScriptConfirmDialog\">JavaScript-Bestätigungsdialog</string>\n    <string name=\"JavaScriptPromptDialog\">JavaScript-Eingabedialog</string>    \n\t\n\t<string name=\"SslWarning\">Sicherheitswarnung</string>\n\t<string name=\"SslWarningsHeader\">Das Zertifikat dieser Seite ist fehlerhaft (%s).</string>\n\t<string name=\"SslUntrusted\">Das Zertifikat ist nicht von einer vertrauenswürdigen Stelle unterschrieben worden.</string>\n\t<string name=\"SslIDMismatch\">Der Name der Webseite stimmt nicht mit dem im Zertifikat angegebenen Namen überein.</string>\n\t<string name=\"SslExpired\">Das Zertifikat ist abgelaufen.</string>\n\t<string name=\"SslNotYetValid\">Das Zertifikat ist noch nicht gültig.</string>    \n        \n    <string name=\"NewTab\">Neuer Reiter</string>\n        \n    <string name=\"CloseTab\">Diesen Reiter schließen</string>\n    <string name=\"AddBookmark\">Lesezeichen hinzufügen</string>\n    <string name=\"SharePage\">Seite teilen</string>\n    <string name=\"Search\">Auf Seite suchen</string>\n    \n    <string name=\"BookmarksTitle\">Lesezeichen &amp; Verlauf</string>\n    <string name=\"BookmarksTabTitle\">Lesezeichen</string>\n    <string name=\"HistoryTabTitle\">Verlauf</string>\n    \n    <string name=\"ImportHistoryBookmarks\">Import</string>\n    <string name=\"ExportHistoryBookmarks\">Export</string>\n    <string name=\"ClearHistoryBookmarks\">Leeren</string>\n    \n    <string name=\"AddBookmarkTitle\">Lesezeichen hinzufügen</string>\n    <string name=\"BookmarkText\">Bezeichnung</string>\n    <string name=\"UrlText\">Adresse</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Der angegebene Name oder die URL sind leer.</string>\n    \n    <string name=\"OpenInTab\">In neuem Reiter öffnen</string>\n    <string name=\"EditBookmark\">Lesezeichen bearbeiten</string>\n    <string name=\"CopyUrl\">Verweis kopieren</string>\n    <string name=\"DeleteBookmark\">Lesezeichen löschen</string>\n    <string name=\"DeleteHistoryItem\">Aus dem Verlauf löschen</string>\n    \n    <string name=\"PreferencesActivityTitle\">Einstellungen</string>\n        \n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">Allgemeine Einstellungen</string>\n    \n    <string name=\"PreferenceGeneralHomepageTitle\">Startseite</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Ändere die in einem neuen Reiter standardmäßig angezeigte Webseite.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Startseite</string>\n    \n    <string name=\"PreferenceGeneralSearchUrlTitle\">Suchmaschine</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Ändere die standardmäßig verwendete Suchmaschine.</string>\n    \n    <string name=\"PreferenceCategoryStartPageTitle\">Schnellwahl</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Anzahl der Einträge in der Schnellwahl</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Ändere die Anzahl der Einträge, die in der Schnellwahl angezeigt werden.</string>\n    \n    <string name=\"PreferenceCategoryUITitle\">Darstellung</string>\n        \n    <string name=\"PreferenceBubblePositionTitle\">Bubble position</string>\n    <string name=\"PreferenceBubblePositionSummary\">Position of the bubble allowing to show the toolbars.</string>\n    \n    <string name=\"PreferenceBubblePositionRight\">Rechts</string>\n    <string name=\"PreferenceBubblePositionLeft\">Links</string>\n    <string name=\"PreferenceBubblePositionBoth\">Beide</string>\n    \n    <string-array name=\"PreferenceBubblePositionEntries\">\n\t\t<item>@string/PreferenceBubblePositionRight</item>\n\t\t<item>@string/PreferenceBubblePositionLeft</item>\n\t\t<item>@string/PreferenceBubblePositionBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceBubblePositionValues\">\n\t\t<item>RIGHT</item>\n\t\t<item>LEFT</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Anzeigedauer der Werkzeugleiste</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Ändere wie lange (in Sekunden) die Werkzeugleiste angezeigt wird.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodTitle\">Reiterauswahl</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Ändere wie zwischen den verschiedenen Reitern gewechselt wird.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodButtons\">Schalter</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Fling</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Beide</string>\n    \n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n\t\t<item>@string/PreferenceSwitchTabsMethodButtons</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodFling</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n\t\t<item>BUTTONS</item>\n\t\t<item>FLING</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n    \n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Browsereinstellungen</string>\n    \n    <string name=\"PreferenceEnableJavascriptTitle\">JavaScript aktivieren</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript ist aktiviert.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript ist deaktiviert.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Bilder anzeigen</string>\n    <string name=\"PreferenceEnableImagesSummary\">Aktivieren, um Bilder anzuzeigen.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Breite Webseitenansicht verwenden</string>\n    <string name=\"PreferenceUseWideViewportSummary\">Aktivieren, um Webseitenansichten mit breitem Layout zu bevorzugen, wie bei Desktop-Browsern.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Ganze Webseite nach dem Laden anzeigen</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Aktivieren, um Webseiten nach dem Laden auf Bildschirmgröße zu verkleinern.</string>\n    <string name=\"PreferencePluginsTitle\">Plugins aktivieren</string>\n    <string name=\"PreferencePluginsSummary\">Auswählen, wann Plugins verwendet werden.</string>\n    \n    <string name=\"PreferencePluginsAlwaysOff\">Nie</string>\n    <string name=\"PreferencePluginsOnDemand\">Bei Bedarf</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Immer</string>\n    \n    <string-array name=\"PreferencePluginsEntries\">\n\t\t<item>@string/PreferencePluginsAlwaysOff</item>\n\t\t<item>@string/PreferencePluginsOnDemand</item>\n\t\t<item>@string/PreferencePluginsAlwaysOn</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferencePluginsValues\">\n\t\t<item>OFF</item>\n\t\t<item>ON_DEMAND</item>\n\t\t<item>ON</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUserAgentTitle\">Browseridentifikation</string>\n    <string name=\"PreferenceUserAgentSummary\">Ändere die gesendete Browseridentifikation.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">Browseridentifikation</string>\n    \n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Privatsphären- &amp; Sicherheitseinstellungen</string>\n    \n    <string name=\"PreferencePrivacyClearCacheTitle\">Zwischenspeicher leeren</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Lösche lokal zwischengespeicherte Inhalte und Datenbanken.</string>\n        \n    <string name=\"PreferenceCategoryHistoryTitle\">Verlauf</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">Verlaufsgröße</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Ändere Verlaufsgröße (in Tagen).</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Verlauf leeren</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Leere den Verlauf.</string>\n        \n    <string name=\"PreferenceCategoryCookiesTitle\">Cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Cookies akzeptieren</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Erlaube Webseiten Cookies zu speichern.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Cookies löschen</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Alle Cookies löschen.</string>\n    \n    <string name=\"PreferenceCategoryGeolocationTitle\">Standort</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Standortbestimmung aktivieren</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Erlaube Webseiten den aktuellen Standort zu bestimmen.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Berechtigungen für Standortbestimmung entziehen</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Entziehe allen Webseiten die Berechtigung den aktuellen Standort zu bestimmen.</string>\n    \n    <string name=\"PreferenceCategoryFormDataTitle\">Formulare</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Formulareingaben speichern</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Speichere Formulareingaben für spätere Nutzung.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Formulareingaben löschen</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Lösche alle gespeicherten Formulareingaben.</string>\n    \n    <string name=\"PreferenceCategoryPasswordsTitle\">Passwörter</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Passwörter speichern</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Eingegebene Benutzernamen und Passwörter speichern.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Passwörter löschen</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Alle gespeicherten Passwörter löschen.</string>\n    \n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Webseiteneinstellungen</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Erweiterte Einstellungen pro Webseite.</string>\n    \n    <string name=\"PreferencePrivacyIncognitoTitle\">Inkognito-modus</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Inkognito standardmäßig</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Öffnen neuer Tabs in inkognito-modus</string>\n    \n    <string name=\"HistoryToday\">Heute</string>\n    <string name=\"HistoryYesterday\">Gestern</string>\n    <string name=\"HistoryLastSevenDays\">Letzte 7 Tage</string>\n    <string name=\"HistoryLastMonth\">Letzter Monat</string>\n    <string name=\"HistoryOlder\">Älter</string>\n    \n    <string name=\"ClearCacheMessage\">Alle zwischengespeicherten Inhalte und Datenbanken löschen?</string>\n    <string name=\"ClearHistoryMessage\">Gesamten Verlauf leeren?</string>\n    <string name=\"ClearCookiesMessage\">Alle Cookies löschen?</string>\n    <string name=\"ClearGeolocationMessage\">Allen Webseiten die Berechtigung zur Standortbestimmung entziehen?</string>\n    <string name=\"ClearFormDataMessage\">Alle Formulareingaben löschen?</string>\n    <string name=\"ClearPasswordsMessage\">Alle gespeicherten Passwörter löschen?</string>\n    \n    <string name=\"PreferenceHomepageStart\">Startseite</string>\n    <string name=\"PreferenceHomepageBlank\">Leere Seite</string>\n    <string name=\"PreferenceHomepageCustom\">Benutzerdefinierte Seite</string>\n    \n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n    \n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">Desktop</string>\n    <string name=\"PreferenceUserAgentOther\">Anderer</string>\n    \n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n    \n    <string name=\"SearchUrlGoogle\">http://www.google.de/m?q={searchTerms}</string>\n    \n    <string name=\"PreferenceHeaderAddonsTitle\">Erweiterungen</string>    \n    \n    <string name=\"PreferenceHeaderAboutTitle\">Über</string>\n    \n    <string name=\"HttpAuthenticationDialogDialogTitle\">Anmelden bei %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Name</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Passwort</string>\n    \n    <string name=\"FormResubmitTitle\">Formular erneut senden</string>\n    <string name=\"FormResubmitMessage\">Die angesteuerte Seite basiert auf gesendeten Formulareingaben. Werden diese erneut gesendet, so wird auch die damit verbundene Aktion erneut ausgeführt.</string>\n    \n    <string name=\"BookmarkAdded\">Lesezeichen hinzugefügt.</string>\n    <string name=\"BookmarkRemoved\">Lesezeichen entfernt.</string>\n    \n    <string name=\"SDCardErrorNoSDMsg\">Keine SD-Karte gefunden.</string>\n    <string name=\"SDCardErrorSDUnavailable\">Die SD-Karte ist nicht benutzbar.</string>\n    \n    <string name=\"HistoryBookmarksClearTitle\">Leeren</string>\n    \n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n    \n    <string name=\"HistoryBookmarksImportSourceTitle\">Datei importieren</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Datei nicht verfügbar, da sie nicht existiert oder nicht lesbar ist.</string>\n    <string name=\"HistoryBookmarksImportTitle\">Import von Verlauf &amp; Lesezeichen</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">Importiere Verlauf &amp; Lesezeichen&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">Lese Datei&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">Verarbeite Datei&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">Lese Eintrag %1$s von %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">Füge Einträge hinzu&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Importfehler</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">Ein Fehler ist während dem Import von Verlauf und Lesezeichen aufgetreten: %s</string>\n    \n    <string name=\"HistoryBookmarksExportTitle\">Export von Verlauf &amp; Lesezeichen</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">Exportiere Verlauf &amp; Lesezeichen&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">Prüfe Speichermedium&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">Exportiere Eintrag %1$s von %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Exportfehler</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">Ein Fehler ist während dem Export von Verlauf und Lesezeichen aufgetreten: %s</string>\n    \n    <string name=\"GeolocationTitle\">Standortbestimmung</string>\n    <string name=\"GeolocationMessage\">Die Webseite %s möchte den aktuellen Standort abfragen.</string>    \n    <string name=\"GeolocationAccept\">Erlauben</string>\n    <string name=\"GeolocationDecline\">Ablehnen</string>\n    \n    <string name=\"WebsitesSettingsEmpty\">Keine Einstellungen für Webseiten vorhanden.</string>\n    \n    <string name=\"WebsitesSettingsSiteTitle\">Einstellungen für %s</string>\n    \n    <string name=\"WebsitesSettingsDataUsage\">%s MB auf dem Gerät gespeichert.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Gespeicherte Daten löschen.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Daten löschen</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Alle von dieser Webseite gespeicherten Daten löschen?</string>\n    \n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Zugriff auf Standort entziehen.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">Diese Webseite kann den aktuellen Standort abfragen.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">Diese Webseite kann den aktuellen Standort nicht abfragen.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Standortzugriff entziehen</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Soll dieser Webseite der Zugriff auf den aktuellen Standort entzogen werden?</string>\n    \n    <string name=\"AddonsWarningText\">Installiere nur Erweiterungen aus vertrauenswürdigen Quellen. Deaktiviere alle Erweiterungen, sollte sich Tint Browser ungewöhnlich verhalten.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Erweiterungen herunterladen</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Android Market nicht verfügbar</string>\n    <string name=\"AddonsMarketNotFoundMessage\">Der Android Market scheint auf diesem Gerät nicht installiert zu sein.</string>\n    <string name=\"AddonsEnableAll\">Alle aktivieren</string>\n    <string name=\"AddonsDisableAll\">Alle deaktivieren</string>\n    \n    <string name=\"AddonDetailsContact\">Kontakt: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">Diese Erweiterung:</string>\n    \n    <string name=\"AddonCallbackPageStarted\">Wird benachrichtigt, wenn eine Seite aufgerufen wird.</string>\n    <string name=\"AddonCallbackPageFinished\">Wird benachrichtigt, wenn eine Seite vollständig geladen wurde.</string>\n    <string name=\"AddonCallbackTabOpened\">Wird benachrichtigt, wenn ein neuer Reiter geöffnet wird.</string>\n    <string name=\"AddonCallbackTabClosed\">Wird benachrichtigt, wenn ein Reiter geschlossen wird.</string>\n    <string name=\"AddonCallbackTabSwitched\">Wird benachrichtigt, wenn der aktuelle Reiter gewechselt wird.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">Bietet Einstellungen.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Kann dem Hauptmenü Einträge hinzufügen.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Kann dem Kontextmenü Einträge hinzufügen.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Kann dem Menü Verlauf &amp; Lesezeichen Einträge hinzufügen.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Kann dem Lesezeichenkontextmenü Einträge hinzufügen.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Kann dem Verlaufskontextmenü Einträge hinzufügen.</string>\n    \n    <string name=\"AddonDetailsUsedPermissionsTitle\">Hat diese Berechtigungen:</string>\n    <string name=\"AddonDetailsPermissionsNone\">Keine.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Unbekannt. Sie können möglicherweise in der Paketverwaltung des Geräts eingesehen werden.</string>\n    \n    <string name=\"ContentDescriptionDivider\">Trennzeichen</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Anwendungssymbol</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Vorschlagssymbol</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Lesezeichen-Schnappschuss</string>\n    <string name=\"ContentDescriptionFavicon\">Webseitensymbol</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Button Gehe zu / Stop / Neu laden</string>\n    <string name=\"ContentDescriptionMenuButton\">Button Menü</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Button vorheriger Reiter</string>\n    <string name=\"ContentDescriptionNextTabButton\">Button nächster Reiter</string>\n    <string name=\"ContentDescriptionLeftBubble\">Left bubble</string>\n    <string name=\"ContentDescriptionRightBubble\">Right bubble</string>\n    <string name=\"ContentDescriptionBackButton\">Button Zurück</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Button Reiter schließen</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Button Lesezeichen</string>\n    <string name=\"ContentDescriptionNewTabButton\">Button neuer Reiter</string>\n    <string name=\"ContentDescriptionForwardButton\">Button Vorwärts</string>\n    <string name=\"ContentDescriptionHomeButton\">Button Startseite</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Website location</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Website usage</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Website feature</string>\n    \n    <string-array name=\"DefaultBookmarksTitles\">\n\t\t<item>Google</item>\n\t\t<item>Wikipedia</item>\n\t\t<item>YouTube</item>\n\t\t<item>Yahoo!</item>\n\t\t<item>BBC</item>\n\t\t<item>eBay</item>\n\t</string-array>\n\t\n    <string-array name=\"DefaultBookmarksUrls\">\n\t\t<item>http://www.google.com/</item>\n\t\t<item>http://en.wikipedia.org/</item>\n\t\t<item>http://www.youtube.com/</item>\n\t\t<item>http://www.yahoo.com/</item>\n\t\t<item>http://www.bbc.co.uk/</item>\n\t\t<item>http://www.ebay.com/</item>\n\t</string-array>\n\t\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">Inkognito-Reiter</string>\n    <string name=\"ContextMenuOpenInBackground\">Im Hintergrund öffnen</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Inkognitomodus aktiv</string>\n    \n    <!-- 1.3 -->\n    <string name=\"Folder\">Ordner</string>\n    <string name=\"NewFolder\">Neuer Ordner</string>    \n    <string name=\"NewFolderHint\">Name des neuen Ordners</string>\n    <string name=\"ProvideNewFolderName\">Bitte gib einen Namen für den neuen Ordner an oder wähle einen existierenden aus.</string>\n    \n    <string name=\"DeleteFolder\">Ordner löschen</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Diesen Ordner und seinen Inhalt löschen?</string>\n    <string name=\"DeleteFolderTitle\">Lösche Ordner</string>\n    <string name=\"DeleteFolderMessage\">Lösche Ordner und seinen Inhalt&#8230;</string>\n    \n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Eine Ebene höher in der Lesezeichenhierarchie</string>\n    \n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Barrierefreiheit</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Textgröße</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Textvorschau</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Textskalierung</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Minimale Textgröße</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Setze minimale Textgröße für Webseiten.</string>\n    \n    <string name=\"FontPreviewTextTiny\">Sehr klein</string>\n    <string name=\"FontPreviewTextSmall\">Klein</string>\n    <string name=\"FontPreviewTextNormal\">Normal</string>\n    <string name=\"FontPreviewTextLarge\">Groß</string>\n    <string name=\"FontPreviewTextHuge\">Sehr groß</string>\n    \n    <string-array name=\"FontPreviewText\">\n\t\t<item>@string/FontPreviewTextTiny</item>\n\t\t<item>@string/FontPreviewTextSmall</item>\n\t\t<item>@string/FontPreviewTextNormal</item>\n\t\t<item>@string/FontPreviewTextLarge</item>\n\t\t<item>@string/FontPreviewTextHuge</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Farben invertieren</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Farben invertieren</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Invertiere die Farben von Webseiten. Dies funktioniert nicht mit allen Geräten.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Kontrast</string>\n    \n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">URL vervollständigen.</string>\n    \n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">Unbekannter Aussteller</string>\n    <string name=\"RememberMyChoice\">Diese Antwort merken</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">Zugriff auf %s durch Sicherheits-Ausnahmeregel erlaubt.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">Zugriff auf %s durch Sicherheits-Ausnahmeregel verboten.</string>\n    \n    <string name=\"PreferenceSslExceptionsTitle\">Sicherheits-Ausnahmeregel</string>\n    <string name=\"PreferenceSslExceptionsSummary\">Liste der Sicherheits-Ausnahmeregeln für Webseiten.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Entferne Ausnahme.</i></string>\n    <string name=\"SslExceptionEmptyText\">Keine Ausnahmen definiert.</string>\n    \n    <string name=\"RemoveSslExceptionTitle\">Ausnahmen entfernen</string>\n    <string name=\"RemoveSslExceptionMessage\">Sollen die Ausnahmen für diese Webseite entfernt werden?</string>\n    \n    <string name=\"SslInvalid\">Das Zertifikat ist ungültig.</string>\n    <string name=\"SslDateInvalid\">Das Datum des Zertifikats ist ungültig.</string>\n    \n    <string name=\"Authorized\">Zugelassen:</string>\n    <string name=\"Reasons\">Gründe:</string>\n    \n    <string name=\"SearchUrlDialogText1\">Aktuelle Suchmaschine:</string>\n    <string name=\"SearchUrlDialogText2\">Eine andere Suchmaschine kann aus den Vorschlägen ausgewählt werden.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Benutzerdefinierte Suchmaschine</a></string>    \n    <string name=\"SearchUrlConnecting\">Verbinden&#8230;</string>\n    <string name=\"SearchUrlParsing\">Ergebnisse verarbeiten&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Auf die Suchmaschinenvorschläge kann nicht zugegriffen werden (Fehler %s).</string>\n    \n    <string name=\"SearchUrlDefault\">Google Deutschland</string>\n    <string name=\"SearchUrlCustom\">Benutzerdefinierte Suchmaschine</string>\n    \n    <string name=\"SortBookmarks\">Lesezeichen sortieren</string>    \n    <string name=\"MostUsedSortMode\">Häufig verwendet</string>\n    <string name=\"AlphaSortMode\">Alphabetisch</string>\n    <string name=\"RecentSortMode\">Zuletzt besucht</string>\n\n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Ungültiges Dateiformat</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">Lese Ordner %1$s von %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">Verbinde Ordner&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">Lese Lesezeichen %1$s von %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">Lese Verlaufselement %1$s von %2$s.</string>\n    \n    <string name=\"FullScreen\">Vollbildmodus</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Vollbildmodus verlassen</string>\n       \n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">Startseite</string>\n\n    <string name=\"RestartDialogTitle\">Neustart erforderlich</string>\n    <string name=\"RestartDialogMessage\">Diese Änderung wird erst beim nächsten Start von Tint Browser aktiv. Jetzt neu starten?</string>\n    \n    <string name=\"ContentDescriptionTabPreview\">Reitervorschau</string>\n    \n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Navigation automatisch schließen</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">Auswählen, um die Navigation beim Öffnen eines neuen Reiters automatisch zu schließen.</string>\n    \n    <string name=\"AboutChangelogTitle\">Änderungen</string>\n    <string name=\"AboutContributorsTitle\">Mitwirkende</string>\n    <string name=\"AboutLicensesTitle\">Andere Lizenzen</string>\n    \n    <string name=\"RestoreTabsDialogTitle\">Reiter wiederherstellen</string>\n    <string name=\"RestoreTabsDialogMessage\">Sollen die Reiter der vorherigen Sitzung wiederhergestellt werden?</string>\n    \n    <string name=\"PreferenceRestoreTabsTitle\">Reiter wiederherstellen</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Auswählen, ob die Reiter der vorherigen Sitzung wiederhergestellt werden sollen.</string>\n    \n    <string name=\"PreferenceRestoreTabsAsk\">Beim Start nachfragen</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Immer</string>\n    <string name=\"PreferenceRestoreTabsNever\">Nie</string>\n    \n    <string-array name=\"PreferenceRestoreTabsEntries\">\n\t\t<item>@string/PreferenceRestoreTabsAsk</item>\n\t\t<item>@string/PreferenceRestoreTabsAlways</item>\n\t\t<item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceRestoreTabsValues\">\n\t\t<item>ASK</item>\n\t\t<item>ALWAYS</item>\n\t\t<item>NEVER</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUITypeTitle\">Benutzeroberfläche</string>\n    <string name=\"PreferenceUITypeSummary\">Verwende eine an den ausgewählten Gerätetyp angepasste Benutzeroberfläche.</string>\n    \n    <string name=\"PreferenceUITypeAuto\">Automatisch</string>\n    <string name=\"PreferenceUITypePhone\">Smartphone</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Smartphone (alt)</string>\n    <string name=\"PreferenceUITypeTablet\">Tablet</string>\n    \n    <string-array name=\"PreferenceUITypeEntries\">\n\t\t<item>@string/PreferenceUITypeAuto</item>\n\t\t<item>@string/PreferenceUITypePhone</item>\n\t\t<item>@string/PreferenceUITypeLegacyPhone</item>\n\t\t<item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceUITypeValues\">\n\t\t<item>AUTO</item>\n\t\t<item>PHONE</item>\n\t\t<item>LEGACY_PHONE</item>\n\t\t<item>TABLET</item>\n\t</string-array>\n\t\n    <!-- 1.8 -->\n    <string name=\"PreferenceDevelopersTitle\">Entwickler</string>\n    \n    <string name=\"PreferenceJsLogOnLocatTitle\">Anmelden JS Protokolle logcat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Lenken Sie die JS Protokolle an den logcat puffer.</string>\n\n</resources>"
  },
  {
    "path": "res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Tint Browser es un navegador web de código abierto para Android.</string>\n    \n    <string name=\"AboutVersionText\">Versión: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">Licencia: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    \n    <string name=\"PermissionReadBookmarksLabel\">Leer los marcadores de Tint Browser</string>\n    <string name=\"PermissionReadBookmarksDescription\">Permite que las aplicaciones o complementos third-party lean el historial y la base de datos de marcadores de Tint Browser.</string>\n    \n\t<string name=\"PermissionWriteBookmarksLabel\">Escribir los marcadores de Tint Browser</string>\n    <string name=\"PermissionWriteBookmarksDescription\">Permite que las aplicaciones o complementos third-party escribir en el historial y en la base de datos de marcadores de Tint Browser.</string>    \n    \n    <string name=\"PermissionBindAddonServiceLabel\">Enlazar con el servicio de complementos de Tint Browser</string>\n    <string name=\"PermissionBindAddonServiceDescription\">Permite que la aplicación enlace con los servicios de complementos de Tint Browser. Este permiso solo se otrogará a Tint Browser.</string>\n    \n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Cancelar</string>\n    <string name=\"Yes\">Sí</string>\n    <string name=\"No\">No</string>\n    <string name=\"On\">ON</string>\n    <string name=\"Off\">OFF</string>\n    <string name=\"Clear\">Limpiar</string>\n    <string name=\"Continue\">Continuar</string>\n    <string name=\"Proceed\">Proceder</string>\n    <string name=\"VideoLoading\">Cargando vídeo\\u2026</string>\n    <string name=\"History\">Historial</string>\n    <string name=\"All\">Todo</string>\n    <string name=\"Bookmarks\">Marcadores</string>\n    <string name=\"Preferences\">Ajustes</string>\n    \n    <string name=\"UrlBarUrlDefaultSubTitle\">Pulsa para introducir una URL o una búsqueda.</string>\n    <string name=\"UrlBarUrlHint\">Introduce una búsqueda o una URL</string>\n    \n    <string name=\"ShareChooserTitle\">Compartir vía</string>\n    <string name=\"FileChooserPrompt\">Elije un archivo para subir</string>\n    \n    <string name=\"Download\">Descargar</string>\n    <string name=\"DownloadDialogTitle\">Descargar</string>\n    <string name=\"DownloadInIncognito\">Descargar incognito</string>\n    <string name=\"DownloadStart\">Descargando %1$s&#8230;</string>\n    <string name=\"DownloadComplete\">Descarga completa.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">La descarga ha fallado: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Fallo de disco, comprueba que tienes unidades de almacenamiento y si tienes espacio suficiente.</string>\n    <string name=\"DownloadErrorHttp\">Fallo HTTP</string>\n    <string name=\"DownloadErrorRedirection\">Demasiadas redirecciones</string>\n    <string name=\"DownloadErrorUnknown\">Fallo desconocido</string>\n    \n    <string name=\"ContextMenuOpen\">Abrir</string>\n    <string name=\"ContextMenuOpenNewTab\">Abrir en una nueva pestaña</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Copiar la URL del enlace</string>\n    <string name=\"ContextMenuDownload\">Descargar</string>\n    <string name=\"ContextMenuShareLinkUrl\">Compartir enlace</string>\n    \n    <string name=\"ContextMenuViewImage\">Ver imagen</string>\n    <string name=\"ContextMenuCopyImageUrl\">Copiar la URL de la imagen</string>\n    <string name=\"ContextMenuDownloadImage\">Descargar imagen</string>\n    <string name=\"ContextMenuShareImageUrl\">Compartir imagen</string>\n    \n    <string name=\"ContextMenuSendEmail\">Enviar correo</string>\n    <string name=\"ContextMenuCopyEmailUrl\">Copiar la URL del correo</string>\n    <string name=\"ContextMenuShareEmailUrl\">Compartir correo</string>\n    \n    <string name=\"UrlCopyToastMessage\">Url copiada al portapapeles.</string>\n    <string name=\"ContextMenuShareUrl\">Compartir</string>\n    \n    <string name=\"JavaScriptAlertDialog\">Mensaje de alerta JavaScript</string>\n    <string name=\"JavaScriptConfirmDialog\">Mensaje de confirmación JavaScript</string>\n    <string name=\"JavaScriptPromptDialog\">Mensaje de aviso JavaScript</string>    \n\t\n\t<string name=\"SslWarning\">Alerta de seguridad</string>\n\t<string name=\"SslWarningsHeader\">Hay algún problema con el certificado de seguridad de este sitio (%s).</string>\n\t<string name=\"SslUntrusted\">Este certificado no fue emitido por una autoridad de confianza.</string>\n\t<string name=\"SslIDMismatch\">El nombre del sitio no coincide con el nombre del certificado.</string>\n\t<string name=\"SslExpired\">Este certificado ha expirado.</string>\n\t<string name=\"SslNotYetValid\">Este certificado ya no es válido.</string>    \n        \n    <string name=\"NewTab\">Nueva pestaña</string>\n        \n    <string name=\"CloseTab\">Cerrar la pestaña actual</string>\n    <string name=\"AddBookmark\">Añadir marcadores</string>\n    <string name=\"SharePage\">Compartir página</string>\n    <string name=\"Search\">Encontrar en la página</string>\n    \n    <string name=\"BookmarksTitle\">Marcadores &amp; Historial</string>\n    <string name=\"BookmarksTabTitle\">Marcadores</string>\n    <string name=\"HistoryTabTitle\">Historial</string>\n    \n    <string name=\"ImportHistoryBookmarks\">Importar</string>\n    <string name=\"ExportHistoryBookmarks\">Exportar</string>\n    <string name=\"ClearHistoryBookmarks\">Limpiar</string>\n    \n    <string name=\"AddBookmarkTitle\">Añadir a marcadores</string>\n    <string name=\"BookmarkText\">Etiqueta</string>\n    <string name=\"UrlText\">URL</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Por favor, introduce una etiqueta y una URL válidas.</string>\n    \n    <string name=\"OpenInTab\">Abrir en una nueva pestaña</string>\n    <string name=\"EditBookmark\">Editar marcador</string>\n    <string name=\"CopyUrl\">Copiar url</string>\n    <string name=\"DeleteBookmark\">Borrar marcador</string>\n    <string name=\"DeleteHistoryItem\">Borrar del historial</string>\n    \n    <string name=\"PreferencesActivityTitle\">Ajustes</string>\n        \n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">Ajustes generales</string>\n    \n    <string name=\"PreferenceGeneralHomepageTitle\">Página principal</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Selecciona la página que se cargará al abrir una nueva pestaña, etc.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Página principal</string>\n    \n    <string name=\"PreferenceGeneralSearchUrlTitle\">Motor de búsqueda</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Selecciona el motor de búsqueda que se usará como predetermindado para las búsquedas en la barra de direcciones.</string>\n    \n    <string name=\"PreferenceCategoryStartPageTitle\">Página de inicio</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Número de elementos en la página de inicio</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Establece el número de elementos que se mostrarán en la página de inicio.</string>\n    \n    <string name=\"PreferenceCategoryUITitle\">Interfaz de usuario</string>\n        \n    <string name=\"PreferenceBubblePositionTitle\">Posición de la burbuja</string>\n    <string name=\"PreferenceBubblePositionSummary\">Dónde situar la burbuja para que permita mostrar la barra de herramientas.</string>\n    \n    <string name=\"PreferenceBubblePositionRight\">Derecha</string>\n    <string name=\"PreferenceBubblePositionLeft\">Izquierda</string>\n    <string name=\"PreferenceBubblePositionBoth\">Ambas</string>\n    \n    <string-array name=\"PreferenceBubblePositionEntries\">\n\t\t<item>@string/PreferenceBubblePositionRight</item>\n\t\t<item>@string/PreferenceBubblePositionLeft</item>\n\t\t<item>@string/PreferenceBubblePositionBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceBubblePositionValues\">\n\t\t<item>RIGHT</item>\n\t\t<item>LEFT</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Duración de la barra de herramientas</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Establece cuántos segundos se muestra la barra de herramientas.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodTitle\">Método para cambiar de pestaña</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Establece como cambiar una pestaña por otra.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodButtons\">Botones</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Gesto</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Ambos</string>\n    \n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n\t\t<item>@string/PreferenceSwitchTabsMethodButtons</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodFling</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n\t\t<item>BUTTONS</item>\n\t\t<item>FLING</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n    \n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Ajustes del navegador</string>\n    \n    <string name=\"PreferenceEnableJavascriptTitle\">Habilitar JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript está habilitado.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript está deshabilitado.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Habilitar imágenes</string>\n    <string name=\"PreferenceEnableImagesSummary\">Márcala si quieres que se carguen las imágenes.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Usar pantalla completa</string>\n    <string name=\"PreferenceUseWideViewportSummary\">Si está marcada, el navegador usará una vista similar a la de los navegadores de escritorio.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Cargar páginas con visión general</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Márcala si quieres cargar las páginas alejadas para tener una visión general de la página.</string>\n    <string name=\"PreferencePluginsTitle\">Habilitar plugins</string>\n    <string name=\"PreferencePluginsSummary\">Elige cómo manejar los plugins.</string>\n    \n    <string name=\"PreferencePluginsAlwaysOff\">Siempre desactivados</string>\n    <string name=\"PreferencePluginsOnDemand\">Según necesidades</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Siempre activados</string>\n    \n    <string-array name=\"PreferencePluginsEntries\">\n\t\t<item>@string/PreferencePluginsAlwaysOff</item>\n\t\t<item>@string/PreferencePluginsOnDemand</item>\n\t\t<item>@string/PreferencePluginsAlwaysOn</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferencePluginsValues\">\n\t\t<item>OFF</item>\n\t\t<item>ON_DEMAND</item>\n\t\t<item>ON</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUserAgentTitle\">User-agent</string>\n    <string name=\"PreferenceUserAgentSummary\">Establece la cadena user-agent que usará el navegador.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">User-agent</string>\n    \n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Ajustes de privacidad y seguridad</string>\n    \n    <string name=\"PreferencePrivacyClearCacheTitle\">Limpiar caché</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Limpia las bases de datos y contenidos almacenados localmente.</string>\n        \n    <string name=\"PreferenceCategoryHistoryTitle\">Historial</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">Duración del historial</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Define la duración del historial, en días.</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Limpiar el historial</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Borra el historial de navegación.</string>\n        \n    <string name=\"PreferenceCategoryCookiesTitle\">Cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Aceptar cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Permite que los sitios almacenen y lean cookies.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Limpiar las cookies</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Elimina todas las cookies del navegador.</string>\n    \n    <string name=\"PreferenceCategoryGeolocationTitle\">ubicación</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Permitir ubicación</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Permite que los sitios soliciten acceso a tu ubicación.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Limpiar el acceso a la ubicación</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Elimina el acceso a la ubicación para todos los sitios web.</string>\n    \n    <string name=\"PreferenceCategoryFormDataTitle\">Formularios</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Recordar formularios</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Recuerda los datos que introduces en los formularios para usarlos más tarde.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Limpiar formularios</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Borra todos los datos de los formularios guardados.</string>\n    \n    <string name=\"PreferenceCategoryPasswordsTitle\">Contraseñas</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Recordar contraseñas</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Guarda los nombres de usuario y las contraseñas de los sitios web.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Limpiar contraseñas</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Borra todas las contraseñas guardadas.</string>\n    \n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Ajustes de sitios web</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Ajustes avanzados para sitios web individuales.</string>\n    \n    <string name=\"PreferencePrivacyIncognitoTitle\">Modo incognito</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Incognito por defecto</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Abrir nuevas pestañas en modo incógnito</string>\n    \n    <string name=\"HistoryToday\">Hoy</string>\n    <string name=\"HistoryYesterday\">Ayer</string>\n    <string name=\"HistoryLastSevenDays\">Últimos 7 días</string>\n    <string name=\"HistoryLastMonth\">Último mes</string>\n    <string name=\"HistoryOlder\">Anteriores</string>\n    \n    <string name=\"ClearCacheMessage\">Borrar el contenido y las bases de datos almacenados localmente?</string>\n    <string name=\"ClearHistoryMessage\">Borrar el historial de navegación?</string>\n    <string name=\"ClearCookiesMessage\">Borrar todas las cookies?</string>\n    <string name=\"ClearGeolocationMessage\">Eliminar los acceso a la ubicación de los sitios web?</string>\n    <string name=\"ClearFormDataMessage\">Borrar todos los formularios?</string>\n    <string name=\"ClearPasswordsMessage\">Borrar todas las contraseñas?</string>\n    \n    <string name=\"PreferenceHomepageStart\">Página de inicio</string>\n    <string name=\"PreferenceHomepageBlank\">Página en blanco</string>\n    <string name=\"PreferenceHomepageCustom\">Página personalizada</string>\n    \n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n    \n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">Desktop</string>\n    <string name=\"PreferenceUserAgentOther\">Other</string>\n    \n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n    \n    <string name=\"SearchUrlGoogle\">http://www.google.es/m?q={searchTerms}</string>\n    \n    <string name=\"PreferenceHeaderAddonsTitle\">Complementos</string>    \n    \n    <string name=\"PreferenceHeaderAboutTitle\">Acerca de</string>\n    \n    <string name=\"HttpAuthenticationDialogDialogTitle\">Iniciar sesión en %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Nombre</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Contraseña</string>\n    \n    <string name=\"FormResubmitTitle\">Reenviar formulario</string>\n    <string name=\"FormResubmitMessage\">La página que estás intentando visitar contiene datos que ya has enviado (\\\"POSTDATA\\\"). Si reenvias estos datos, cualquier acción que dependa del formulario (como una búsqueda o una compra) se repetirá.</string>\n    \n    <string name=\"BookmarkAdded\">Añadido a marcadores.</string>\n    <string name=\"BookmarkRemoved\">Eliminado de marcadores.</string>\n    \n    <string name=\"SDCardErrorNoSDMsg\">No se ha encontrado una tarjeta SD.</string>\n    <string name=\"SDCardErrorSDUnavailable\">La tarjeta SD no está disponible.</string>\n    \n    <string name=\"HistoryBookmarksClearTitle\">Limpiar</string>\n    \n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n    \n    <string name=\"HistoryBookmarksImportSourceTitle\">Importar fichero</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Archivo no disponible, o bien no existe o no se puede leer.</string>\n    <string name=\"HistoryBookmarksImportTitle\">Importar historial y marcadores</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">Importando historial y marcadores&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">Leyendo fichero&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">Analizando fichero&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">Leyendo elemento %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">Insertando valores&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Error durante la importación</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">Ha ocurrido un fallo con la importación del historial y marcadores: %s</string>\n    \n    <string name=\"HistoryBookmarksExportTitle\">Exportar historial y marcadores</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">Exportando historial y marcadores&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">Comprobando el almacenamiento externo&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">Exportando elemento %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Error durante la exportación</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">Ha ocurrido un fallo con la exportación del historial y marcadores: %s</string>\n    \n    <string name=\"GeolocationTitle\">Solicitud de ubicación</string>\n    <string name=\"GeolocationMessage\">La web %s solicita acceso a tu ubicación.</string>    \n    <string name=\"GeolocationAccept\">Aceptar</string>\n    <string name=\"GeolocationDecline\">Rechazar</string>\n    \n    <string name=\"WebsitesSettingsEmpty\">No hay ajustes para los sitios web.</string>\n    \n    <string name=\"WebsitesSettingsSiteTitle\">Ajustes para %s</string>\n    \n    <string name=\"WebsitesSettingsDataUsage\">%s MB almacenados en tu dispositivo.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Pulsa para eliminar los datos almacenados.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Borrar datos</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Eliminar todos los datos almacenados por esta web?</string>\n    \n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Pulsa para eliminar el acceso a tu localización.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">Este sitio puede acceder a tu ubicación.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">Este sitio no puede acceder a tu ubicación.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Eliminar el acceso a tu ubicación</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Eliminar el acceso a tu ubicación para esta web?</string>\n    \n    <string name=\"AddonsWarningText\">Por favor, instala solo complementos de desarrolladores de tu confianza. Si experimentas comportamientos extraños, desactiva todos los complementos.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Conseguir complementos</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">No se ha encontrado Google Play</string>\n    <string name=\"AddonsMarketNotFoundMessage\">Todo apunta a que no tienes instalada la aplicación de Google Play en tu dispositivo.</string>\n    <string name=\"AddonsEnableAll\">Activar todo</string>\n    <string name=\"AddonsDisableAll\">Desactivar todo</string>\n    \n    <string name=\"AddonDetailsContact\">Contacto: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">Este complemento:</string>\n    \n    <string name=\"AddonCallbackPageStarted\">Se notifica cuando una página comienza a cargarse.</string>\n    <string name=\"AddonCallbackPageFinished\">Se notifica cuando una página termina de cargarse.</string>\n    <string name=\"AddonCallbackTabOpened\">Se notifica cuando una pestaña se abre.</string>\n    <string name=\"AddonCallbackTabClosed\">Se notifica cuando una pestaña se cierra.</string>\n    <string name=\"AddonCallbackTabSwitched\">Se notifica cuando se cambia entre pestañas.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">Tiene una página de ajustes.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Puede contribuir al menú principal.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Puede contribuir al menú contextual de enlaces.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Puede contribuir al menú de historial y marcadores.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Puede contribuir al menú contextual de marcadores.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Puede contribuir al menú contextual de historial.</string>\n    \n    <string name=\"AddonDetailsUsedPermissionsTitle\">Tiene los siguientes permisos:</string>\n    <string name=\"AddonDetailsPermissionsNone\">Ninguno.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Incapaz de conseguir los permisos. Compruébalos con el gestor de aplicaciones de tu dispositivo.</string>\n    \n    <string name=\"ContentDescriptionDivider\">separador</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Icono de la aplicación</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Icono de sugerencia</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Miniatura de marcadores</string>\n    <string name=\"ContentDescriptionFavicon\">Favicon de la web</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Botón de Ir / Alto / Recargar</string>\n    <string name=\"ContentDescriptionMenuButton\">Botón de Menú</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Botón de Pestaña previa</string>\n    <string name=\"ContentDescriptionNextTabButton\">Botón de Pestaña siguiente</string>\n    <string name=\"ContentDescriptionLeftBubble\">Burbuja a la izquierda</string>\n    <string name=\"ContentDescriptionRightBubble\">Burbuja a la derecha</string>\n    <string name=\"ContentDescriptionBackButton\">Botón de Atrás</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Botón de Cerrar pestaña</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Botón de Marcadores</string>\n    <string name=\"ContentDescriptionNewTabButton\">Botón de Pestaña nueva</string>\n    <string name=\"ContentDescriptionForwardButton\">Botón de Adelante</string>\n    <string name=\"ContentDescriptionHomeButton\">Botón de Inicio</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Ubicación del sitio</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Uso del sitio</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Características del sitio</string>\n    \n    <string-array name=\"DefaultBookmarksTitles\">\n\t\t<item>Google</item>\n\t\t<item>Wikipedia</item>\n\t\t<item>YouTube</item>\n\t\t<item>Yahoo!</item>\n\t\t<item>BBC</item>\n\t\t<item>eBay</item>\n\t</string-array>\n\t\n    <string-array name=\"DefaultBookmarksUrls\">\n\t\t<item>http://www.google.com/</item>\n\t\t<item>http://en.wikipedia.org/</item>\n\t\t<item>http://www.youtube.com/</item>\n\t\t<item>http://www.yahoo.com/</item>\n\t\t<item>http://www.bbc.co.uk/</item>\n\t\t<item>http://www.ebay.com/</item>\n\t</string-array>\n\t\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">Pestaña  de incógnito</string>\n    <string name=\"ContextMenuOpenInBackground\">Abrir en segundo plano</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Indicador de navegación privada</string>\n    \n    <!-- 1.3 -->\n    <string name=\"Folder\">Carpeta</string>\n    <string name=\"NewFolder\">Nueva carpeta</string>    \n    <string name=\"NewFolderHint\">Nombre de la nueva carpeta</string>\n    <string name=\"ProvideNewFolderName\">Por favor, dale un nombre a la nueva carpeta o selecciona una que ya exista.</string>\n    \n    <string name=\"DeleteFolder\">Eliminar carpeta</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Eliminar esta carpeta y todo su contenido?</string>\n    <string name=\"DeleteFolderTitle\">Borrando carpeta</string>\n    <string name=\"DeleteFolderMessage\">Por favor, espera mientras la carpeta y su contenido son borrados&#8230;</string>\n    \n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Subir en la jerarquía de la carpeta de marcadores</string>\n    \n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Ajustes de accesibilidad</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Tamaño del texto</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Vista previa del tamaño del texto</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Escalando el texto</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Tamaño mínimo de fuente</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Establece el tamaño mínimo de fuente que se usará para mostrar el texto en el navegador.</string>\n    \n    <string name=\"FontPreviewTextTiny\">Minúsculo</string>\n    <string name=\"FontPreviewTextSmall\">Pequeño</string>\n    <string name=\"FontPreviewTextNormal\">Normal</string>\n    <string name=\"FontPreviewTextLarge\">Grande</string>\n    <string name=\"FontPreviewTextHuge\">Enorme</string>\n    \n    <string-array name=\"FontPreviewText\">\n\t\t<item>@string/FontPreviewTextTiny</item>\n\t\t<item>@string/FontPreviewTextSmall</item>\n\t\t<item>@string/FontPreviewTextNormal</item>\n\t\t<item>@string/FontPreviewTextLarge</item>\n\t\t<item>@string/FontPreviewTextHuge</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Presentación de pantalla invertida</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Presentación invertida</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Invierte los colores de la pantalla. Esto puede que no funcione en todos los dispositivos.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Contraste</string>\n    \n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">Pon la url de la sugerencia en la barra de direcciones, sin tener que navegar en ella.</string>\n    \n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">autoridad desconocida</string>\n    <string name=\"RememberMyChoice\">Recordar mi elección</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">Excepción de seguridad SSL: Acceso permitido a %s por el usuario.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">Excepción de seguridad SSL: Acceso denegado a %s por el usuario.</string>\n    \n    <string name=\"PreferenceSslExceptionsTitle\">Excepciones de seguridad SSL</string>\n    <string name=\"PreferenceSslExceptionsSummary\">Lista de excepciones de seguridad SSL por sitios web.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Pulsa para eliminar la excepción.</i></string>\n    <string name=\"SslExceptionEmptyText\">No tienes ninguna excepción de seguridad SSL.</string>\n    \n    <string name=\"RemoveSslExceptionTitle\">Eliminar excepción</string>\n    <string name=\"RemoveSslExceptionMessage\">Quieres eliminar la excepción de seguridad para esta web?</string>\n    \n    <string name=\"SslInvalid\">Este certificado no es válido.</string>\n    <string name=\"SslDateInvalid\">La fecha de este certificado no es válida.</string>\n    \n    <string name=\"Authorized\">Autorizado:</string>\n    <string name=\"Reasons\">Razones:</string>\n    \n    <string name=\"SearchUrlDialogText1\">Tu motor de búsqueda actual es:</string>\n    <string name=\"SearchUrlDialogText2\">Puedes personalizarlo seleccionando un motor de búsqueda de los que se proponen a continuación.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Editar manualmente el motor de búsqueda</a></string>    \n    <string name=\"SearchUrlConnecting\">Conectando&#8230;</string>\n    <string name=\"SearchUrlParsing\">Analizando resultados&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Incapaz de conectar con el repositorio de motores de búsqueda (código de respuesta: %s).</string>\n    \n    <string name=\"SearchUrlDefault\">Google.es</string>\n    <string name=\"SearchUrlCustom\">Motor de búsqueda personalizado</string>\n    \n    <string name=\"SortBookmarks\">Mostrar marcadores</string>    \n    <string name=\"MostUsedSortMode\">Más usados</string>\n    <string name=\"AlphaSortMode\">Alfabéticamente</string>\n    <string name=\"RecentSortMode\">Más visitados recientemente</string>\n\n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Formato de fichero incorrecto</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">Leyendo fichero %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">Enlazando carpetas&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">Leyendo marcadores %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">Leyendo elemento del historial %1$s de %2$s.</string>\n    \n    <string name=\"FullScreen\">Pantalla completa</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Botón de Salir de pantalla completa</string>\n    \n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">Página de inicio</string>\n\n    <string name=\"RestartDialogTitle\">Se necesita reiniciar</string>\n    <string name=\"RestartDialogMessage\">Este cambio puede que no surta efecto hasta que la aplicación se reinicie. Quieres hacerlo ahora?</string>\n    \n    <string name=\"ContentDescriptionTabPreview\">Vista previa de la pestaña</string>\n    \n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Cerrar el panel lateral en la nueva pestaña</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">Si está marcado, el panel lateral se cerrará cuando se abra una nueva pestaña.</string>\n    \n    <string name=\"AboutChangelogTitle\">Changelog</string>\n    <string name=\"AboutContributorsTitle\">Colaboradores</string>\n    <string name=\"AboutLicensesTitle\">Otras licencias</string>\n    \n    <string name=\"RestoreTabsDialogTitle\">Restauración de pestañas</string>\n    <string name=\"RestoreTabsDialogMessage\">Quieres restaurar las pestañas de tus sesiones previas?</string>\n    \n    <string name=\"PreferenceRestoreTabsTitle\">Restauración de pestañas</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Selecciona cómo quieres que se restauren las pestañas de una sesión previa.</string>\n    \n    <string name=\"PreferenceRestoreTabsAsk\">Preguntar</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Siempre</string>\n    <string name=\"PreferenceRestoreTabsNever\">Nunca</string>\n    \n    <string-array name=\"PreferenceRestoreTabsEntries\">\n\t\t<item>@string/PreferenceRestoreTabsAsk</item>\n\t\t<item>@string/PreferenceRestoreTabsAlways</item>\n\t\t<item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceRestoreTabsValues\">\n\t\t<item>ASK</item>\n\t\t<item>ALWAYS</item>\n\t\t<item>NEVER</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUITypeTitle\">Tipo de UI</string>\n    <string name=\"PreferenceUITypeSummary\">Selecciona el tipo de interfaz de usuario.</string>\n    \n    <string name=\"PreferenceUITypeAuto\">Automático</string>\n    <string name=\"PreferenceUITypePhone\">Teléfono</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Teléfono (heredado)</string>\n    <string name=\"PreferenceUITypeTablet\">Tableta</string>\n    \n    <string-array name=\"PreferenceUITypeEntries\">\n\t\t<item>@string/PreferenceUITypeAuto</item>\n\t\t<item>@string/PreferenceUITypePhone</item>\n\t\t<item>@string/PreferenceUITypeLegacyPhone</item>\n\t\t<item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceUITypeValues\">\n\t\t<item>AUTO</item>\n\t\t<item>PHONE</item>\n\t\t<item>LEGACY_PHONE</item>\n\t\t<item>TABLET</item>\n\t</string-array>\n    \n    <!-- 1.8 -->\n    <string name=\"PreferenceDevelopersTitle\">Desarrolladores</string>\n    \n    <string name=\"PreferenceJsLogOnLocatTitle\">Entrar registros JS a Logcat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Redireccionar los registros de JS en el búfer Logcat.</string>\n    \n</resources>"
  },
  {
    "path": "res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Tint Browser est un navigateur open-source pour Android.</string>\n    \n    <string name=\"AboutVersionText\">Version: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">Licence: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    \n    <string name=\"PermissionReadBookmarksLabel\">Lire les favoris de Tint Browser</string>\n    <string name=\"PermissionReadBookmarksDescription\">Autorise les applications tierces ou les addons à lire l\\'historique et les favoris de Tint Browser.</string>\n    \n\t<string name=\"PermissionWriteBookmarksLabel\">Ecrire les favoris de Tint Browser</string>\n    <string name=\"PermissionWriteBookmarksDescription\">Autorise les applications tierces ou les addons à écrire dans l\\'historique et les favoris de Tint Browser.</string>    \n    \n    <string name=\"PermissionBindAddonServiceLabel\">Se connecter aux services des addons de Tint Browser</string>\n    <string name=\"PermissionBindAddonServiceDescription\">Autorise une application à se connecter aux services des addons de Tint Browser. Seulement Tint Browser lui-même devrai utiliser cette permission.</string>\n    \n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Annuler</string>\n    <string name=\"Yes\">Oui</string>\n    <string name=\"No\">Non</string>\n    <string name=\"On\">ON</string>\n    <string name=\"Off\">OFF</string>\n    <string name=\"Clear\">Clear</string>\n    <string name=\"Continue\">Continuer</string>\n    <string name=\"Proceed\">Continuer</string>\n    <string name=\"VideoLoading\">Chargement de la vidéo\\u2026</string>\n    <string name=\"History\">Historique</string>\n    <string name=\"All\">Tout</string>\n    <string name=\"Bookmarks\">Favoris</string>\n    <string name=\"Preferences\">Paramètres</string>\n    \n    <string name=\"UrlBarUrlDefaultSubTitle\">Toucher pour rentrer une adresse.</string>\n    <string name=\"UrlBarUrlHint\">Tapez une adresse ou une recherche</string>\n    \n    <string name=\"ShareChooserTitle\">Partager via</string>\n    <string name=\"FileChooserPrompt\">Choisissez le fichier à uploader</string>\n    \n    <string name=\"Download\">Télécharger</string>\n    <string name=\"DownloadDialogTitle\">Téléchargement</string>\n    <string name=\"DownloadInIncognito\">Téléchargement icognito</string>\n    <string name=\"DownloadStart\">Téléchargement de %1$s&#8230;</string>\n    <string name=\"DownloadComplete\">Téléchargement terminé.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">Téléchargement échoué: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Erreur disque, vérifier si vous avez un espace de stockage, et s\\'il n\\'est pas plein.</string>\n    <string name=\"DownloadErrorHttp\">Erreur HTTP</string>\n    <string name=\"DownloadErrorRedirection\">Trop de redirections</string>\n    <string name=\"DownloadErrorUnknown\">Erreur inconue</string>\n    \n    <string name=\"ContextMenuOpen\">Ouvrir</string>\n    <string name=\"ContextMenuOpenNewTab\">Ouvrir dans un nouvel onglet</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Copier l\\'adresse du lien</string>\n    <string name=\"ContextMenuDownload\">Télécharger</string>\n    <string name=\"ContextMenuShareLinkUrl\">Partager le lien</string>\n    \n    <string name=\"ContextMenuViewImage\">Voir l\\'image</string>\n    <string name=\"ContextMenuCopyImageUrl\">Copier l\\'adresse de l\\'image</string>\n    <string name=\"ContextMenuDownloadImage\">Télécharger l\\'image</string>\n    <string name=\"ContextMenuShareImageUrl\">Partager l\\'image</string>\n    \n    <string name=\"ContextMenuSendEmail\">Envoyer un email</string>\n    <string name=\"ContextMenuCopyEmailUrl\">Copier l\\'adresse email</string>\n    <string name=\"ContextMenuShareEmailUrl\">Partager l\\'adresse email</string>\n    \n    <string name=\"UrlCopyToastMessage\">L\\'adresse a été copiée dans le presse-papier.</string>\n    <string name=\"ContextMenuShareUrl\">Partager</string>\n    \n    <string name=\"JavaScriptAlertDialog\">Fenêtre JavaScript</string>\n    <string name=\"JavaScriptConfirmDialog\">Fenêtre de confirmation JavaScript</string>\n    <string name=\"JavaScriptPromptDialog\">Fenêtre de saisie JavaScript</string>    \n\t\n\t<string name=\"SslWarning\">Avertissement de sécurité</string>\n\t<string name=\"SslWarningsHeader\">Il y a des problèmes avec le certificat de sécurité de ce site (%s).</string>\n\t<string name=\"SslUntrusted\">Le certificat ne vient pas d\\'une autorité certifiée.</string>\n\t<string name=\"SslIDMismatch\">Le nom du site ne correspond pas au nom dans le certificat.</string>\n\t<string name=\"SslExpired\">Le certificat a expiré.</string>\n\t<string name=\"SslNotYetValid\">Le certificat n\\'est pas encore valide.</string>    \n        \n    <string name=\"NewTab\">Nouvel onglet</string>\n        \n    <string name=\"CloseTab\">Fermer l\\'onglet courant</string>\n    <string name=\"AddBookmark\">Ajouter un favori</string>\n    <string name=\"SharePage\">Partager la page</string>\n    <string name=\"Search\">Chercher sur la page</string>\n    \n    <string name=\"BookmarksTitle\">Favoris &amp; Historique</string>\n    <string name=\"BookmarksTabTitle\">Favoris</string>\n    <string name=\"HistoryTabTitle\">Historique</string>\n    \n    <string name=\"ImportHistoryBookmarks\">Importer</string>\n    <string name=\"ExportHistoryBookmarks\">Exporter</string>\n    <string name=\"ClearHistoryBookmarks\">Purger</string>\n    \n    <string name=\"AddBookmarkTitle\">Ajouter un favori</string>\n    <string name=\"BookmarkText\">Libellé</string>\n    <string name=\"UrlText\">Addresse</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Veillez fournir un libellé et une adresse valide.</string>\n    \n    <string name=\"OpenInTab\">Ouvrir dans un nouvel onglet</string>\n    <string name=\"EditBookmark\">Modifier le favori</string>\n    <string name=\"CopyUrl\">Copier l\\'adresse du lien</string>\n    <string name=\"DeleteBookmark\">Supprimer le favori</string>\n    <string name=\"DeleteHistoryItem\">Supprimer de l\\'historique</string>\n    \n    <string name=\"PreferencesActivityTitle\">Paramètres</string>\n        \n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">Généraux</string>\n    \n    <string name=\"PreferenceGeneralHomepageTitle\">Page d\\'accueil</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Définir la page d\\'accueil, utilisée lors de l\\'ouverture d\\'un nouvel onglet, etc.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Page d\\'accueil</string>\n    \n    <string name=\"PreferenceGeneralSearchUrlTitle\">Moteur de recherche</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Définir le moteur de recherche utilisé lors d\\'une recherche depuis la barre d\\'adresse.</string>\n    \n    <string name=\"PreferenceCategoryStartPageTitle\">Page de démarrage</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Nombre d\\'éléments dans la page de démarrage</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Définir le nombre d\\'élements à afficher dans la page de démarrage.</string>\n    \n    <string name=\"PreferenceCategoryUITitle\">Interface utilisateur</string>\n        \n    <string name=\"PreferenceBubblePositionTitle\">Position de la bulle</string>\n    <string name=\"PreferenceBubblePositionSummary\">Définir la position de la bulle permettant d\\'afficher les barres d\\'outils.</string>\n    \n    <string name=\"PreferenceBubblePositionRight\">A droite</string>\n    <string name=\"PreferenceBubblePositionLeft\">A gauche</string>\n    <string name=\"PreferenceBubblePositionBoth\">Les deux</string>\n    \n    <string-array name=\"PreferenceBubblePositionEntries\">\n\t\t<item>@string/PreferenceBubblePositionRight</item>\n\t\t<item>@string/PreferenceBubblePositionLeft</item>\n\t\t<item>@string/PreferenceBubblePositionBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceBubblePositionValues\">\n\t\t<item>RIGHT</item>\n\t\t<item>LEFT</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Durée d\\'affichage des barres d\\'outils</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Définir la durée d\\'affichage des barres d\\'outils, en secondes.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodTitle\">Méthode de changement d\\'onglets</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Définir comment vous pouvez changer d\\'onglets.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodButtons\">Boutons</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Geste</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Les deux</string>\n    \n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n\t\t<item>@string/PreferenceSwitchTabsMethodButtons</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodFling</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n\t\t<item>BUTTONS</item>\n\t\t<item>FLING</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n    \n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Navigateur</string>\n    \n    <string name=\"PreferenceEnableJavascriptTitle\">Activer JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">Le JavaScript est activé.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">Le JavaScript est désactivé.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Charger les images</string>\n    <string name=\"PreferenceEnableImagesSummary\">Afficher les images des pages Web.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Utiliser une vue large</string>\n    <string name=\"PreferenceUseWideViewportSummary\">Activer pour que le navigateur utilise une vue large similaire aux navigateurs de bureaux.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Charger les pages avec une vue d\\'ensemble</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Activer pour que les pages affichent une vue d\\'ensemble lors du chargement.</string>\n    <string name=\"PreferencePluginsTitle\">Activer les plugins</string>\n    <string name=\"PreferencePluginsSummary\">Définir comment sont activés les plugins.</string>\n    \n    <string name=\"PreferencePluginsAlwaysOff\">Toujours desactivés</string>\n    <string name=\"PreferencePluginsOnDemand\">A la demande</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Toujours activés</string>\n    \n    <string-array name=\"PreferencePluginsEntries\">\n\t\t<item>@string/PreferencePluginsAlwaysOff</item>\n\t\t<item>@string/PreferencePluginsOnDemand</item>\n\t\t<item>@string/PreferencePluginsAlwaysOn</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferencePluginsValues\">\n\t\t<item>OFF</item>\n\t\t<item>ON_DEMAND</item>\n\t\t<item>ON</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUserAgentTitle\">User-agent</string>\n    <string name=\"PreferenceUserAgentSummary\">Définir la chaîne user-agent utilisée par la navigateur.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">User-agent</string>\n    \n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Confidentialité &amp; sécurité</string>\n    \n    <string name=\"PreferencePrivacyClearCacheTitle\">Vider le cache</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Supprimer les bases de données et le contenu localement en cache.</string>\n        \n    <string name=\"PreferenceCategoryHistoryTitle\">Historique</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">Taille de l\\'historique</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Définir la taille de l\\'historique, en jours.</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Effacer l\\'historique</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Effacer l\\'historique du navigateur.</string>\n        \n    <string name=\"PreferenceCategoryCookiesTitle\">Cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Accepter les cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Autoriser les sites à enregistrer les données des cookies et à les lire.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Effacer les cookies</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Effacer tous les cookies du navigateur.</string>\n    \n    <string name=\"PreferenceCategoryGeolocationTitle\">Lieu</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Activer la localisation</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Autoriser les sites à demander l\\'accès à vos données de localisation.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Supprimer l\\'accès</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Supprimer l\\'accès aux données de localisation pour tous les sites Web.</string>\n    \n    <string name=\"PreferenceCategoryFormDataTitle\">Données de formulaires</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Données de formulaires</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Mémoriser les données saisies dans les formulaires pour les réutiliser.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Effacer les données de formulaires</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Effacer toutes les données de formulaires enregistrées.</string>\n    \n    <string name=\"PreferenceCategoryPasswordsTitle\">Mots de passe</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Mémoriser les mots de passe</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Enregistrer les noms d\\'utilisateur et les mots de passe pour les sites Web.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Effacer les mots de passe</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Effacer tous les mots de passe enregistrés.</string>\n    \n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Paramètres des sites Web</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Paramètres avancés de sites Web individuels.</string>\n    \n    <string name=\"PreferencePrivacyIncognitoTitle\">Mode incognito</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Incognito par défaut</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Ouvrir les nouveaux onglets en mode incognito</string>\n    \n    <string name=\"HistoryToday\">Aujourd\\'hui</string>\n    <string name=\"HistoryYesterday\">Hier</string>\n    <string name=\"HistoryLastSevenDays\">Les 7 derniers jours</string>\n    <string name=\"HistoryLastMonth\">Le mois dernier</string>\n    <string name=\"HistoryOlder\">Précédemment</string>\n    \n    <string name=\"ClearCacheMessage\">Supprimer les bases de données et le contenu mis en cache localement ?</string>\n    <string name=\"ClearHistoryMessage\">Supprimer l\\'historique de navigation ?</string>\n    <string name=\"ClearCookiesMessage\">Supprimer tous les cookies ?</string>\n    <string name=\"ClearGeolocationMessage\">Supprimer l\\'accès des sites aux données de localisation ?</string>\n    <string name=\"ClearFormDataMessage\">Supprimer toutes les données de formulaire enregistrées ?</string>\n    <string name=\"ClearPasswordsMessage\">Supprimer tous les mots de passe enregistrés ?</string>\n    \n    <string name=\"PreferenceHomepageStart\">Page de démarrage</string>\n    <string name=\"PreferenceHomepageBlank\">Page vierge</string>\n    <string name=\"PreferenceHomepageCustom\">Page personalisée</string>\n    \n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n    \n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">Ordinateur de bureau</string>\n    <string name=\"PreferenceUserAgentOther\">Autre</string>\n    \n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n    \n    <string name=\"SearchUrlGoogle\">http://www.google.fr/m?q={searchTerms}</string>\n    \n    <string name=\"PreferenceHeaderAddonsTitle\">Addons</string>    \n    \n    <string name=\"PreferenceHeaderAboutTitle\">A propos</string>\n    \n    <string name=\"HttpAuthenticationDialogDialogTitle\">Se connecter à %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Nom</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Mot de passe</string>\n    \n    <string name=\"FormResubmitTitle\">Ressoumission de formulaire</string>\n    <string name=\"FormResubmitMessage\">La page que vous essayer de voir contient des données qui ont déjà été soumisent (\\\"POSTDATA\\\"). Si vous ré-envoyez ces données, toutes action que la page a effectuée (comme une recherche ou un achat en ligne) sera répétée.</string>\n    \n    <string name=\"BookmarkAdded\">Ajouté aux favoris</string>\n    <string name=\"BookmarkRemoved\">Supprimé des favoris</string>\n    \n    <string name=\"SDCardErrorNoSDMsg\">Carte SD non trouvée.</string>\n    <string name=\"SDCardErrorSDUnavailable\">Carte SD non disponible.</string>\n    \n    <string name=\"HistoryBookmarksClearTitle\">Purger</string>\n    \n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n    \n    <string name=\"HistoryBookmarksImportSourceTitle\">Importer un fichier</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Fichier inaccessible, il n\\'existe pas ou n\\'est pas lisible.</string>\n    <string name=\"HistoryBookmarksImportTitle\">Import de l\\'historique et des favoris</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">Import de l\\'historique et des favoris en cours&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">Lecture du fichier&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">Analyse du fichier&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">Import de l\\'élément %1$s sur %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">Insertion des valeurs&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Erreur pendant l\\'import</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">Une erreur s\\'est produite pendant l\\'import de l\\'historique et des favoris : %s</string>\n    \n    <string name=\"HistoryBookmarksExportTitle\">Export de l\\'historique et des favoris</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">Export de l\\'historique et des favoris en cours&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">Vérification du stockage externe&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">Export de l\\'élément %1$s sur %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Erreur pendant l\\'export</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">Une erreur s\\'est produite pendant l\\'export de l\\'historique et des favoris : %s</string>\n    \n    <string name=\"GeolocationTitle\">Demande de localisation</string>\n    <string name=\"GeolocationMessage\">Le site %s souhaite connêtre votre position géographique.</string>    \n    <string name=\"GeolocationAccept\">Accepter</string>\n    <string name=\"GeolocationDecline\">Refuser</string>\n    \n    <string name=\"WebsitesSettingsEmpty\">Pas de paramètres pour les sites Web.</string>\n    \n    <string name=\"WebsitesSettingsSiteTitle\">Paramètres pour %s</string>\n    \n    <string name=\"WebsitesSettingsDataUsage\">%s MB stockés sur votre appareil.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Cliquez pour supprimer les données stockées.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Supprimer les données</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Supprimer toutes les données stockées par ce site Web ?</string>\n    \n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Cliquez pour supprimer l\\'accès aux données de localisation.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">Ce site peut accéder à votre position géographique.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">Ce site ne peut pas accéder à votre position géographique.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Supprimer l\\'accès aux données de localisation</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Supprimer l\\'accès aux données de localisation pour ce site Web ?</string>\n    \n    <string name=\"AddonsWarningText\">N\\'installez que des addons provenant de développeurs de confiance. Si vous rencontrez des comportements étranges, désactivez tous vos addons.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Obtenir des addons</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Android Market non trouvé</string>\n    <string name=\"AddonsMarketNotFoundMessage\">Vous ne semblez pas avoir l\\'application Android Market sur votre appareil.</string>\n    <string name=\"AddonsEnableAll\">Tout activer</string>\n    <string name=\"AddonsDisableAll\">Tout désactiver</string>\n    \n    <string name=\"AddonDetailsContact\">Contact : %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">Cet addon :</string>\n    \n    <string name=\"AddonCallbackPageStarted\">Est notifié quand une page commence à se charger.</string>\n    <string name=\"AddonCallbackPageFinished\">Est notifié quand une page a fini de se charger.</string>\n    <string name=\"AddonCallbackTabOpened\">Est notifié quand un onglet est ouvert.</string>\n    <string name=\"AddonCallbackTabClosed\">Est notifié quand un onglet est fermé.</string>\n    <string name=\"AddonCallbackTabSwitched\">Est notifié lors d\\'un changement d\\'onglet.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">A une page de paramètres.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Peut contribuer au menu principal.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Peut contribuer au menu contextuel d\\'un lien.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Peut contribuer au menu des favoris et de l\\'historique.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Peut contribuer au menu contextuel des favoris.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Peut contribuer au menu contextuel de l\\'historique.</string>\n    \n    <string name=\"AddonDetailsUsedPermissionsTitle\">A les permissions suivantes :</string>\n    <string name=\"AddonDetailsPermissionsNone\">Aucune.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Impossible de lire les permissions. Vérifier les avec le gestionnaire d\\'applications de votre appareil.</string>\n    \n    <string name=\"ContentDescriptionDivider\">divider</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Icône de l\\'application</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Icône de suggestion</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Image de favori</string>\n    <string name=\"ContentDescriptionFavicon\">Icône du site Web</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Bouton Aller à / Stop / Recharger</string>\n    <string name=\"ContentDescriptionMenuButton\">Bouton Menu</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Bouton onglet précédent</string>\n    <string name=\"ContentDescriptionNextTabButton\">Bouton onglet suivant</string>\n    <string name=\"ContentDescriptionLeftBubble\">Bulle gauche</string>\n    <string name=\"ContentDescriptionRightBubble\">Bulle droite</string>\n    <string name=\"ContentDescriptionBackButton\">Bouton précédent</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Bouton fermer l\\'onglet</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Bouton des favoris</string>\n    <string name=\"ContentDescriptionNewTabButton\">Bouton nouvel onglet</string>\n    <string name=\"ContentDescriptionForwardButton\">Bouton suivant</string>\n    <string name=\"ContentDescriptionHomeButton\">Bouton home</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Website location</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Website usage</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Website feature</string>\n    \n    <string-array name=\"DefaultBookmarksTitles\">\n\t\t<item>Google</item>\n\t\t<item>Wikipedia</item>\n\t\t<item>YouTube</item>\n\t\t<item>Yahoo!</item>\n\t\t<item>Le Monde</item>\n\t\t<item>eBay</item>\n\t</string-array>\n\t\n    <string-array name=\"DefaultBookmarksUrls\">\n\t\t<item>http://www.google.fr/</item>\n\t\t<item>http://fr.wikipedia.org/</item>\n\t\t<item>http://www.youtube.fr/</item>\n\t\t<item>http://www.yahoo.fr/</item>\n\t\t<item>http://mobile.lemonde.fr/</item>\n\t\t<item>http://www.ebay.fr/</item>\n\t</string-array>\n\t\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">Onglet incognito</string>\n    <string name=\"ContextMenuOpenInBackground\">Ouvrir en arrière plan</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Indicateur de navigation privée</string>\n    \n    <!-- 1.3 -->\n    <string name=\"Folder\">Dossier</string>\n    <string name=\"NewFolder\">Nouveau dossier</string>    \n    <string name=\"NewFolderHint\">Nom du nouveau dossier</string>\n    <string name=\"ProvideNewFolderName\">Veillez fournir un nom pour le nouveau dossier, ou choisissez en un existant.</string>\n    \n    <string name=\"DeleteFolder\">Supprimer le dossier</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Supprimer ce dossier et l\\'ensemble de son contenu ?</string>\n    <string name=\"DeleteFolderTitle\">Suppression du dossier</string>\n    <string name=\"DeleteFolderMessage\">Veillez patientez pendant que le dossier et son contenu sont supprimés&#8230;</string>\n    \n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Remonter d\\'un niveau dans la hierarchie des dossiers des favoris</string>\n    \n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Accessibilité</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Taille de la police</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Aperçu</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Mise à l\\'échelle du texte</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Taille de police minimale</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Définie la taille minimale de police utilisée pour afficher les textes dans le navigateur.</string>\n    \n    <string name=\"FontPreviewTextTiny\">Très petite</string>\n    <string name=\"FontPreviewTextSmall\">Petite</string>\n    <string name=\"FontPreviewTextNormal\">Normale</string>\n    <string name=\"FontPreviewTextLarge\">Grande</string>\n    <string name=\"FontPreviewTextHuge\">Très grande</string>\n    \n    <string-array name=\"FontPreviewText\">\n\t\t<item>@string/FontPreviewTextTiny</item>\n\t\t<item>@string/FontPreviewTextSmall</item>\n\t\t<item>@string/FontPreviewTextNormal</item>\n\t\t<item>@string/FontPreviewTextLarge</item>\n\t\t<item>@string/FontPreviewTextHuge</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Rendu inversé de l\\'écran</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Rendu inversé</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Inverse les couleurs à l\\'écran. Ceci peut ne pas marcher sur tous les appareils.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Contraste</string>\n    \n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">Place l\\'url de la suggestion dans la barre d\\'adresse, sans naviger vers elle.</string>\n    \n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">instance inconnue</string>\n    <string name=\"RememberMyChoice\">Mémoriser mon choix</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">Exception de sécurité SSL : Accès autorisé à %s par l\\'utilisateur.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">Exception de sécurité SSL : Accès refusé à %s par l\\'utilisateur.</string>\n    \n    <string name=\"PreferenceSslExceptionsTitle\">Exceptions de sécurité SSL</string>\n    <string name=\"PreferenceSslExceptionsSummary\">Liste des exceptions de sécurité SSL par site web.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Cliquer pour supprimer l\\'exception.</i></string>\n    <string name=\"SslExceptionEmptyText\">Vous n\\'avez aucune exception de sécurité SSL.</string>\n    \n    <string name=\"RemoveSslExceptionTitle\">Supprimer l\\'exception</string>\n    <string name=\"RemoveSslExceptionMessage\">Voulez vous supprimer l\\'exception de sécurité pour ce site web ?</string>\n    \n    <string name=\"SslInvalid\">Le certificat est invalide.</string>\n    <string name=\"SslDateInvalid\">La date du certificat est invalide.</string>\n    \n    <string name=\"Authorized\">Autorisé :</string>\n    <string name=\"Reasons\">Raisons :</string>\n    \n    <string name=\"SearchUrlDialogText1\">Votre moteur de recherche est actuellement :</string>\n    <string name=\"SearchUrlDialogText2\">Vous pouvez le personnaliser en choisissant un des moteurs proposés ci-dessous.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Modifier manuellement le moteur de recherche</a></string>    \n    <string name=\"SearchUrlConnecting\">Connexion&#8230;</string>\n    <string name=\"SearchUrlParsing\">Traitement des résultats&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Impossible de se connecter au répertoire des moteurs de recherche (code : %s).</string>\n\n    <string name=\"SearchUrlDefault\">Google France</string>\n    <string name=\"SearchUrlCustom\">Moteur de recherche personnalisé</string>\n    \n    <string name=\"SortBookmarks\">Tri des favoris</string>    \n    <string name=\"MostUsedSortMode\">Plus utilisés</string>\n    <string name=\"AlphaSortMode\">Alphabétiquement</string>\n    <string name=\"RecentSortMode\">Plus récemment visités</string>\n    \n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Format de fichier invalide</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">Import du dossier %1$s sur %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">Création des liens entre dossiers&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">Import du favori %1$s sur %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">Import de l\\'élément de l\\'historique %1$s sur %2$s.</string>\n    \n    <string name=\"FullScreen\">Plein écran</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Bouton de sortie du plein écran</string>\n    \n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">Page de démarrage</string>\n\n    <string name=\"RestartDialogTitle\">Redémarrage requis</string>\n    <string name=\"RestartDialogMessage\">Cette modification ne prendra effet qu\\'après un redémarrage de l\\'application. Souhaitez vous le faire maintenant ?</string>\n    \n    <string name=\"ContentDescriptionTabPreview\">Apperçu d\\'onglet</string>\n    \n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Fermer le panneau latéral à l\\'ouverture d\\'un nouvel onglet</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">Si coché, le panneau latéral se fermera automatiquement lors de l\\'ouverture d\\'un nouvel onglet.</string>\n    \n    <string name=\"AboutChangelogTitle\">Liste des changements</string>\n    <string name=\"AboutContributorsTitle\">Contributeurs</string>\n    <string name=\"AboutLicensesTitle\">Autres licenses</string>\n    \n    <string name=\"RestoreTabsDialogTitle\">Restauration des onglets</string>\n    <string name=\"RestoreTabsDialogMessage\">Souhaitez vous restaurer les onglets de votre session précédente ?</string>\n    \n    <string name=\"PreferenceRestoreTabsTitle\">Restauration des onglets</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Choisissez comment restaurer les onglets d\\'un session précédente.</string>\n    \n    <string name=\"PreferenceRestoreTabsAsk\">Demander</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Toujours</string>\n    <string name=\"PreferenceRestoreTabsNever\">Jamais</string>\n    \n    <string-array name=\"PreferenceRestoreTabsEntries\">\n\t\t<item>@string/PreferenceRestoreTabsAsk</item>\n\t\t<item>@string/PreferenceRestoreTabsAlways</item>\n\t\t<item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceRestoreTabsValues\">\n\t\t<item>ASK</item>\n\t\t<item>ALWAYS</item>\n\t\t<item>NEVER</item>\n\t</string-array>\n    \n    <string name=\"PreferenceUITypeTitle\">Type d\\'interface</string>\n    <string name=\"PreferenceUITypeSummary\">Choisissez le type d\\'interface utilisateur.</string>\n    \n    <string name=\"PreferenceUITypeAuto\">Automatique</string>\n    <string name=\"PreferenceUITypePhone\">Téléphone</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Téléphone (originale)</string>\n    <string name=\"PreferenceUITypeTablet\">Tablette</string>\n    \n    <string-array name=\"PreferenceUITypeEntries\">\n\t\t<item>@string/PreferenceUITypeAuto</item>\n\t\t<item>@string/PreferenceUITypePhone</item>\n\t\t<item>@string/PreferenceUITypeLegacyPhone</item>\n\t\t<item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceUITypeValues\">\n\t\t<item>AUTO</item>\n\t\t<item>PHONE</item>\n\t\t<item>LEGACY_PHONE</item>\n\t\t<item>TABLET</item>\n\t</string-array>\n\t\n    <!-- 1.8 -->\n    <string name=\"PreferenceDevelopersTitle\">Développeurs</string>\n    \n    <string name=\"PreferenceJsLogOnLocatTitle\">Logs JS vers logcat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Rediriger les logs javascript vers le logcat.</string>\n    \n    <string name=\"ContextMenuViewImageInNewTab\">Voir l\\'image dans un nouvel onglet</string>\n\t\n</resources>"
  },
  {
    "path": "res/values-hdpi/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    \n    <integer name=\"favicon_size\">24</integer>\n    <integer name=\"application_button_size\">60</integer>\n    \n</resources>\n"
  },
  {
    "path": "res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Android 向けオープンソース・ウェブブラウザ</string>\n\n    <string name=\"AboutVersionText\">バージョン: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">ライセンス: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    <string name=\"AboutChangelogText\">変更履歴:</string>\n\n    <string name=\"PermissionReadBookmarksLabel\">Tint Browser のブックマークを読み取る</string>\n    <string name=\"PermissionReadBookmarksDescription\">サードパーティのアプリケーションやアドオンにTint Browserのブックマークと履歴の読み取りを許可する</string>\n\n    <string name=\"PermissionWriteBookmarksLabel\">Tint Browser のブックマークを書き込む</string>\n    <string name=\"PermissionWriteBookmarksDescription\">サードパーティのアプリケーションやアドオンにTint Browserのブックマークと履歴の書き込みを許可する</string>    \n\n    <string name=\"PermissionBindAddonServiceLabel\">アドオン・サービスを制御する</string>\n    <string name=\"PermissionBindAddonServiceDescription\">アプリケーションにTint Browserのアドオン・サービスの制御を許可する（Tint Browserのみがこの権限を使用するべきです）</string>\n\n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">キャンセル</string>\n    <string name=\"Yes\">はい</string>\n    <string name=\"No\">いいえ</string>\n    <string name=\"On\">ON</string>\n    <string name=\"Off\">OFF</string>\n    <string name=\"Clear\">消去</string>\n    <string name=\"Continue\">続ける</string>\n    <string name=\"Proceed\">承認</string>\n    <string name=\"VideoLoading\">動画を読み込み中\\u2026</string>\n    <string name=\"History\">履歴</string>\n    <string name=\"All\">全て</string>\n    <string name=\"Bookmarks\">ブックマーク</string>\n    <string name=\"Preferences\">設定</string>\n\n    <string name=\"UrlBarUrlDefaultSubTitle\">タップして検索またはURLを入力</string>\n    <string name=\"UrlBarUrlHint\">検索またはURLを入力</string>\n\n    <string name=\"ShareChooserTitle\">共有する</string>\n    <string name=\"FileChooserPrompt\">アップロードするファイルを選択</string>\n\n    <string name=\"DownloadStart\">%1$s をダウンロード中&#8230;</string>\n    <string name=\"DownloadComplete\">ダウンロードが完了しました</string>\n    <string name=\"DownloadFailedWithErrorMessage\">%1$s のダウンロードに失敗</string>\n    <string name=\"DownloadErrorDisk\">ディスクエラー　ストレージの空き容量を確認してください</string>\n    <string name=\"DownloadErrorHttp\">HTTP エラー</string>\n    <string name=\"DownloadErrorRedirection\">リダイレクトが多すぎます</string>\n    <string name=\"DownloadErrorUnknown\">不明なエラー</string>\n\n    <string name=\"ContextMenuOpen\">開く</string>\n    <string name=\"ContextMenuOpenNewTab\">新しいタブで開く</string>\n    <string name=\"ContextMenuCopyLinkUrl\">リンクのURLをコピー</string>\n    <string name=\"ContextMenuDownload\">ダウンロード</string>\n    <string name=\"ContextMenuShareLinkUrl\">リンクを共有</string>\n\n    <string name=\"ContextMenuViewImage\">画像を表示</string>\n    <string name=\"ContextMenuCopyImageUrl\">画像のURLをコピー</string>\n    <string name=\"ContextMenuDownloadImage\">画像を保存</string>\n    <string name=\"ContextMenuShareImageUrl\">画像を共有</string>\n\n    <string name=\"ContextMenuSendEmail\">メールを作成</string>\n    <string name=\"ContextMenuCopyEmailUrl\">メールアドレスをコピー</string>\n    <string name=\"ContextMenuShareEmailUrl\">メールアドレスを共有</string>\n\n    <string name=\"UrlCopyToastMessage\">クリップボードにURLをコピーしました</string>\n    <string name=\"ContextMenuShareUrl\">共有</string>\n\n    <string name=\"JavaScriptAlertDialog\">JavaScript 警告ダイアログ</string>\n    <string name=\"JavaScriptConfirmDialog\">JavaScript 確認ダイアログ</string>\n    <string name=\"JavaScriptPromptDialog\">JavaScript 入力ダイアログ</string>    \n\n    <string name=\"SslWarning\">セキュリティーの警告</string>\n    <string name=\"SslWarningsHeader\">このサイトのセキュリティ証明書には問題があります - %s</string>\n    <string name=\"SslUntrusted\">信頼できる証明機関から発行されたものではありません</string>\n    <string name=\"SslIDMismatch\">証明書にあるページの名前と表示しようとしているページの名前が一致しません</string>\n    <string name=\"SslExpired\">証明書の有効期限が切れています</string>\n    <string name=\"SslNotYetValid\">この証明書はまだ有効になっていません</string>    \n\n    <string name=\"NewTab\">新しいタブ</string>\n\n    <string name=\"CloseTab\">現在のタブを閉じる</string>\n    <string name=\"AddBookmark\">ブックマークを追加</string>\n    <string name=\"SharePage\">ページを共有</string>\n    <string name=\"Search\">ページ内を検索</string>\n\n    <string name=\"BookmarksTitle\">ブックマークと履歴</string>\n    <string name=\"BookmarksTabTitle\">ブックマーク</string>\n    <string name=\"HistoryTabTitle\">履歴</string>\n\n    <string name=\"ImportHistoryBookmarks\">インポート</string>\n    <string name=\"ExportHistoryBookmarks\">エクスポート</string>\n    <string name=\"ClearHistoryBookmarks\">消去</string>\n\n    <string name=\"AddBookmarkTitle\">ブックマークを追加</string>\n    <string name=\"BookmarkText\">ラベル</string>\n    <string name=\"UrlText\">アドレス</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">正しいラベルとアドレスを入力してください</string>\n\n    <string name=\"OpenInTab\">新しいタブで開く</string>\n    <string name=\"EditBookmark\">編集</string>\n    <string name=\"CopyUrl\">URLをコピー</string>\n    <string name=\"DeleteBookmark\">削除</string>\n    <string name=\"DeleteHistoryItem\">履歴から削除</string>\n\n    <string name=\"PreferencesActivityTitle\">設定</string>\n\n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">全体設定</string>\n\n    <string name=\"PreferenceGeneralHomepageTitle\">ホームページ</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">新しいタブなどを開いたときに表示するページを設定</string>\n    <string name=\"PreferenceHomePageDialogTitle\">ホームページ</string>\n\n    <string name=\"PreferenceGeneralSearchUrlTitle\">検索エンジン</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">デフォルトの検索エンジンを設定</string>\n\n    <string name=\"PreferenceCategoryStartPageTitle\">スタートページ</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">表示するアイテム数</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">スタートページ（よくアクセスするページ）に表示するアイテム数を設定</string>\n\n    <string name=\"PreferenceCategoryUITitle\">UI設定</string>\n\n    <string name=\"PreferenceBubblePositionTitle\">バブルの位置</string>\n    <string name=\"PreferenceBubblePositionSummary\">ツールバーを開くためのバブルの位置を設定</string>\n\n    <string name=\"PreferenceBubblePositionRight\">右下</string>\n    <string name=\"PreferenceBubblePositionLeft\">左下</string>\n    <string name=\"PreferenceBubblePositionBoth\">両方</string>\n\n    <string-array name=\"PreferenceBubblePositionEntries\">\n        <item>@string/PreferenceBubblePositionRight</item>\n        <item>@string/PreferenceBubblePositionLeft</item>\n        <item>@string/PreferenceBubblePositionBoth</item>\n    </string-array>\n\n    <string-array name=\"PreferenceBubblePositionValues\">\n        <item>RIGHT</item>\n        <item>LEFT</item>\n        <item>BOTH</item>\n    </string-array>\n\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">ツールバー表示時間</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">ツールバーを何秒間表示するかを設定</string>\n\n    <string name=\"PreferenceSwitchTabsMethodTitle\">タブ切り替え方法</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">複数タブの切り替え方法を設定</string>\n\n    <string name=\"PreferenceSwitchTabsMethodButtons\">ボタン</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">フリック</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">両方</string>\n\n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n        <item>@string/PreferenceSwitchTabsMethodButtons</item>\n        <item>@string/PreferenceSwitchTabsMethodFling</item>\n        <item>@string/PreferenceSwitchTabsMethodBoth</item>\n    </string-array>\n\n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n        <item>BUTTONS</item>\n        <item>FLING</item>\n        <item>BOTH</item>\n    </string-array>\n\n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">ブラウザー設定</string>\n\n    <string name=\"PreferenceEnableJavascriptTitle\">JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript を実行する</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript を実行しない</string>\n    <string name=\"PreferenceEnableImagesTitle\">画像の表示</string>\n    <string name=\"PreferenceEnableImagesSummary\">チェックすると画像を読み込みます</string>\n    <string name=\"PreferenceUseWideViewportTitle\">広い表示幅を使う</string>\n    <string name=\"PreferenceUseWideViewportSummary\">デスクトップと同じ表示幅でページを表示</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">ページの概観を読み込む</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">ズームアウトしてページ全体の概観を表示</string>\n    <string name=\"PreferencePluginsTitle\">プラグイン</string>\n    <string name=\"PreferencePluginsSummary\">プラグインの読み込み方を設定</string>\n\n    <string name=\"PreferencePluginsAlwaysOff\">常に無効</string>\n    <string name=\"PreferencePluginsOnDemand\">タップして有効</string>\n    <string name=\"PreferencePluginsAlwaysOn\">常に有効</string>\n\n    <string-array name=\"PreferencePluginsEntries\">\n        <item>@string/PreferencePluginsAlwaysOff</item>\n        <item>@string/PreferencePluginsOnDemand</item>\n        <item>@string/PreferencePluginsAlwaysOn</item>\n    </string-array>\n\n    <string-array name=\"PreferencePluginsValues\">\n        <item>OFF</item>\n        <item>ON_DEMAND</item>\n        <item>ON</item>\n    </string-array>\n\n    <string name=\"PreferenceUserAgentTitle\">ユーザーエージェント</string>\n    <string name=\"PreferenceUserAgentSummary\">ユーザーエージェントの文字列を指定する</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">ユーザーエージェント</string>\n\n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">プライバシーとセキュリティー</string>\n\n    <string name=\"PreferencePrivacyClearCacheTitle\">キャッシュを消去</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">キャッシュされたコンテンツとデータベースを消去</string>\n\n    <string name=\"PreferenceCategoryHistoryTitle\">履歴</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">保存する履歴</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">履歴を保存する日数を設定</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">履歴を消去</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">履歴とよくアクセスするページを消去</string>\n\n    <string name=\"PreferenceCategoryCookiesTitle\">Cookie</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Cookie の受け入れ</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">サイトによる Cookie の保存と読み取りを許可</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Cookie を消去</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">すべての Cookie を消去</string>\n\n    <string name=\"PreferenceCategoryGeolocationTitle\">現在地情報</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">位置情報を有効にする</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">サイトに現在地情報へのアクセスを許可</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">位置情報アクセスを消去</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">サイトの位置情報へのアクセス履歴をすべて消去</string>\n\n    <string name=\"PreferenceCategoryFormDataTitle\">フォームデータ</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">フォームデータを記憶</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">フォームに入力した内容を保存しておく</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">フォームデータを消去</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">保存されているフォームデータをすべて消去</string>\n\n    <string name=\"PreferenceCategoryPasswordsTitle\">パスワード</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">パスワードを記憶</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">サイトのユーザー名とパスワードを保存</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">パスワードを消去</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">保存されているユーザー名とパスワードをすべて消去</string>\n\n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">サイト別設定</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">ウェブサイト個別の詳細な設定</string>\n\n    <string name=\"HistoryToday\">今日</string>\n    <string name=\"HistoryYesterday\">昨日</string>\n    <string name=\"HistoryLastSevenDays\">今週</string>\n    <string name=\"HistoryLastMonth\">今月</string>\n    <string name=\"HistoryOlder\">それ以前</string>\n\n    <string name=\"ClearCacheMessage\">キャッシュされたコンテンツとデータベースを削除してもよろしいですか？</string>\n    <string name=\"ClearHistoryMessage\">閲覧履歴とよくアクセスするページを削除してもよろしいですか？</string>\n    <string name=\"ClearCookiesMessage\">すべての Cookie を削除してもよろしいですか？</string>\n    <string name=\"ClearGeolocationMessage\">サイトからの位置情報アクセスを削除してもよろしいですか？</string>\n    <string name=\"ClearFormDataMessage\">保存されているフォームデータを削除してもよろしいですか？</string>\n    <string name=\"ClearPasswordsMessage\">保存されているユーザー名とパスワードを削除してもよろしいですか？</string>\n\n    <string name=\"PreferenceHomepageStart\">スタートページ</string>\n    <string name=\"PreferenceHomepageBlank\">空白のページ</string>\n    <string name=\"PreferenceHomepageCustom\">カスタム</string>\n\n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n\n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">デスクトップ</string>\n    <string name=\"PreferenceUserAgentOther\">その他</string>\n\n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n\n    <string name=\"SearchUrlGoogle\">http://www.google.co.jp/m?q={searchTerms}</string>\n\n    <string name=\"PreferenceHeaderAddonsTitle\">アドオン</string>\n\n    <string name=\"PreferenceHeaderAboutTitle\">このアプリケーションについて</string>\n\n    <string name=\"HttpAuthenticationDialogDialogTitle\">ログイン: %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">ユーザー名</string>\n    <string name=\"HttpAuthenticationDialogPassword\">パスワード</string>\n\n    <string name=\"FormResubmitTitle\">フォームの再送信</string>\n    <string name=\"FormResubmitMessage\">このページを表示するにはフォームデータを再送信する必要があります。フォームデータを再送信すると、以前実行した検索、投稿や注文などの処理が繰り返されます。</string>\n\n    <string name=\"BookmarkAdded\">ブックマークに追加されました</string>\n    <string name=\"BookmarkRemoved\">ブックマークを削除しました</string>\n\n    <string name=\"SDCardErrorNoSDMsg\">SDカードが見つかりません</string>\n    <string name=\"SDCardErrorSDUnavailable\">SDカードが無効です</string>\n\n    <string name=\"HistoryBookmarksClearTitle\">消去</string>\n\n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n\n    <string name=\"HistoryBookmarksImportSourceTitle\">インポートするファイル</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">ファイルが存在しないか読み取れないため利用できません</string>\n    <string name=\"HistoryBookmarksImportTitle\">履歴とブックマークをインポート</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">履歴とブックマークをインポート中&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">ファイルを読み込んでいます&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">ファイルを解析しています&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">%2$s件中%1$s件を読み込んでいます&#8230;</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">書き込んでいます&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">エラー</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">インポート中にエラーが発生しました - %s</string>\n\n    <string name=\"HistoryBookmarksExportTitle\">履歴とブックマークをエクスポート</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">履歴とブックマークをエクスポート中&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">外部ストレージをチェックしています&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">%2$s件中%1$s件をエクスポートしています&#8230;</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">エラー</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">エクスポート中にエラーが発生しました - %s</string>\n\n    <string name=\"GeolocationTitle\">位置情報の要求</string>\n    <string name=\"GeolocationMessage\">%s は現在地情報へのアクセスを要求しています。</string>    \n    <string name=\"GeolocationAccept\">承諾する</string>\n    <string name=\"GeolocationDecline\">拒否する</string>\n\n    <string name=\"WebsitesSettingsEmpty\">個別のウェブサイト設定はありません。</string>\n\n    <string name=\"WebsitesSettingsSiteTitle\">%s の設定</string>\n\n    <string name=\"WebsitesSettingsDataUsage\">%s MB使用しています</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">保存されているデータを削除</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">データを削除</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">このサイトによって保存されたデータをすべて削除しますか？</string>\n\n    <string name=\"WebsitesSettingsGeolocationClickToClear\">位置情報アクセスを削除</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">このサイトの位置情報へのアクセスを許可</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">このサイトの位置情報へのアクセスを拒否</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">位置情報アクセスを削除</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">このサイトのの位置情報アクセス設定をリセットしますか？</string>\n\n    <string name=\"AddonsWarningText\">信頼できる開発元からのアドオンのみをインストールして下さい。問題が発生する場合、全てのアドオンを無効化して下さい。</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">アドオンを入手</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Play ストアが見つかりません</string>\n    <string name=\"AddonsMarketNotFoundMessage\">Google Play ストアのアプリがインストールされていません。</string>\n    <string name=\"AddonsEnableAll\">全て有効</string>\n    <string name=\"AddonsDisableAll\">全て無効</string>\n\n    <string name=\"AddonDetailsContact\">連絡先: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">このアドオンは次の動作を行います:</string>\n\n    <string name=\"AddonCallbackPageStarted\">ページの読み込み開始時に実行されます</string>\n    <string name=\"AddonCallbackPageFinished\">ページの読み込み終了時に実行されます</string>\n    <string name=\"AddonCallbackTabOpened\">タブが開かれた際に実行されます</string>\n    <string name=\"AddonCallbackTabClosed\">タブが閉じられた際に実行されます</string>\n    <string name=\"AddonCallbackTabSwitched\">タブを切り替えた際に実行されます</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">設定画面を使用します</string>\n    <string name=\"AddonCallbackContributeMainMenu\">メインメニューに項目を追加します</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">コンテキストメニューに項目を追加します</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">ブックマークと履歴のメニューに項目を追加します</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">ブックマークのコンテキストメニューに項目を追加します</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">履歴のメニューに項目を追加します</string>\n\n    <string name=\"AddonDetailsUsedPermissionsTitle\">このアドオンは次の権限を使用します:</string>\n    <string name=\"AddonDetailsPermissionsNone\">このアドオンは特別な権限を使用しません。</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">権限を取得できませんでした。デバイスのアプリ一覧から確認してください。</string>\n\n    <string name=\"ContentDescriptionDivider\">スペーサー</string>\n    <string name=\"ContentDescriptionApplicationIcon\">アプリケーションのアイコン</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">おすすめのファビコン</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">ブックマークのサムネイル</string>\n    <string name=\"ContentDescriptionFavicon\">ウェブサイトのファビコン</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">移動・停止・更新ボタン</string>\n    <string name=\"ContentDescriptionMenuButton\">メニューボタン</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">前のタブへ戻るボタン</string>\n    <string name=\"ContentDescriptionNextTabButton\">次のタブへ進むボタン</string>\n    <string name=\"ContentDescriptionLeftBubble\">左バブル</string>\n    <string name=\"ContentDescriptionRightBubble\">右バブル</string>\n    <string name=\"ContentDescriptionBackButton\">戻るボタン</string>\n    <string name=\"ContentDescriptionCloseTabButton\">閉じるボタン</string>\n    <string name=\"ContentDescriptionBookmarksButton\">ブックマークボタン</string>\n    <string name=\"ContentDescriptionNewTabButton\">新しいタブを開くボタン</string>\n    <string name=\"ContentDescriptionForwardButton\">進むボタン</string>\n    <string name=\"ContentDescriptionHomeButton\">ホームボタン</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">ウェブサイトのアドレス</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">ウェブサイトの使用量</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">ウェブサイトの機能</string>\n\n    <string-array name=\"DefaultBookmarksTitles\">\n        <item>Google</item>\n        <item>Wikipedia</item>\n        <item>YouTube</item>\n        <item>Yahoo!</item>\n        <item>BBC</item>\n        <item>eBay</item>\n    </string-array>\n\n    <string-array name=\"DefaultBookmarksUrls\">\n        <item>http://www.google.co.jp/</item>\n        <item>http://ja.wikipedia.org/</item>\n        <item>http://www.youtube.jp/</item>\n        <item>http://www.yahoo.co.jp/</item>\n        <item>http://www.bbc.co.uk/</item>\n        <item>http://www.ebay.com/</item>\n    </string-array>\n\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">プライベートタブ</string>\n    <string name=\"ContextMenuOpenInBackground\">バックグラウンドのタブで開く</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">プライベートブラウジング・インジケーター</string>\n\n    <!-- 1.3 -->\n    <string name=\"Folder\">フォルダ</string>\n    <string name=\"NewFolder\">新しいフォルダ</string>    \n    <string name=\"NewFolderHint\">新しいフォルダの名前</string>\n    <string name=\"ProvideNewFolderName\">新しいフォルダ名を入力するか、既にあるフォルダから選んでください</string>\n\n    <string name=\"DeleteFolder\">フォルダを削除</string>\n    <string name=\"ConfirmDeleteFolderMessage\">フォルダ内のすべての項目を削除しますか？</string>\n    <string name=\"DeleteFolderTitle\">削除中</string>\n    <string name=\"DeleteFolderMessage\">しばらくお待ちください&#8230;</string>\n\n    <string name=\"ContentDescriptionBookmarksFoldersBack\">上の階層へ戻る</string>\n\n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">ユーザー補助</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">文字サイズ</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">プレビュー</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">テキストの倍率</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">最小フォントサイズ</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">テキストの表示に使用する最小のフォントサイズを指定</string>\n\n    <string name=\"FontPreviewTextTiny\">最小</string>\n    <string name=\"FontPreviewTextSmall\">小</string>\n    <string name=\"FontPreviewTextNormal\">中</string>\n    <string name=\"FontPreviewTextLarge\">大</string>\n    <string name=\"FontPreviewTextHuge\">最大</string>\n\n    <string-array name=\"FontPreviewText\">\n        <item>@string/FontPreviewTextTiny</item>\n        <item>@string/FontPreviewTextSmall</item>\n        <item>@string/FontPreviewTextNormal</item>\n        <item>@string/FontPreviewTextLarge</item>\n        <item>@string/FontPreviewTextHuge</item>\n    </string-array>\n\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">画面の反転レンダリング</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">反転レンダリング</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">色を反転して表示します。一部のデバイスでは動作しない恐れがあります。</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">コントラスト</string>\n\n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">移動先URLの候補を表示します。</string>\n\n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">不明な認証機関</string>\n    <string name=\"RememberMyChoice\">次回から確認しない</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">SSL security exception: Access allowed to %s by user.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">SSL security exception: Access disallowed to %s by user.</string>\n\n    <string name=\"PreferenceSslExceptionsTitle\">SSLセキュリティー例外</string>\n    <string name=\"PreferenceSslExceptionsSummary\">ウェブサイトによるSSLセキュリティー例外の一覧</string>\n    <string name=\"SslExceptionWebsitesText\"><i>タップして例外を削除</i></string>\n    <string name=\"SslExceptionEmptyText\">セキュリティー例外はありません。</string>\n\n    <string name=\"RemoveSslExceptionTitle\">例外を削除</string>\n    <string name=\"RemoveSslExceptionMessage\">このサイトのセキュリティー例外を削除してもよろしいですか？</string>\n\n    <string name=\"SslInvalid\">この証明書は無効です</string>\n    <string name=\"SslDateInvalid\">この証明書の日付は無効です</string>\n\n    <string name=\"Authorized\">認証済み:</string>\n    <string name=\"Reasons\">理由:</string>\n\n    <string name=\"SearchUrlDialogText1\">現在設定されている検索エンジン:</string>\n    <string name=\"SearchUrlDialogText2\">使用する検索エンジンを以下から選択できます</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">使用する検索エンジンを手動で設定</a></string>    \n    <string name=\"SearchUrlConnecting\">接続中&#8230;</string>\n    <string name=\"SearchUrlParsing\">結果を解析中&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">検索エンジンレポジトリに接続できませんでした (レスポンスコード: %s)</string>\n\n    <string name=\"SearchUrlDefault\">Google worldwide</string>\n    <string name=\"SearchUrlCustom\">カスタム</string>\n\n    <string name=\"SortBookmarks\">ブックマークの並び替え</string>    \n    <string name=\"MostUsedSortMode\">よく使う順</string>\n    <string name=\"AlphaSortMode\">名前順</string>\n    <string name=\"RecentSortMode\">最近アクセスした順</string>\n\n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">不明なファイルフォーマットです</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">%2$s件中%1$s件のフォルダを読み込み中&#8230;</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">フォルダをリンク中&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">%2$s件中%1$s件のブックマークを読み込み中&#8230;</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">%2$s件中%1$s件の履歴を読み込み中&#8230;</string>\n\n    <string name=\"FullScreen\">フルスクリーン</string>\n    <string name=\"ContentDescriptionExitFullScreen\">フルスクリーン終了ボタン</string>\n\n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">スタートページ</string>\n\n    <string name=\"RestartDialogTitle\">再起動が必要です</string>\n    <string name=\"RestartDialogMessage\">ブラウザを再起動するまで変更は反映されません。今すぐ再起動しますか？</string>\n\n    <string name=\"ContentDescriptionTabPreview\">タブ・プレビュー</string>\n\n    <string name=\"PreferenceClosePanelOnNewTabTitle\">サイドバーを自動で閉じる</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">新しいタブを開いたときに自動でサイドバーを閉じる</string>\n\n    <string name=\"AboutChangelogTitle\">変更履歴</string>\n    <string name=\"AboutContributorsTitle\">貢献者</string>\n    <string name=\"AboutLicensesTitle\">その他のライセンス</string>\n\n    <string name=\"RestoreTabsDialogTitle\">タブの復元</string>\n    <string name=\"RestoreTabsDialogMessage\">前回開いていたタブを復元しますか?</string>\n\n    <string name=\"PreferenceRestoreTabsTitle\">タブの復元</string>\n    <string name=\"PreferenceRestoreTabsSummary\">前回開いていたタブを復元するかどうかを設定</string>\n\n    <string name=\"PreferenceRestoreTabsAsk\">毎回質問</string>\n    <string name=\"PreferenceRestoreTabsAlways\">常に復元</string>\n    <string name=\"PreferenceRestoreTabsNever\">復元しない</string>\n\n    <string-array name=\"PreferenceRestoreTabsEntries\">\n        <item>@string/PreferenceRestoreTabsAsk</item>\n        <item>@string/PreferenceRestoreTabsAlways</item>\n        <item>@string/PreferenceRestoreTabsNever</item>\n    </string-array>\n\n    <string-array name=\"PreferenceRestoreTabsValues\">\n        <item>ASK</item>\n        <item>ALWAYS</item>\n        <item>NEVER</item>\n    </string-array>\n\n    <string name=\"PreferenceUITypeTitle\">UIタイプ</string>\n    <string name=\"PreferenceUITypeSummary\">UI のタイプを選択</string>\n\n    <string name=\"PreferenceUITypeAuto\">自動</string>\n    <string name=\"PreferenceUITypePhone\">通常</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">通常 (レガシー)</string>\n    <string name=\"PreferenceUITypeTablet\">タブレット</string>\n\n    <string-array name=\"PreferenceUITypeEntries\">\n        <item>@string/PreferenceUITypeAuto</item>\n        <item>@string/PreferenceUITypePhone</item>\n        <item>@string/PreferenceUITypeLegacyPhone</item>\n        <item>@string/PreferenceUITypeTablet</item>\n    </string-array>\n\n    <string-array name=\"PreferenceUITypeValues\">\n        <item>AUTO</item>\n        <item>PHONE</item>\n        <item>LEGACY_PHONE</item>\n        <item>TABLET</item>\n    </string-array>\n\n</resources>"
  },
  {
    "path": "res/values-land/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    \n    <integer name=\"tab_title_length\">30</integer>\n    \n</resources>\n"
  },
  {
    "path": "res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Tint Browser to przeglądarka open-source dla systemu Android.</string>\n    <string name=\"AboutVersionText\">Wersja: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">Licencja: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    <string name=\"PermissionReadBookmarksLabel\">Odczyt zakładek Tint Browser</string>\n    <string name=\"PermissionReadBookmarksDescription\">\"Pozwól aplikacjom innych producentów lub dodatkom na odczyt z Tint Browser bazy danych zakładek.\"</string>\n    <string name=\"PermissionWriteBookmarksLabel\">Zapis zakładek przeglądarki Tint Browser</string>\n    <string name=\"PermissionWriteBookmarksDescription\">\"Pozwól aplikacjom innych producentów lub dodatkom na zapis z Tint Browser bazy danych zakładek.\"</string>\n    <string name=\"PermissionBindAddonServiceLabel\">Powiązanie Tint Browser z dodatkowymi usługami</string>\n    <string name=\"PermissionBindAddonServiceDescription\">\"Pozwól aplikacjom na powiązanie Tint Browser z dodatkowymi usługami. Tylko Tint Browser musi mieć posiadać te uprawnienia.\"</string>\n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Anuluj</string>\n    <string name=\"Yes\">Tak</string>\n    <string name=\"No\">Nie</string>\n    <string name=\"On\">WŁ</string>\n    <string name=\"Off\">WYŁ</string>\n    <string name=\"Clear\">Czyść</string>\n    <string name=\"Continue\">Kontynuuj</string>\n    <string name=\"Proceed\">Dalej</string>\n    <string name=\"VideoLoading\">Wczytywanie wideo…</string>\n    <string name=\"History\">Historia</string>\n    <string name=\"All\">Wszystko</string>\n    <string name=\"Bookmarks\">Zakładki</string>\n    <string name=\"Preferences\">Ustawienia</string>\n    <string name=\"UrlBarUrlDefaultSubTitle\">Wprowadź adres lub wyszukaj.</string>\n    <string name=\"UrlBarUrlHint\">Wprowadź adres lub wyszukaj</string>\n    <string name=\"ShareChooserTitle\">Udostępnij via</string>\n    <string name=\"FileChooserPrompt\">Wybierz plik do wysłania</string>\n    <string name=\"Download\">Pobieranie</string>\n    <string name=\"DownloadDialogTitle\">Pobieranie</string>\n    <string name=\"DownloadInIncognito\">Ukryte pobieranie</string>\n    <string name=\"DownloadStart\">Pobieranie %1$s…</string>\n    <string name=\"DownloadComplete\">Pobieranie zakończone.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">Błąd pobierania: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Błąd dysku, sprawdź czy posiadasz wystarczająco dużo wolnego miejsca.</string>\n    <string name=\"DownloadErrorHttp\">Błąd HTTP</string>\n    <string name=\"DownloadErrorRedirection\">Zbyt wiele przekierowań</string>\n    <string name=\"DownloadErrorUnknown\">Nieznany błąd</string>\n    <string name=\"ContextMenuOpen\">Otwórz</string>\n    <string name=\"ContextMenuOpenNewTab\">Otwórz w nowej karcie</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Kopiuj link</string>\n    <string name=\"ContextMenuDownload\">Pobieranie</string>\n    <string name=\"ContextMenuShareLinkUrl\">Udostępnij link</string>\n    <string name=\"ContextMenuViewImage\">Widok obrazu</string>\n    <string name=\"ContextMenuCopyImageUrl\">Kopiuj adres obrazu</string>\n    <string name=\"ContextMenuDownloadImage\">Pobierz obraz</string>\n    <string name=\"ContextMenuShareImageUrl\">Udostępnij obraz</string>\n    <string name=\"ContextMenuSendEmail\">Wyślij email</string>\n    <string name=\"ContextMenuCopyEmailUrl\">Kopiuj adres email</string>\n    <string name=\"ContextMenuShareEmailUrl\">Udostępnij email</string>\n    <string name=\"UrlCopyToastMessage\">Kopiuj adres do schowka.</string>\n    <string name=\"ContextMenuShareUrl\">Udostępnij</string>\n    <string name=\"JavaScriptAlertDialog\">JavaScript okno ostrzeżenia</string>\n    <string name=\"JavaScriptConfirmDialog\">JavaScript okno potwierdzenia</string>\n    <string name=\"JavaScriptPromptDialog\">JavaScript okno wyświetlenia</string>\n    <string name=\"SslWarning\">Komunikat bezpieczeństwa</string>\n    <string name=\"SslWarningsHeader\">Jest problem z certyfikatem zabezpieczeń tej witryny (%s).</string>\n    <string name=\"SslUntrusted\">Ten certyfikat nie jest z zaufanego urzędu.</string>\n    <string name=\"SslIDMismatch\">Nazwa strony nie pasuje do nazwy na certyfikacie.</string>\n    <string name=\"SslExpired\">Ten certyfikat wygasł.</string>\n    <string name=\"SslNotYetValid\">Ten certyfikat nie jest jeszcze ważny.</string>\n    <string name=\"NewTab\">Nowa karta</string>\n    <string name=\"CloseTab\">Zamknij aktualną kartę</string>\n    <string name=\"AddBookmark\">Dodaj zakładkę</string>\n    <string name=\"SharePage\">Udostępnij stronę</string>\n    <string name=\"Search\">Znajdź na stronie</string>\n    <string name=\"BookmarksTitle\">Zakładki i Historia</string>\n    <string name=\"BookmarksTabTitle\">Zakładki</string>\n    <string name=\"HistoryTabTitle\">Historia</string>\n    <string name=\"ImportHistoryBookmarks\">Importuj</string>\n    <string name=\"ExportHistoryBookmarks\">Eksportuj</string>\n    <string name=\"ClearHistoryBookmarks\">Wyczyść</string>\n    <string name=\"AddBookmarkTitle\">Dodaj zakładkę</string>\n    <string name=\"BookmarkText\">Nazwa</string>\n    <string name=\"UrlText\">Adres</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Proszę podać prawidłową nazwę i adres.</string>\n    <string name=\"OpenInTab\">Otwórz w nowej karcie</string>\n    <string name=\"EditBookmark\">Edycja zakładki</string>\n    <string name=\"CopyUrl\">Kopiuj adres</string>\n    <string name=\"DeleteBookmark\">Usuń zakładkę</string>\n    <string name=\"DeleteHistoryItem\">Usuń z historii</string>\n    <string name=\"PreferencesActivityTitle\">Ustawienia</string>\n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">Ustawienia ogólne</string>\n    <string name=\"PreferenceGeneralHomepageTitle\">Strona główna</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Ustaw stronę główną, aby załadować po otwarciu nowej karty itp.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Strona główna</string>\n    <string name=\"PreferenceGeneralSearchUrlTitle\">Wyszukiwarka</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Ustaw wyszukiwarkę używaną do domyślnego wyszukiwania z paska adresu.</string>\n    <string name=\"PreferenceCategoryStartPageTitle\">Strona startowa</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Ilość elementów na stronie startowej</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Ustaw liczbę elementów, wyświetlanych na stronie startowej.</string>\n    <string name=\"PreferenceCategoryUITitle\">Interfejs użytkownika</string>\n    <string name=\"PreferenceBubblePositionTitle\">Miejsce przycisku menu</string>\n    <string name=\"PreferenceBubblePositionSummary\">Miejsce przycisku menu pozwalające pokazać pasek narzędzi.</string>\n    <string name=\"PreferenceBubblePositionRight\">Prawa strona</string>\n    <string name=\"PreferenceBubblePositionLeft\">Lewa strona</string>\n    <string name=\"PreferenceBubblePositionBoth\">Obie strony</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Czas wyświetlania paska narzędzi</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Określ jak długo pokazywany będzie pasek narzędzi w sekundach.</string>\n    <string name=\"PreferenceSwitchTabsMethodTitle\">Zmiana metody kart</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Ustaw jak można przełączać się między kartami.</string>\n    <string name=\"PreferenceSwitchTabsMethodButtons\">Przyciski</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Przesuwanie</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Obie metody</string>\n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Ustawienia przeglądarki</string>\n    <string name=\"PreferenceEnableJavascriptTitle\">Włącz JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript jest włączony.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript jest wyłączony.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Wczytuj obrazy</string>\n    <string name=\"PreferenceEnableImagesSummary\">Wyświetlaj obrazy na stronach internetowych.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Użyj szerokiego widoku</string>\n    <string name=\"PreferenceUseWideViewportSummary\">Jeśli zaznaczone, przeglądarka będzie używać widoku podobny do przeglądarek desktopowych.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Podgląd otwartej strony</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Pokaż, widok ogólny nowo otwartych stron.</string>\n    <string name=\"PreferencePluginsTitle\">Włącz wtyczki</string>\n    <string name=\"PreferencePluginsSummary\">Wybierz zarządzanie wtyczkami.</string>\n    <string name=\"PreferencePluginsAlwaysOff\">Wyłączone</string>\n    <string name=\"PreferencePluginsOnDemand\">Na żądanie</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Włączone</string>\n    <string name=\"PreferenceUserAgentTitle\">User-agent</string>\n    <string name=\"PreferenceUserAgentSummary\">Ustaw sposób przedstawiania się używany przez przeglądarkę np:PC itp.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">User-agent</string>\n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Prywatność i bezpieczeństwo</string>\n    <string name=\"PreferencePrivacyClearCacheTitle\">Wyczyść pamięć podręczną</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Wyczyść zawartość lokalnej pamięci podręcznej i baz danych.</string>\n    <string name=\"PreferenceCategoryHistoryTitle\">Historia</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">Rozmiar historii</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Określ rozmiar historii w dniach.</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Wyczyść historię</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Wyczyść historię przeglądania.</string>\n    <string name=\"PreferenceCategoryCookiesTitle\">Pliki cookie</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Akceptuj pliki cookie</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Zezwalaj witrynom na zapis i odczyt danych w plikach cookie.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Wyczyść pliki cookie</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Wyczyść wszystkie pliki cookie przeglądarki.</string>\n    <string name=\"PreferenceCategoryGeolocationTitle\">Lokalizacja</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Włącz obsługę lokalizacji</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Zezwalaj witrynom na żądanie dostępu do informacji o lokalizacji.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Anuluj dostęp do lokalizacji</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Wyczyść bieżące ustawienia dostępu lokalizacji dla witryn.</string>\n    <string name=\"PreferenceCategoryFormDataTitle\">Dane formularzy</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Zapamiętaj wpisane dane</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Zapamiętaj do późniejszego użycia dane, które wpisuję w formularzach.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Wyczyść dane formularzy</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Wyczyść wszystkie zapisane dane formularzy.</string>\n    <string name=\"PreferenceCategoryPasswordsTitle\">Hasła</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Zapamiętaj hasła</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Zapisz nazwy użytkowników i hasła używane w witrynach.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Wyczyść hasła</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Wyczyść wszystkie zapisane hasła.</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Ustawienia stron internetowych</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Zaawansowane ustawienia dla indywidualnych stron.</string>\n    <string name=\"PreferencePrivacyIncognitoTitle\">Tryb ukryty</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Tryb ukryty domyślnie</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Otwórz nowe zakładki w trybie ukrytym</string>\n    <string name=\"HistoryToday\">Dzisiaj</string>\n    <string name=\"HistoryYesterday\">Wczoraj</string>\n    <string name=\"HistoryLastSevenDays\">Ostatnie 7 dni</string>\n    <string name=\"HistoryLastMonth\">Ostatni miesiąc</string>\n    <string name=\"HistoryOlder\">Starsze</string>\n    <string name=\"ClearCacheMessage\">Usunąć lokalnie pamięć podręczną i bazę danych?</string>\n    <string name=\"ClearHistoryMessage\">Usunąć z przeglądarki historie nawigacji?</string>\n    <string name=\"ClearCookiesMessage\">Usunąć wszystkie ciasteczka?</string>\n    <string name=\"ClearGeolocationMessage\">Wyczyścić strony internetowe z dostępem do informacji o lokalizacji?</string>\n    <string name=\"ClearFormDataMessage\">Usunąć wszystkie zapisane formularze z danych?</string>\n    <string name=\"ClearPasswordsMessage\">Usunąć wszystkie zapisane hasła?</string>\n    <string name=\"PreferenceHomepageStart\">Strona startowa</string>\n    <string name=\"PreferenceHomepageBlank\">Pusta strona</string>\n    <string name=\"PreferenceHomepageCustom\">Własna strona</string>\n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">PC</string>\n    <string name=\"PreferenceUserAgentOther\">Inny</string>\n    <string name=\"SearchUrlGoogle\">http://www.google.com/m?q={searchTerms}</string>\n    <string name=\"PreferenceHeaderAddonsTitle\">Dodatki</string>\n    <string name=\"PreferenceHeaderAboutTitle\">O przeglądarce</string>\n    <string name=\"HttpAuthenticationDialogDialogTitle\">Zaloguj się do %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Nazwa</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Hasło</string>\n    <string name=\"FormResubmitTitle\">Ponowne wysłanie formularza</string>\n    <string name=\"FormResubmitMessage\">\"Strona którą zamierzasz wyświetlić zawiera dane które zostały wysłane (\\\"POSTDATA\\\"). Jeśli wyślesz dane ponownie, wszystkie działania formularza prowadzone na stronie (takie jak wyszukiwanie lub zakup online) zostaną powtórzone.\"</string>\n    <string name=\"BookmarkAdded\">Dodaj do zakładek.</string>\n    <string name=\"BookmarkRemoved\">Usuń z zakładek.</string>\n    <string name=\"SDCardErrorNoSDMsg\">Nie wykryto karty SD.</string>\n    <string name=\"SDCardErrorSDUnavailable\">Karta SD jest nieobsługiwana.</string>\n    <string name=\"HistoryBookmarksClearTitle\">Wyczyść</string>\n    <string name=\"HistoryBookmarksImportSourceTitle\">Importuj plik</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Plik niedostępny, nie istnieje lub jest nieczytelny.</string>\n    <string name=\"HistoryBookmarksImportTitle\">Import historii i zakładek</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">Importowanie historii i zakładek…</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">Odczytywanie pliku…</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">Analizowanie pliku…</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">Odczytywanie pozycji %1$s z %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">Wstawianie wartości…</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Błąd podczas importu</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">Wystąpił błąd podczas importowania historii i zakładek: %s</string>\n    <string name=\"HistoryBookmarksExportTitle\">Eksport historii i zakładek</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">Eksportowanie historii i zakładek…</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">Sprawdzanie pamięci zewnętrznej…</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">Eksportowanie pozycji %1$s z %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Błąd podczas eksportu</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">Wystąpił błąd podczas eksportowania historii i zakładek: %s</string>\n    <string name=\"GeolocationTitle\">Dostęp do lokalizacji</string>\n    <string name=\"GeolocationMessage\">Strona %s żąda dostępu do twojej lokalizacji.</string>\n    <string name=\"GeolocationAccept\">Akceptuj</string>\n    <string name=\"GeolocationDecline\">Odrzuć</string>\n    <string name=\"WebsitesSettingsEmpty\">Brak ustawień dla stron internetowych.</string>\n    <string name=\"WebsitesSettingsSiteTitle\">Ustawienia dla %s</string>\n    <string name=\"WebsitesSettingsDataUsage\">%s MB przechowywane na urządzeniu.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Kliknij, aby wyczyścić zapisane dane.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Usuwanie danych</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Usunąć wszystkie zapisane dane na tej stronie internetowej?</string>\n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Kliknij, aby wyczyścić dostęp do informacji o lokalizacji.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">Ta witryna może uzyskać dostęp do informacji o lokalizacji.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">Ta witryna nie może uzyskać dostęp do informacji o lokalizacji.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Wyczyść dostęp do informacji o lokalizacji</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Wyczyścić dostęp do informacji o lokalizacji dla tej witryny?</string>\n    <string name=\"AddonsWarningText\">Proszę instalować tylko dodatki od zaufanych developerów. W przypadku występowania dziwnych zachowań, proszę wyłączyć wszystkie dodatki.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Pobierz dodatki</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Nie znaleziono sklepu android</string>\n    <string name=\"AddonsMarketNotFoundMessage\">Prawdopodobnie aplikacja sklepu android, nie znajduje się na urządzeniu.</string>\n    <string name=\"AddonsEnableAll\">Włącz wszystko</string>\n    <string name=\"AddonsDisableAll\">Wyłącz wszystko</string>\n    <string name=\"AddonDetailsContact\">Kontakt: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">Ten dodatek:</string>\n    <string name=\"AddonCallbackPageStarted\">Zostanie aktywowany, gdy strona rozpocznie wczytywanie.</string>\n    <string name=\"AddonCallbackPageFinished\">Zostanie aktywowany, gdy strona zakończy wczytywanie.</string>\n    <string name=\"AddonCallbackTabOpened\">Zostanie aktywowany gdy karta zostanie otwarta.</string>\n    <string name=\"AddonCallbackTabClosed\">Zostanie aktywowany gdy karta zostanie zamknięta.</string>\n    <string name=\"AddonCallbackTabSwitched\">Zostanie aktywowany podczas przełączania kart.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">Posiada ustawienia strony.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Może pracować w głównym menu.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Może pracować w menu kontekstowym jako łącze.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Może pracować w menu historii i zakładek.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Może pracować w menu kontekstowym jako zakładka.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Może pracować w menu kontekstowym jako historia.</string>\n    <string name=\"AddonDetailsUsedPermissionsTitle\">Posiada następujące uprawnienia:</string>\n    <string name=\"AddonDetailsPermissionsNone\">Brak.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Nie można uzyskać uprawnień. Sprawdź je w menadżerze aplikacji urządzenia.</string>\n    <string name=\"ContentDescriptionDivider\">separator</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Ikona aplikacji</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Proponuj ikony w zakładkach</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Miniatury w zakładkach</string>\n    <string name=\"ContentDescriptionFavicon\">Miniatury ikon w witrynach</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Idź / Zatrzymaj / Przycisk odświeżania</string>\n    <string name=\"ContentDescriptionMenuButton\">Przycisk menu</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Przycisk poprzedniej karty</string>\n    <string name=\"ContentDescriptionNextTabButton\">Przycisk następnej karty</string>\n    <string name=\"ContentDescriptionLeftBubble\">Przycisk menu z lewej</string>\n    <string name=\"ContentDescriptionRightBubble\">Przycisk menu z lewej</string>\n    <string name=\"ContentDescriptionBackButton\">Przycisk cofnij</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Przycisk zamknięcia karty</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Przycisk zakładek</string>\n    <string name=\"ContentDescriptionNewTabButton\">Przycisk nowej karty</string>\n    <string name=\"ContentDescriptionForwardButton\">Przycisk naprzód</string>\n    <string name=\"ContentDescriptionHomeButton\">Przycisk strony głównej</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Lokalizacja strony www</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Wykorzystanie strony www</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Właściwości strony www</string>\n    <string name=\"IncognitoTab\">Karta w trybie ukrytym</string>\n    <string name=\"ContextMenuOpenInBackground\">Otwórz w tle</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Wskaźnik prywatności przeglądania</string>\n    <string name=\"Folder\">Folder</string>\n    <string name=\"NewFolder\">Nowy folder</string>\n    <string name=\"NewFolderHint\">Nazwa dla nowego folderu</string>\n    <string name=\"ProvideNewFolderName\">Proszę podać nazwę nowego folderu lub wybrać istniejący.</string>\n    <string name=\"DeleteFolder\">Usuń folder</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Usunąć ten folder i całą jego zawartość?</string>\n    <string name=\"DeleteFolderTitle\">Usuwanie folderu</string>\n    <string name=\"DeleteFolderMessage\">Proszę czekać, folder i jego zawartość jest usuwana…</string>\n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Wróć w zakładkach do hierarchii folderów</string>\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Ułatwienia dostępu</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Rozmiar tekstu</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Podgląd rozmiaru tekstu</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Skalowanie tekstu</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Minimalny rozmiar czcionki</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Ustaw minimalny rozmiar czcionki używanej do wyświetlania tekstu w przeglądarce.</string>\n    <string name=\"FontPreviewTextTiny\">Bardzo mały</string>\n    <string name=\"FontPreviewTextSmall\">Mały</string>\n    <string name=\"FontPreviewTextNormal\">Normalny</string>\n    <string name=\"FontPreviewTextLarge\">Duży</string>\n    <string name=\"FontPreviewTextHuge\">Wielki</string>\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Negatyw ekranu</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Negatyw</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Czarny zmieni się w biały i odwrotnie.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Kontrast</string>\n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">Umieść sugerowany adres url w pasku adresu, nie przechodząc do niego.</string>\n    <string name=\"UnknownAutority\">nieznany certyfikat</string>\n    <string name=\"RememberMyChoice\">Zapamiętaj mój wybór</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">Wyjątek bezpieczeństwa SSL: Dostęp dozwolony dla %s przez użytkownika.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">Wyjątek bezpieczeństwa SSL: Dostęp niedozwolony dla %s przez użyytkownika.</string>\n    <string name=\"PreferenceSslExceptionsTitle\">Wyjątki zabezpieczeń SSL</string>\n    <string name=\"PreferenceSslExceptionsSummary\">Lista wyjątków zabezpieczeń SSL przez strony internetowe.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Kliknij, aby usunąć wyjątek.</i></string>\n    <string name=\"SslExceptionEmptyText\">Nie posiadasz żadnego wyjątku bezpieczeństwa SSL.</string>\n    <string name=\"RemoveSslExceptionTitle\">Usuń wyjątek</string>\n    <string name=\"RemoveSslExceptionMessage\">Czy chcesz usunąć wyjątek zabezpieczeń dla tej strony?</string>\n    <string name=\"SslInvalid\">Ten certyfikat jest nieprawidłowy.</string>\n    <string name=\"SslDateInvalid\">Data tego certyfikatu jest nieprawidłowa.</string>\n    <string name=\"Authorized\">Uprawniony:</string>\n    <string name=\"Reasons\">Powody:</string>\n    <string name=\"SearchUrlDialogText1\">Twoja wyszukiwarka jest aktualnie ustawiona jako:</string>\n    <string name=\"SearchUrlDialogText2\">Można to zmienić poprzez wybór wyszukiwarki z listy poniżej.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Ręcznie edytuj wyszukiwarkę</a></string>\n    <string name=\"SearchUrlConnecting\">Łączenie…</string>\n    <string name=\"SearchUrlParsing\">Analizowanie wyników…</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Nie można połączyć się z wyszukiwarką (kod odpowiedzi: %s).</string>\n    <string name=\"SearchUrlDefault\">Google Międzynarodowa</string>\n    <string name=\"SearchUrlCustom\">Własna wyszukiwarka</string>\n    <string name=\"SortBookmarks\">Sortuj zakładki</string>\n    <string name=\"MostUsedSortMode\">Najczęściej używane</string>\n    <string name=\"AlphaSortMode\">Alfabetycznie</string>\n    <string name=\"RecentSortMode\">Ostatnio odwiedzane</string>\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Nieprawidłowy format pliku</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">Odczytywanie folderu %1$s z %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">Łączenie folderów…</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">Odczytywanie zakładek %1$s z %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">Odczytywanie pozycji historii %1$s z %2$s.</string>\n    <string name=\"FullScreen\">Pełny ekran</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Wyjdź przyciskiem z pełnego ekranu</string>\n    <string name=\"StartPageLabel\">Strona startowa</string>\n    <string name=\"RestartDialogTitle\">Wymagany restart</string>\n    <string name=\"RestartDialogMessage\">Zmiana ta będzie obowiązywać po ponownym uruchomieniu aplikacji. Czy chcesz zrobić to teraz?</string>\n    <string name=\"ContentDescriptionTabPreview\">Podgląd karty</string>\n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Zamknij boczny panel w nowej karcie</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">Gdy zaznaczone, boczny panel zostanie zamknięty podczas otwierania nowej karty.</string>\n    <string name=\"AboutChangelogTitle\">Zmiany</string>\n    <string name=\"AboutContributorsTitle\">Współtwórcy</string>\n    <string name=\"AboutLicensesTitle\">Inne licencje</string>\n    <string name=\"RestoreTabsDialogTitle\">Przywracanie kart</string>\n    <string name=\"RestoreTabsDialogMessage\">Chcesz przywrócić karty z poprzedniej sesji?</string>\n    <string name=\"PreferenceRestoreTabsTitle\">Przywracanie kart</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Wybierz sposób przywracania kart z poprzedniej sesji.</string>\n    <string name=\"PreferenceRestoreTabsAsk\">Pytaj</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Zawsze</string>\n    <string name=\"PreferenceRestoreTabsNever\">Nigdy</string>\n    <string name=\"PreferenceUITypeTitle\">Typ interfejsu użytkownika UI</string>\n    <string name=\"PreferenceUITypeSummary\">Wybierz rodzaj interfejsu użytkownika.</string>\n    <string name=\"PreferenceUITypeAuto\">Automatycznie</string>\n    <string name=\"PreferenceUITypePhone\">Telefon</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Telefon (legacy)</string>\n    <string name=\"PreferenceUITypeTablet\">Tablet</string>\n    <string name=\"PreferenceDevelopersTitle\">Dla Developerów</string>\n    <string name=\"PreferenceJsLogOnLocatTitle\">Logi Javascript do logcat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Przekierowanie logów javascript do bufora LogCat.</string>\n    <string name=\"ContextMenuViewImageInNewTab\">Pokaż obraz w nowej karcie</string>\n</resources>\n"
  },
  {
    "path": "res/values-port/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    \n    <integer name=\"tab_title_length\">20</integer>\n    \n</resources>\n"
  },
  {
    "path": "res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">O Tint Browser é um browser open-source para Android.</string>\n    \n    <string name=\"AboutVersionText\">Versão: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">Licença: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    \n    <string name=\"PermissionReadBookmarksLabel\">Ler favoritos do Tint Browser</string>\n    <string name=\"PermissionReadBookmarksDescription\">Permitir aos addons e aplicações de terceiros a leitura do histórico e favoritos do Tint Browser.</string>\n    \n\t<string name=\"PermissionWriteBookmarksLabel\">Escrever favoritos do Tint Browser</string>\n    <string name=\"PermissionWriteBookmarksDescription\">Permitir aos addons e aplicações de terceiros a escrita do histórico e favoritos do Tint Browser.</string>        \n    \n    <string name=\"PermissionBindAddonServiceLabel\">Vincular os serviços de addons do Tint Browser</string>\n    <string name=\"PermissionBindAddonServiceDescription\">Permitir a uma aplicação vincular-se aos serviços de addons do Tint Browser. Somente o Tint Browser deverá ter esta permissão.</string>\n    \n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Cancelar</string>\n    <string name=\"Yes\">Sim</string>\n    <string name=\"No\">Não</string>\n    <string name=\"On\">On</string>\n    <string name=\"Off\">Off</string>\n    <string name=\"Clear\">Apagar</string>\n    <string name=\"Continue\">Continuar</string>\n    <string name=\"Proceed\">Proceder</string>\n    <string name=\"VideoLoading\">A carregar vídeo\\u2026</string>\n    <string name=\"History\">Histórico</string>\n    <string name=\"All\">Todos</string>\n    <string name=\"Bookmarks\">Favoritos</string>\n    <string name=\"Preferences\">Definições</string>\n    \n    <string name=\"UrlBarUrlDefaultSubTitle\">Tocar para introduzir um endereço ou pesquisa.</string>\n    <string name=\"UrlBarUrlHint\">Introduzir uma pesquisa ou endereço</string>\n    \n    <string name=\"ShareChooserTitle\">Partilhar via</string>\n    <string name=\"FileChooserPrompt\">Escolher ficheiro para enviar</string>\n    \n    <string name=\"Download\">Descarregar</string>\n    <string name=\"DownloadDialogTitle\">Descarregue</string>\n    <string name=\"DownloadInIncognito\">Descarrega incógnito</string>\n    <string name=\"DownloadStart\">A descarregar %1$s&#8230;</string>\n    <string name=\"DownloadComplete\">Download completo.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">Download falhou: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Erro de disco, verifique se tem um dispositivo de armazenamento, e se este tem espaço livre suficiente.</string>\n    <string name=\"DownloadErrorHttp\">Erro de HTTP</string>\n    <string name=\"DownloadErrorRedirection\">Demasiados redirecionamentos</string>\n    <string name=\"DownloadErrorUnknown\">Erro desconhecido</string>\n    \n    <string name=\"ContextMenuOpen\">Abrir</string>\n    <string name=\"ContextMenuOpenNewTab\">Abrir num novo separador</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Copiar endereço</string>\n    <string name=\"ContextMenuDownload\">Descarregar</string>\n    <string name=\"ContextMenuShareLinkUrl\">Partilhar endereço</string>\n    \n    <string name=\"ContextMenuViewImage\">Ver imagem</string>\n    <string name=\"ContextMenuCopyImageUrl\">Copiar endereço de imagem</string>\n    <string name=\"ContextMenuDownloadImage\">Descarregar imagem</string>\n    <string name=\"ContextMenuShareImageUrl\">Partilhar imagem</string>\n    \n    <string name=\"ContextMenuSendEmail\">Enviar email</string>\n    <string name=\"ContextMenuCopyEmailUrl\">Copiar endereço de email</string>\n    <string name=\"ContextMenuShareEmailUrl\">Partilhar email</string>\n    \n    <string name=\"UrlCopyToastMessage\">Endereço copiado para a área de transferência</string>\n    <string name=\"ContextMenuShareUrl\">Partilhar</string>\n    \n    <string name=\"JavaScriptAlertDialog\">Alerta de JavaScript</string>\n    <string name=\"JavaScriptConfirmDialog\">Confirmação de JavaScript</string>\n    <string name=\"JavaScriptPromptDialog\">Aviso de JavaScript</string>        \n\t\n\t<string name=\"SslWarning\">Aviso de segurança</string>\n\t<string name=\"SslWarningsHeader\">Há problemas com o certificado de segurança para site (%s).</string>\n\t<string name=\"SslUntrusted\">Este certificado não pertence a uma fonte segura.</string>\n\t<string name=\"SslIDMismatch\">O nome do site não corresponde ao nome no certificado.</string>\n\t<string name=\"SslExpired\">Este certificado expirou.</string>\n\t<string name=\"SslNotYetValid\">Este certificado ainda não é válido.</string>        \n        \n    <string name=\"NewTab\">Novo separador</string>\n        \n    <string name=\"CloseTab\">Fechar separador atual</string>\n    <string name=\"AddBookmark\">Adicionar favorito</string>\n    <string name=\"SharePage\">Partilhar página</string>\n    <string name=\"Search\">Localizar na página</string>\n    \n    <string name=\"BookmarksTitle\">Favoritos e Histórico</string>\n    <string name=\"BookmarksTabTitle\">Favoritos</string>\n    <string name=\"HistoryTabTitle\">Histórico</string>\n    \n    <string name=\"ImportHistoryBookmarks\">Importar</string>\n    <string name=\"ExportHistoryBookmarks\">Exportar</string>\n    <string name=\"ClearHistoryBookmarks\">Apagar</string>\n    \n    <string name=\"AddBookmarkTitle\">Adicionar favorito</string>\n    <string name=\"BookmarkText\">Etiqueta</string>\n    <string name=\"UrlText\">Endereço</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Por favor providencie uma etiqueta e endereço corretos.</string>\n    \n    <string name=\"OpenInTab\">Abrir num separador novo</string>\n    <string name=\"EditBookmark\">Editar favorito</string>\n    <string name=\"CopyUrl\">Copiar endereço</string>\n    <string name=\"DeleteBookmark\">Apagar favorito</string>\n    <string name=\"DeleteHistoryItem\">Apagar do histórico</string>\n    \n    <string name=\"PreferencesActivityTitle\">Definições</string>\n        \n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">Definições gerais</string>\n    \n    <string name=\"PreferenceGeneralHomepageTitle\">Página inicial</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Definir a página inicial a carregar ao abrir um separador novo, etc.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Página inicial</string>\n    \n    <string name=\"PreferenceGeneralSearchUrlTitle\">Motor de pesquisa</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Definir o motor de busca predefinido ao executar uma pesquisa a partir da barra de endereços.</string>\n    \n    <string name=\"PreferenceCategoryStartPageTitle\">Página inicial</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Número de itens na página inicial</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Definir o número de itens a mostrar na página inicial.</string>\n    \n    <string name=\"PreferenceCategoryUITitle\">Interface de utilizador</string>\n        \n    <string name=\"PreferenceBubblePositionTitle\">Posição da bolha</string>\n    <string name=\"PreferenceBubblePositionSummary\">Posição da bolha que permite mostrar as barras de ferramentas.</string>\n    \n    <string name=\"PreferenceBubblePositionRight\">Direita</string>\n    <string name=\"PreferenceBubblePositionLeft\">Esquerda</string>\n    <string name=\"PreferenceBubblePositionBoth\">Ambos</string>\n    \n    <string-array name=\"PreferenceBubblePositionEntries\">\n\t\t<item>@string/PreferenceBubblePositionRight</item>\n\t\t<item>@string/PreferenceBubblePositionLeft</item>\n\t\t<item>@string/PreferenceBubblePositionBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceBubblePositionValues\">\n\t\t<item>RIGHT</item>\n\t\t<item>LEFT</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Duração das barras de ferramentas</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Definir o tempo de duração da visibilidade das barras de ferramentas, em segundos.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodTitle\">Método de alteração de separadores</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Definir como alternar entre separadores.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodButtons\">Botões</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Arrastar</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Ambos</string>\n    \n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n\t\t<item>@string/PreferenceSwitchTabsMethodButtons</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodFling</item>\n\t\t<item>@string/PreferenceSwitchTabsMethodBoth</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n\t\t<item>BUTTONS</item>\n\t\t<item>FLING</item>\n\t\t<item>BOTH</item>\n\t</string-array>\n    \n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Definições do browser</string>\n    \n    <string name=\"PreferenceEnableJavascriptTitle\">Ativar JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript está ativado.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript está desativado.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Ativar imagens</string>\n    <string name=\"PreferenceEnableImagesSummary\">Ativar para carregar imagens.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Usar viewport amplo</string>\n    <string name=\"PreferenceUseWideViewportSummary\">Se ativado, o browser irá usar um viewport similar ao dos browsers de desktop.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Abrir páginas em vista geral</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Ativar para efetuar carregamento das páginas na vista geral.</string>\n    <string name=\"PreferencePluginsTitle\">Ativar plugins</string>\n    <string name=\"PreferencePluginsSummary\">Escolher como gerir os plugins.</string>\n    \n    <string name=\"PreferencePluginsAlwaysOff\">Sempre desligados</string>\n    <string name=\"PreferencePluginsOnDemand\">A pedido</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Sempre ligados</string>\n    \n    <string-array name=\"PreferencePluginsEntries\">\n\t\t<item>@string/PreferencePluginsAlwaysOff</item>\n\t\t<item>@string/PreferencePluginsOnDemand</item>\n\t\t<item>@string/PreferencePluginsAlwaysOn</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferencePluginsValues\">\n\t\t<item>OFF</item>\n\t\t<item>ON_DEMAND</item>\n\t\t<item>ON</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUserAgentTitle\">User-agent</string>\n    <string name=\"PreferenceUserAgentSummary\">Definir o user-agent a usar pelo browser.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">User-agent</string>\n    \n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Definições de privacidade e segurança</string>\n    \n    <string name=\"PreferencePrivacyClearCacheTitle\">Apagar cache</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Apagar cache e bases de dados locais.</string>\n        \n    <string name=\"PreferenceCategoryHistoryTitle\">Histórico</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">Tamanho do histórico</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Definir tamanho do histórico, em dias.</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Apagar histórico</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Apagar histórico de navegação.</string>\n        \n    <string name=\"PreferenceCategoryCookiesTitle\">Cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Aceitar cookies</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Permitir que os sites guardem e leiam dados de cookies.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Apagar cookies</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Apagar todos os cookies do browser.</string>\n    \n    <string name=\"PreferenceCategoryGeolocationTitle\">Localização</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Ativar localização</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Permitir que os sites peçam acesso à sua localização.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Apagar acessos à localização</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Apagar acessos à localização para todos os sites.</string>\n    \n    <string name=\"PreferenceCategoryFormDataTitle\">Dados de formulário</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Lembrar dados de formulário</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Lembrar dados de formulário para usar mais tarde.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Apagar dados de formulário</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Apagar todos os dados de formulário guardados.</string>\n    \n    <string name=\"PreferenceCategoryPasswordsTitle\">Senhas</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Lembrar senhas</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Guardar nomes de utilizador e senhas para os sites.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Apagar senhas</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Apagar todas as senhas guardadas.</string>\n    \n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Definições de sites</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Definições avançadas para sites individuais.</string>\n    \n    <string name=\"PreferencePrivacyIncognitoTitle\">Modo incognito</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Incognito por padrão</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Abrir novas abas no modo incógnito</string>\n    \n    <string name=\"HistoryToday\">Hoje</string>\n    <string name=\"HistoryYesterday\">Ontem</string>\n    <string name=\"HistoryLastSevenDays\">Últimos 7 dias</string>\n    <string name=\"HistoryLastMonth\">Último mês</string>\n    <string name=\"HistoryOlder\">Mais antigo</string>\n    \n    <string name=\"ClearCacheMessage\">Apagar conteúdo e bases de dados locais?</string>\n    <string name=\"ClearHistoryMessage\">Apagar histórico de navegação do browser?</string>\n    <string name=\"ClearCookiesMessage\">Apagar todos os cookies?</string>\n    <string name=\"ClearGeolocationMessage\">Apagar dados de acesso dos sites?</string>\n    <string name=\"ClearFormDataMessage\">Apagar todos os dados de formulário guardados?</string>\n    <string name=\"ClearPasswordsMessage\">Apagar todas as senhas guardadas?</string>\n    \n    <string name=\"PreferenceHomepageStart\">Página inicial</string>\n    <string name=\"PreferenceHomepageBlank\">Página em branco</string>\n    <string name=\"PreferenceHomepageCustom\">Página personalizada</string>\n    \n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n    \n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">Desktop</string>\n    <string name=\"PreferenceUserAgentOther\">Outro</string>\n    \n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n    \n    <string name=\"SearchUrlGoogle\">http://www.google.pt/m?q={searchTerms}</string>\n    \n    <string name=\"PreferenceHeaderAddonsTitle\">Addons</string>    \n    \n    <string name=\"PreferenceHeaderAboutTitle\">Sobre</string>\n    \n    <string name=\"HttpAuthenticationDialogDialogTitle\">Entrar em %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Nome</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Senha</string>\n    \n    <string name=\"FormResubmitTitle\">Reenvio de formulário</string>\n    <string name=\"FormResubmitMessage\">A página que está a tentar ver contém dados já submetidos (\\\"POSTDATA\\\"). Se reenviar os dados, qualquer ação que o formulário tenha feito na página (tal como uma pesquisa ou compra online) será repetida.</string>\n    \n    <string name=\"BookmarkAdded\">Adicionado aos favoritos.</string>\n    <string name=\"BookmarkRemoved\">Removido dos favoritos.</string>\n    \n    <string name=\"SDCardErrorNoSDMsg\">Cartão de memória não encontrado.</string>\n    <string name=\"SDCardErrorSDUnavailable\">Cartão de memória não disponível.</string>\n    \n    <string name=\"HistoryBookmarksClearTitle\">Apagar</string>\n    \n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n    \n    <string name=\"HistoryBookmarksImportSourceTitle\">Importar ficheiro</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Ficheiro indisponível, ou não existe ou não é legível.</string>\n    <string name=\"HistoryBookmarksImportTitle\">Importar histórico e favoritos</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">A importar histórico e favoritos&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">A ler ficheiro&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">A analizar ficheiro&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">A ler item %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">A inserir valores&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Erro durante a importação</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">Ocorreu um erro durante a importação do histórico e favoritos: %s</string>\n    \n    <string name=\"HistoryBookmarksExportTitle\">Exportar histórico e favoritos</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">A exportar histórico e favoritos&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">A verificar armazenamento externo&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">A exportar item %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Erro durante a exportação</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">Ocorreu um erro durante a exportação do histórico e favoritos: %s</string>\n    \n    <string name=\"GeolocationTitle\">Pedido de localização</string>\n    <string name=\"GeolocationMessage\">Pedido de acesso do site %s à sua localização.</string>        \n    <string name=\"GeolocationAccept\">Aceitar</string>\n    <string name=\"GeolocationDecline\">Recusar</string>\n    \n    <string name=\"WebsitesSettingsEmpty\">Sem definições para sites.</string>\n    \n    <string name=\"WebsitesSettingsSiteTitle\">Definições para %s</string>\n    \n    <string name=\"WebsitesSettingsDataUsage\">%s MB armazenados no seu dispositivo.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Carregar para apagar dados armazenados.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Apagar dados</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Apagar todos os dados armazenados para este site?</string>\n    \n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Carregar para apagar acessos de localização.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">Este site pode aceder à sua localização.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">Este site não pode aceder à sua localização.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Apagar acessos de localização</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Apagar acessos de localização para este site?</string>\n    \n    <string name=\"AddonsWarningText\">Por favor instale apenas addons de desenvolvedores de confiança. Se experimentar comportamentos estranhos, desative todos os seus addons.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Obter addons</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Android Market não encontrado</string>\n    <string name=\"AddonsMarketNotFoundMessage\">O Android Market não parece estar instalado no seu dispositivo.</string>\n    <string name=\"AddonsEnableAll\">Ativar todos</string>\n    <string name=\"AddonsDisableAll\">Desativar todos</string>\n    \n    <string name=\"AddonDetailsContact\">Contacto: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">Este addon:</string>\n    \n    <string name=\"AddonCallbackPageStarted\">É notificado quando uma página começar a carregar.</string>\n    <string name=\"AddonCallbackPageFinished\">É notificado quando uma página acabar de carregar.</string>\n    <string name=\"AddonCallbackTabOpened\">É notificado quando um separador for aberto.</string>\n    <string name=\"AddonCallbackTabClosed\">É notificado quando um separador for fechado.</string>\n    <string name=\"AddonCallbackTabSwitched\">É notificado ao alternar entre separadores.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">Tem uma página de definições.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Pode contribuir para o menu principal.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Pode contribuir para o menu de contexto de ligação.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Pode contribuir para o menu de favoritos e histórico.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Pode contribuir para o menu de favoritos.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Pode contribuir para o menu de histórico.</string>\n    \n    <string name=\"AddonDetailsUsedPermissionsTitle\">Tem as seguintes permissões:</string>\n    <string name=\"AddonDetailsPermissionsNone\">Nenhuma.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Incapaz de ler permissões. Verifique-as com o gestor de aplicações do seu dispositivo.</string>\n    \n    <string name=\"ContentDescriptionDivider\">divisor</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Ícone de aplicação</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Sugestão favicon</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Miniatura de favorito</string>\n    <string name=\"ContentDescriptionFavicon\">Favicon de site</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Ir / Parar / Recarregar botão</string>\n    <string name=\"ContentDescriptionMenuButton\">Botão de menu</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Botão de separador anterior</string>\n    <string name=\"ContentDescriptionNextTabButton\">Botão de separador seguinte</string>\n    <string name=\"ContentDescriptionLeftBubble\">Bolha esquerda</string>\n    <string name=\"ContentDescriptionRightBubble\">Bolha direita</string>\n    <string name=\"ContentDescriptionBackButton\">Botão de retrocesso</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Botão de fechar separador</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Botão de favoritos</string>\n    <string name=\"ContentDescriptionNewTabButton\">Botão de separador novo</string>\n    <string name=\"ContentDescriptionForwardButton\">Botão de avanço</string>\n    <string name=\"ContentDescriptionHomeButton\">Botão de início</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Localização de site</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Uso de site</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Características de site</string>\n    \n    <string-array name=\"DefaultBookmarksTitles\">\n\t\t<item>Google</item>\n\t\t<item>Wikipedia</item>\n\t\t<item>YouTube</item>\n\t\t<item>Yahoo!</item>\n\t\t<item>BBC</item>\n\t\t<item>eBay</item>\n\t</string-array>\n\t\n    <string-array name=\"DefaultBookmarksUrls\">\n\t\t<item>http://www.google.com/</item>\n\t\t<item>http://en.wikipedia.org/</item>\n\t\t<item>http://www.youtube.com/</item>\n\t\t<item>http://www.yahoo.com/</item>\n\t\t<item>http://www.bbc.co.uk/</item>\n\t\t<item>http://www.ebay.com/</item>\n\t</string-array>\n\t\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">Separador incognito</string>\n    <string name=\"ContextMenuOpenInBackground\">Abrir em background</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Indicador de navegação privada</string>\n    \n    <!-- 1.3 -->\n    <string name=\"Folder\">Pasta</string>\n    <string name=\"NewFolder\">Nova pasta</string>        \n    <string name=\"NewFolderHint\">Nome de nova pasta</string>\n    <string name=\"ProvideNewFolderName\">Por favor providencie um nome para a nova pasta, ou escolha uma existente.</string>\n    \n    <string name=\"DeleteFolder\">Apagar pasta</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Apagar esta pasta e todo o seu conteúdo?</string>\n    <string name=\"DeleteFolderTitle\">A apagar pasta</string>\n    <string name=\"DeleteFolderMessage\">Por favor aguarde enquanto a pasta e o seu conteúdo estão a ser apagados&#8230;</string>\n    \n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Voltar na hierarquia das pastas dos favoritos</string>\n    \n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Definições de acessibilidade</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Tamanho do texto</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Pré-visualização do tamanho do texto</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Escala de texto</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Tamanho mínimo da fonte</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Definir o tamanho mínimo da fonte usada para monstrar o texto no browser.</string>\n    \n    <string name=\"FontPreviewTextTiny\">Minúsculo</string>\n    <string name=\"FontPreviewTextSmall\">Pequeno</string>\n    <string name=\"FontPreviewTextNormal\">Normal</string>\n    <string name=\"FontPreviewTextLarge\">Grande</string>\n    <string name=\"FontPreviewTextHuge\">Enorme</string>\n    \n    <string-array name=\"FontPreviewText\">\n\t\t<item>@string/FontPreviewTextTiny</item>\n\t\t<item>@string/FontPreviewTextSmall</item>\n\t\t<item>@string/FontPreviewTextNormal</item>\n\t\t<item>@string/FontPreviewTextLarge</item>\n\t\t<item>@string/FontPreviewTextHuge</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Renderização invertida do ecran</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Renderização invertida</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Renderização invertida das cores do ecran. Pode não funcionar em todos os dispositivos.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Contraste</string>\n    \n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">Coloque o endereço de sugestão na barra de endereços, sem navegar para ele.</string>\n    \n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">fonte desconhecida</string>\n    <string name=\"RememberMyChoice\">Lembrar a minha escolha</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">Exceção de segurança de SSL: Acesso permitido a %s pelo utilizador.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">Exceção de segurança de SSL: Accesso não permitido a %s pelo utilizador.</string>\n    \n    <string name=\"PreferenceSslExceptionsTitle\">Exceções de segurança de SSL</string>\n    <string name=\"PreferenceSslExceptionsSummary\">Lista de exceções de segurança de SSL dos sites.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Clicar para remover exceção.</i></string>\n    <string name=\"SslExceptionEmptyText\">Não existem nenhumas exceções de segurança de SSL.</string>\n    \n    <string name=\"RemoveSslExceptionTitle\">Remover exceção</string>\n    <string name=\"RemoveSslExceptionMessage\">Remover exceção de segurança para este site?</string>\n    \n    <string name=\"SslInvalid\">Este certificado é inválido.</string>\n    <string name=\"SslDateInvalid\">A data deste certificado é inválida.</string>\n    \n    <string name=\"Authorized\">Autorizado:</string>\n    <string name=\"Reasons\">Razões:</string>\n    \n    <string name=\"SearchUrlDialogText1\">O seu motor de busca está atualmente definido para:</string>\n    <string name=\"SearchUrlDialogText2\">Pode altera-lo escolhendo um motor de busca proposto abaixo.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Editar manualmente o motor de busca</a></string>        \n    <string name=\"SearchUrlConnecting\">A ligar&#8230;</string>\n    <string name=\"SearchUrlParsing\">A analizar resultados&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Não é possível ligar ao repositório de motores de busca (código de resposta: %s).</string>\n    \n    <string name=\"SearchUrlDefault\">Google Portugal</string>\n    <string name=\"SearchUrlCustom\">Motor de busca personalizado</string>\n    \n    <string name=\"SortBookmarks\">Ordenar favoritos</string>        \n    <string name=\"MostUsedSortMode\">Mais utilizados</string>\n    <string name=\"AlphaSortMode\">Alfabeticamente</string>\n    <string name=\"RecentSortMode\">Visitados recentemente</string>\n    \n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Tipo de ficheiro inválido</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">A ler pasta %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">A vincular pastas&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">A ler favorito %1$s de %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">A ler item do histórico %1$s de %2$s.</string>\n    \n    <string name=\"FullScreen\">Ecran completo</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Botão de saída de ecran completo</string>\n\n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">Página inicial</string>\n\n    <string name=\"RestartDialogTitle\">É necessário reiniciar</string>\n    <string name=\"RestartDialogMessage\">Esta alteração não terá efeito até reiniciar a aplicação. Deseja reiniciar agora?</string>\n    \n    <string name=\"ContentDescriptionTabPreview\">Pré-visualização de separador</string>\n    \n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Fechar painel lateral com separador novo</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">Se marcado, o painel lateral irá fechar ao abrir um separador novo.</string>\n    \n    <string name=\"AboutChangelogTitle\">Changelog</string>\n    <string name=\"AboutContributorsTitle\">Contribuidores</string>\n    <string name=\"AboutLicensesTitle\">Outras licenças</string>\n    \n    <string name=\"RestoreTabsDialogTitle\">Restauro de separadores</string>\n    <string name=\"RestoreTabsDialogMessage\">Quer restaurar os separadores da sessão anterior?</string>\n    \n    <string name=\"PreferenceRestoreTabsTitle\">Restauro de separadores</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Selecione como pretende que os separadores da sessão anterior sejam restaurados.</string>\n    \n    <string name=\"PreferenceRestoreTabsAsk\">Perguntar</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Sempre</string>\n    <string name=\"PreferenceRestoreTabsNever\">Nunca</string>\n    \n    <string-array name=\"PreferenceRestoreTabsEntries\">\n\t\t<item>@string/PreferenceRestoreTabsAsk</item>\n\t\t<item>@string/PreferenceRestoreTabsAlways</item>\n\t\t<item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceRestoreTabsValues\">\n\t\t<item>ASK</item>\n\t\t<item>ALWAYS</item>\n\t\t<item>NEVER</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUITypeTitle\">Tipo de UI</string>\n    <string name=\"PreferenceUITypeSummary\">Selecione o tipo de interface de utilizador.</string>\n    \n    <string name=\"PreferenceUITypeAuto\">Automático</string>\n    <string name=\"PreferenceUITypePhone\">Telefone</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Telefone (legacy)</string>\n    <string name=\"PreferenceUITypeTablet\">Tablet</string>\n    \n    <string-array name=\"PreferenceUITypeEntries\">\n\t\t<item>@string/PreferenceUITypeAuto</item>\n\t\t<item>@string/PreferenceUITypePhone</item>\n\t\t<item>@string/PreferenceUITypeLegacyPhone</item>\n\t\t<item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceUITypeValues\">\n\t\t<item>AUTO</item>\n\t\t<item>PHONE</item>\n\t\t<item>LEGACY_PHONE</item>\n\t\t<item>TABLET</item>\n\t</string-array>\n\t\n    <!-- 1.8 -->\n    <string name=\"PreferenceDevelopersTitle\">Desenvolvedores</string>\n    \n    <string name=\"PreferenceJsLogOnLocatTitle\">Entrar registros JS para logcat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Redirecionar os registros JS para o buffer logcat.</string>\n    \n</resources>"
  },
  {
    "path": "res/values-ru/strings.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<resources>\n\n    <string name=\"ApplicationName\">Tint Browser</string>\n    <string name=\"ApplicationDescription\">Tint Browser - это браузер с открытым исходом кодом для Android.</string>\n    \n    <string name=\"AboutVersionText\">Версия: %1$s (%2$s)</string>\n    <string name=\"AboutLicenseText\">Лицензия: GPLv3</string>\n    <string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n    \n    <string name=\"PermissionReadBookmarksLabel\">Читать закладки</string>\n    <string name=\"PermissionReadBookmarksDescription\">Разрешить сторонним приложениям и дополнениям читать историю и закладки браузера.</string>\n    \n    <string name=\"PermissionWriteBookmarksLabel\">Сохранять в закладки</string>\n    <string name=\"PermissionWriteBookmarksDescription\">Разрешить сторонним приложениям и дополнениям сохранять в историю и закладки браузера.</string>\n    \n    <string name=\"PermissionBindAddonServiceLabel\">Сервис привязки плагинов к браузеру</string>\n    <string name=\"PermissionBindAddonServiceDescription\">Разрешить приложениям добавлять дополнения к браузеру. Только у самого браузера должно быть это разрешение.</string>\n    \n    <string name=\"OK\">OK</string>\n    <string name=\"Cancel\">Отмена</string>\n    <string name=\"Yes\">Да</string>\n    <string name=\"No\">Нет</string>\n    <string name=\"On\">Вкл.</string>\n    <string name=\"Off\">Выкл.</string>\n    <string name=\"Clear\">Очистить</string>\n    <string name=\"Continue\">Дальше</string>\n    <string name=\"Proceed\">Продолжить</string>\n    <string name=\"VideoLoading\">Загрузка видео\\u2026</string>\n    <string name=\"History\">История</string>\n    <string name=\"All\">Все</string>\n    <string name=\"Bookmarks\">Закладки</string>\n    <string name=\"Preferences\">Настройки</string>\n    \n    <string name=\"UrlBarUrlDefaultSubTitle\">Коснитесь для ввода адреса или поиска.</string>\n    <string name=\"UrlBarUrlHint\">Условия поиска или URL</string>\n    \n    <string name=\"ShareChooserTitle\">Поделиться</string>\n    <string name=\"FileChooserPrompt\">Выберите файл для загрузки</string>\n    \n    <string name=\"Download\">Загрузите</string>\n    <string name=\"DownloadDialogTitle\">Загрузки</string>\n    <string name=\"DownloadInIncognito\">Загрузки инкогнито</string>\n    <string name=\"DownloadStart\">Загрузка %1$s&#8230;</string>\n    <string name=\"DownloadComplete\">Загрузка завершена.</string>\n    <string name=\"DownloadFailedWithErrorMessage\">Загрузка прервана: %1$s.</string>\n    <string name=\"DownloadErrorDisk\">Ошибка диска. Проверьте, подключен ли носитель информации и имеет ли он достаточно места.</string>\n    <string name=\"DownloadErrorHttp\">Ошибка HTTP</string>\n    <string name=\"DownloadErrorRedirection\">Слишком много перенаправлений</string>\n    <string name=\"DownloadErrorUnknown\">Неизвестная ошибка</string>\n    \n    <string name=\"ContextMenuOpen\">Открыть</string>\n    <string name=\"ContextMenuOpenNewTab\">Открыть в новой вкладке</string>\n    <string name=\"ContextMenuCopyLinkUrl\">Копировать ссылку</string>\n    <string name=\"ContextMenuDownload\">Скачать</string>\n    <string name=\"ContextMenuShareLinkUrl\">Поделиться ссылкой</string>\n    \n    <string name=\"ContextMenuViewImage\">Просмотр изображения</string>\n    <string name=\"ContextMenuCopyImageUrl\">Копировать ссылку на изображение</string>\n    <string name=\"ContextMenuDownloadImage\">Скачать изображение</string>\n    <string name=\"ContextMenuShareImageUrl\">Поделиться изображением</string>\n    \n    <string name=\"ContextMenuSendEmail\">Написать письмо</string>\n    <string name=\"ContextMenuCopyEmailUrl\">Скопировать email адрес</string>\n    <string name=\"ContextMenuShareEmailUrl\">Поделиться адресом email</string>\n    \n    <string name=\"UrlCopyToastMessage\">Адрес веб-страницы скопирован в буфер обмена.</string>\n    <string name=\"ContextMenuShareUrl\">Поделиться</string>\n    \n    <string name=\"JavaScriptAlertDialog\">JavaScript: предупреждение</string>\n    <string name=\"JavaScriptConfirmDialog\">JavaScript: подтверждение</string>\n    <string name=\"JavaScriptPromptDialog\">JavaScript: подсказка</string>\n    \n    <string name=\"SslWarning\">Предупреждение системы безопасности</string>\n    <string name=\"SslWarningsHeader\">Есть проблемы с сертификатом безопасности для этого сайта (%s).</string>\n    <string name=\"SslUntrusted\">Этот сертификат не является доверенным.</string>\n    <string name=\"SslIDMismatch\">Название сайта не совпадает с именем в сертификате.</string>\n    <string name=\"SslExpired\">Этот сертификат истек.</string>\n    <string name=\"SslNotYetValid\">Даный сетртификат еще не действителен.</string>\n    \n    <string name=\"NewTab\">Новая вкладка</string>\n    \n    <string name=\"CloseTab\">Закрыть вкладку</string>\n    <string name=\"AddBookmark\">Добавить закладку</string>\n    <string name=\"SharePage\">Поделиться страницей</string>\n    <string name=\"Search\">Искать на странице</string>\n    \n    <string name=\"BookmarksTitle\">Закладки и история</string>\n    <string name=\"BookmarksTabTitle\">Закладки</string>\n    <string name=\"HistoryTabTitle\">История</string>\n    \n    <string name=\"ImportHistoryBookmarks\">Импортировать</string>\n    <string name=\"ExportHistoryBookmarks\">Экспортировать</string>\n    <string name=\"ClearHistoryBookmarks\">Очистить</string>\n    \n    <string name=\"AddBookmarkTitle\">Добавить закладку</string>\n    <string name=\"BookmarkText\">Название</string>\n    <string name=\"UrlText\">Адрес</string>\n    <string name=\"UrlHint\">http://</string>\n    <string name=\"AddBookmarkLabelOrUrlEmpty\">Пожалуйста укажите действительное название и адрес.</string>\n    \n    <string name=\"OpenInTab\">Открыть в новой вкладке</string>\n    <string name=\"EditBookmark\">Редактировать закладку</string>\n    <string name=\"CopyUrl\">Копировать адрес</string>\n    <string name=\"DeleteBookmark\">Удалить закладку</string>\n    <string name=\"DeleteHistoryItem\">Удалить из истории</string>\n    \n    <string name=\"PreferencesActivityTitle\">Настройки</string>\n    \n    <string name=\"PreferenceHeaderGeneralSettingsTitle\">Общие</string>\n    \n    <string name=\"PreferenceGeneralHomepageTitle\">Домашняя страница</string>\n    <string name=\"PreferenceGeneralHomepageSummary\">Страница, которая будет показа при открытии новой вкладки.</string>\n    <string name=\"PreferenceHomePageDialogTitle\">Домашная страница</string>\n    \n    <string name=\"PreferenceGeneralSearchUrlTitle\">Поисковая система</string>\n    <string name=\"PreferenceGeneralSearchUrlSummary\">Выберите поисковую системы для ее использовании в адресной строке.</string>\n    \n    <string name=\"PreferenceCategoryStartPageTitle\">Стартовая страница</string>\n    <string name=\"PreferenceGeneralStartPageLimitTitle\">Количество элементов на стартовой странице</string>\n    <string name=\"PreferenceGeneralStartPageLimitSummary\">Установить количество элементов на стартовой странице.</string>\n    \n    <string name=\"PreferenceCategoryUITitle\">Интерфейс пользователя</string>\n    \n    <string name=\"PreferenceBubblePositionTitle\">Bubble position</string>\n    <string name=\"PreferenceBubblePositionSummary\">Position of the bubble allowing to show the toolbars.</string>\n    \n    <string name=\"PreferenceBubblePositionRight\">Справа</string>\n    <string name=\"PreferenceBubblePositionLeft\">Слева</string>\n    <string name=\"PreferenceBubblePositionBoth\">Обе стороны</string>\n\n    <string-array name=\"PreferenceBubblePositionEntries\">\n        <item>@string/PreferenceBubblePositionRight</item>\n        <item>@string/PreferenceBubblePositionLeft</item>\n        <item>@string/PreferenceBubblePositionBoth</item>\n    </string-array>\n    \n    <string-array name=\"PreferenceBubblePositionValues\">\n        <item>RIGHT</item>\n        <item>LEFT</item>\n        <item>BOTH</item>\n    </string-array>\n\n    <string name=\"PreferenceToolbarsAutoHideDurationTitle\">Время отображения панели</string>\n    <string name=\"PreferenceToolbarsAutoHideDurationSummary\">Укажите, сколько показывать панель в секундах.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodTitle\">Метод переключения вкладок</string>\n    <string name=\"PreferenceSwitchTabsMethodSummary\">Укажите метод переключения вкладок.</string>\n    \n    <string name=\"PreferenceSwitchTabsMethodButtons\">Кнопки</string>\n    <string name=\"PreferenceSwitchTabsMethodFling\">Бросок</string>\n    <string name=\"PreferenceSwitchTabsMethodBoth\">Оба</string>\n\n    <string-array name=\"PreferenceSwitchTabsMethodEntries\">\n        <item>@string/PreferenceSwitchTabsMethodButtons</item>\n        <item>@string/PreferenceSwitchTabsMethodFling</item>\n        <item>@string/PreferenceSwitchTabsMethodBoth</item>\n    </string-array>\n    \n    <string-array name=\"PreferenceSwitchTabsMethodValues\">\n        <item>BUTTONS</item>\n        <item>FLING</item>\n        <item>BOTH</item>\n    </string-array>\n\n    <string name=\"PreferenceHeaderBrowserSettingsTitle\">Расширенные</string>\n    \n    <string name=\"PreferenceEnableJavascriptTitle\">Включить JavaScript</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript включен.</string>\n    <string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript выключен.</string>\n    <string name=\"PreferenceEnableImagesTitle\">Загружать графику</string>\n    <string name=\"PreferenceEnableImagesSummary\">Показывать изображения на веб-страницах.</string>\n    <string name=\"PreferenceUseWideViewportTitle\">Мобильный вид</string>\n    <string name=\"PreferenceUseWideViewportSummary\">Подгонять веб-страницы под размер экрана.</string>\n    <string name=\"PreferenceLoadPagesWithOverviewTitle\">Обзор страницы</string>\n    <string name=\"PreferenceLoadPagesWithOverviewSummary\">Открывать новые страницы в окне предпросмотра.</string>\n    <string name=\"PreferencePluginsTitle\">Включить плагины</string>\n    <string name=\"PreferencePluginsSummary\">Выберите как управлять плагинами.</string>\n    \n    <string name=\"PreferencePluginsAlwaysOff\">Всегла выключен</string>\n    <string name=\"PreferencePluginsOnDemand\">По требованию</string>\n    <string name=\"PreferencePluginsAlwaysOn\">Всегда включен</string>\n\n    <string-array name=\"PreferencePluginsEntries\">\n        <item>@string/PreferencePluginsAlwaysOff</item>\n        <item>@string/PreferencePluginsOnDemand</item>\n        <item>@string/PreferencePluginsAlwaysOn</item>\n    </string-array>\n    \n    <string-array name=\"PreferencePluginsValues\">\n        <item>OFF</item>\n        <item>ON_DEMAND</item>\n        <item>ON</item>\n    </string-array>\n\n    <string name=\"PreferenceUserAgentTitle\">User-agent</string>\n    <string name=\"PreferenceUserAgentSummary\">Выберите строку user-agent используемую браузером.</string>\n    <string name=\"PreferenceUserAgentDialogTitle\">User-agent</string>\n    \n    <string name=\"PreferenceHeaderPrivacySettingsTitle\">Личные данные</string>\n    \n    <string name=\"PreferencePrivacyClearCacheTitle\">Очистить кеш</string>\n    <string name=\"PreferencePrivacyClearCacheSummary\">Удалить контент и данные, сохраненные браузером.</string>\n    \n    <string name=\"PreferenceCategoryHistoryTitle\">История</string>\n    <string name=\"PreferencePrivacyHistorySizeTitle\">Размер истории</string>\n    <string name=\"PreferencePrivacyHistorySizeSummary\">Установить размер истории в днях.</string>\n    <string name=\"PreferencePrivacyClearHistoryTitle\">Очистить историю</string>\n    <string name=\"PreferencePrivacyClearHistorySummary\">Очистить список посещенных в Интернете страниц.</string>\n    \n    <string name=\"PreferenceCategoryCookiesTitle\">Куки</string>\n    <string name=\"PreferencePrivacyAcceptCookiesTitle\">Принимать куки</string>\n    <string name=\"PreferencePrivacyAcceptCookiesSummary\">Разрешать сайтам сохранять и читать куки.</string>\n    <string name=\"PreferencePrivacyClearCookiesTitle\">Очистить куки</string>\n    <string name=\"PreferencePrivacyClearCookiesSummary\">Очистить все куки.</string>\n    \n    <string name=\"PreferenceCategoryGeolocationTitle\">Местоположение</string>\n    <string name=\"PreferencePrivacyEnableGeolocationTitle\">Доступ к геоданным</string>\n    <string name=\"PreferencePrivacyEnableGeolocationSummary\">Разрешать сайтам запрашивать доступ к данным о вашем местоположении.</string>\n    <string name=\"PreferencePrivacyClearGeolocationTitle\">Закрыть геоданные</string>\n    <string name=\"PreferencePrivacyClearGeolocationSummary\">Очистить список сайтов имеющих доступ к данным о вашем местоположении.</string>\n    \n    <string name=\"PreferenceCategoryFormDataTitle\">Формы</string>\n    <string name=\"PreferencePrivacyRememberFormDataTitle\">Сохранять данные форм</string>\n    <string name=\"PreferencePrivacyRememberFormDataSummary\">Запоминать введенные в формы данные для дальнейшего использования.</string>\n    <string name=\"PreferencePrivacyClearFormDataTitle\">Очистить данные формы</string>\n    <string name=\"PreferencePrivacyClearFormDataSummary\">Удалить все сохраненные данные форм.</string>\n    \n    <string name=\"PreferenceCategoryPasswordsTitle\">Пароли</string>\n    <string name=\"PreferencePrivacyRememberPasswordsTitle\">Запоминать пароли</string>\n    <string name=\"PreferencePrivacyRememberPasswordsSummary\">Запоминать имена пользователей и пароли веб-сайтов.</string>\n    <string name=\"PreferencePrivacyClearPasswordsTitle\">Очистить пароли</string>\n    <string name=\"PreferencePrivacyClearPasswordsSummary\">Удалить все сохраненные пароли.</string>\n    \n    <string name=\"PreferencePrivacyWebsitesSettingsTitle\">Настройки веб-сайтов</string>\n    <string name=\"PreferencePrivacyWebsitesSettingsSummary\">Дополнительные настройки для отдельных сайтов.</string>\n    \n    <string name=\"PreferencePrivacyIncognitoTitle\">Pежим инкогнито</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultTitle\">Инкогнито по умолчанию</string>\n    <string name=\"PreferencePrivacyIncognitoDefaultSummary\">Открывать новые вкладки в режиме инкогнито</string>\n    \n    <string name=\"HistoryToday\">Сегодня</string>\n    <string name=\"HistoryYesterday\">Вчера</string>\n    <string name=\"HistoryLastSevenDays\">На этой неделе</string>\n    <string name=\"HistoryLastMonth\">В этом месяце</string>\n    <string name=\"HistoryOlder\">Ранее</string>\n    \n    <string name=\"ClearCacheMessage\">Очистить кеш?</string>\n    <string name=\"ClearHistoryMessage\">Очистить список посещенных страниц?</string>\n    <string name=\"ClearCookiesMessage\">Удалить все куки?</string>\n    <string name=\"ClearGeolocationMessage\">Очистить список сайтов имеющих доступ к данным о вашем местоположении?</string>\n    <string name=\"ClearFormDataMessage\">Удалить данные всех форм?</string>\n    <string name=\"ClearPasswordsMessage\">Удалить все сохраненные пароли?</string>\n    \n    <string name=\"PreferenceHomepageStart\">Стартовая страница</string>\n    <string name=\"PreferenceHomepageBlank\">Пустая страница</string>\n    <string name=\"PreferenceHomepageCustom\">Пользовательская страница</string>\n\n    <string-array name=\"HomepageTitles\">\n        <item>@string/PreferenceHomepageStart</item>\n        <item>@string/PreferenceHomepageBlank</item>\n        <item>@string/PreferenceHomepageCustom</item>\n    </string-array>\n\n    <string name=\"PreferenceUserAgentAndroid\">Android</string>\n    <string name=\"PreferenceUserAgentDesktop\">Desktop</string>\n    <string name=\"PreferenceUserAgentOther\">Другой</string>\n\n    <string-array name=\"UserAgentsTitles\">\n        <item>@string/PreferenceUserAgentAndroid</item>\n        <item>@string/PreferenceUserAgentDesktop</item>\n        <item>@string/PreferenceUserAgentOther</item>\n    </string-array>\n\n    <string name=\"SearchUrlGoogle\">http://yandex.ru/touchsearch?text={searchTerms}</string>\n    \n    <string name=\"PreferenceHeaderAddonsTitle\">Дополнения</string>    \n    \n    <string name=\"PreferenceHeaderAboutTitle\">О программе</string>\n    \n    <string name=\"HttpAuthenticationDialogDialogTitle\">Sign in to %1$s - %2$s</string>\n    <string name=\"HttpAuthenticationDialogUserName\">Имя</string>\n    <string name=\"HttpAuthenticationDialogPassword\">Пароль</string>\n    \n    <string name=\"FormResubmitTitle\">Повторная отправка даннах</string>\n    <string name=\"FormResubmitMessage\">Чтобы отобразить эту страницу, приложение должно отправить информацию(\\\"POSTDATA\\\"), которая повторит любое ранее произведённое действие (например, запрос на поиск или онлайн-покупка).</string>\n    \n    <string name=\"BookmarkAdded\">Добавлено в закладки.</string>\n    <string name=\"BookmarkRemoved\">Удалено из закладок.</string>\n    \n    <string name=\"SDCardErrorNoSDMsg\">Не найдена SD карта.</string>\n    <string name=\"SDCardErrorSDUnavailable\">SD карта не доступна.</string>\n    \n    <string name=\"HistoryBookmarksClearTitle\">Очистить</string>\n\n    <string-array name=\"ClearHistoryBookmarksChoice\">\n        <item>@string/History</item>\n        <item>@string/Bookmarks</item>\n        <item>@string/All</item>\n    </string-array>\n\n    <string name=\"HistoryBookmarksImportSourceTitle\">Импорт файлов</string>\n    <string name=\"HistoryBookmarksImportFileUnavailable\">Файл недоступен, либо он не существует, либо не читается.</string>\n    <string name=\"HistoryBookmarksImportTitle\">Импорт истории и закладок</string>\n    <string name=\"HistoryBookmarksImportInitialMessage\">Импорт истории и закладок&#8230;</string>\n    <string name=\"HistoryBookmarksImportReadingFile\">Чтение файлов&#8230;</string>\n    <string name=\"HistoryBookmarksImportParsingFile\">Разбор файлов&#8230;</string>\n    <string name=\"HistoryBookmarksImportProgressMessage\">Чтение %1$s элемента из %2$s.</string>\n    <string name=\"HistoryBookmarksImportInsertMessage\">Вставка значений&#8230;</string>\n    <string name=\"HistoryBookmarksImportErrorTitle\">Ошибка импорта</string>\n    <string name=\"HistoryBookmarksImportErrorMessage\">Произошла ошибка во время импорта истории и закладок: %s</string>\n    \n    <string name=\"HistoryBookmarksExportTitle\">Экспорт истории и закладок</string>\n    <string name=\"HistoryBookmarksExportInitialMessage\">Экспорт истории и закладок&#8230;</string>\n    <string name=\"HistoryBookmarksExportCheckCardMessage\">Проверка внешних носителей&#8230;</string>\n    <string name=\"HistoryBookmarksExportProgressMessage\">Экспорт %1$s элемента из %2$s.</string>\n    <string name=\"HistoryBookmarksExportErrorTitle\">Ошибка экспорта</string>\n    <string name=\"HistoryBookmarksExportErrorMessage\">Произошла ошибка во время экспорта истории и закладок: %s</string>\n    \n    <string name=\"GeolocationTitle\">Запрос местоположения</string>\n    <string name=\"GeolocationMessage\">Сайт %s запрашивает доступ к определению вашего местоположения.</string>\n    <string name=\"GeolocationAccept\">Разрешить</string>\n    <string name=\"GeolocationDecline\">Запретить</string>\n    \n    <string name=\"WebsitesSettingsEmpty\">Нет настроек для сайта.</string>\n    \n    <string name=\"WebsitesSettingsSiteTitle\">Настройки для %s</string>\n    \n    <string name=\"WebsitesSettingsDataUsage\">%s MB хранится на вашем устройстве.</string>\n    <string name=\"WebsitesSettingsDataClickToClear\">Кликните для удаления сохраненных данных.</string>\n    <string name=\"WebsitesSettingsCleatDataDialogTitle\">Удаление данных</string>\n    <string name=\"WebsitesSettingsCleatDataDialogMessage\">Удалить все сохраненные данные, относящиеся к данному сайту?</string>\n    \n    <string name=\"WebsitesSettingsGeolocationClickToClear\">Кликните для удаления доступа к данным о вашем местоположения.</string>\n    <string name=\"WebsitesSettingsGeolocationAllowed\">Этот сайт может получить доступ к данным о вашем местоположеним.</string>\n    <string name=\"WebsitesSettingsGeolocationNotAllowed\">Этот сайт не может получить доступ к данным о вашем местоположении.</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogTitle\">Очистить доступ к данным о вашем местороложения</string>\n    <string name=\"WebsitesSettingsGeolocationPageDialogMessage\">Очистить доступ для этого сайта к данным о вашем местоположении?</string>\n    \n    <string name=\"AddonsWarningText\">Пожалуйста, устанавливайте дополнения только от разработчиков, которым вы доверяете. При возникновении странного поведения, отключите все дополнения.</string>\n    <string name=\"AddonsGetAddons\"><a href=\"\">Получить дополнения</a></string>\n    <string name=\"AddonsMarketNotFoundTitle\">Google Play не найден</string>\n    <string name=\"AddonsMarketNotFoundMessage\">Похоже у вас нет приложения Google Play на устройстве.</string>\n    <string name=\"AddonsEnableAll\">Включить все</string>\n    <string name=\"AddonsDisableAll\">Выключить все</string>\n    \n    <string name=\"AddonDetailsContact\">Связаться: %s</string>\n    <string name=\"AddonDetailsUsedCallbacksTitle\">Данное дополнение:</string>\n    \n    <string name=\"AddonCallbackPageStarted\">Получает уведомление, когда начинается загрузка страницы.</string>\n    <string name=\"AddonCallbackPageFinished\">Получает уведомление, когда загрузка страницы завершена.</string>\n    <string name=\"AddonCallbackTabOpened\">Получает уведомление, когда открыта вкладка.</string>\n    <string name=\"AddonCallbackTabClosed\">Получает уведомление, когда вкладка закрыта.</string>\n    <string name=\"AddonCallbackTabSwitched\">Получает уведомление, при переключении между вкладками.</string>\n    <string name=\"AddonCallbackHasPreferencesPage\">Получает параметры страницы.</string>\n    <string name=\"AddonCallbackContributeMainMenu\">Может дополнять главное меню.</string>\n    <string name=\"AddonCallbackContributeLinkContextMenu\">Может дополнять контекстное меню ссылки.</string>\n    <string name=\"AddonCallbackContributeHistoryBookmarksMenu\">Может дополнять контекстное меню закладок и истории.</string>\n    <string name=\"AddonCallbackContributeBookmarkContextMenu\">Может дополнять контекстное меню закладок.</string>\n    <string name=\"AddonCallbackContributeHistoryContextMenu\">Может дополнять контекстное меню истории.</string>\n    \n    <string name=\"AddonDetailsUsedPermissionsTitle\">Имеет следующие разрешения:</string>\n    <string name=\"AddonDetailsPermissionsNone\">Нет разрешений.</string>\n    <string name=\"AddonDetailsUnableToGetPermissions\">Невозможно получить разрешения. Проверьте их в диспетчере приложений вашего устройства.</string>\n    \n    <string name=\"ContentDescriptionDivider\">Разделитель</string>\n    <string name=\"ContentDescriptionApplicationIcon\">Иконка приложения</string>\n    <string name=\"ContentDescriptionSuggestionIcon\">Иконка помощи</string>\n    <string name=\"ContentDescriptionBookmarkThumbnail\">Предпросмотр закладки</string>\n    <string name=\"ContentDescriptionFavicon\">Иконка сайта</string>\n    <string name=\"ContentDescriptionGoStopReloadButton\">Кнопка Вперед / Остановить / Обновить</string>\n    <string name=\"ContentDescriptionMenuButton\">Кнопка меню</string>\n    <string name=\"ContentDescriptionPreviousTabButton\">Кнопка предыдущей вкладки</string>\n    <string name=\"ContentDescriptionNextTabButton\">Кнопка следующей вкладки</string>\n    <string name=\"ContentDescriptionLeftBubble\">Left bubble</string>\n    <string name=\"ContentDescriptionRightBubble\">Right bubble</string>\n    <string name=\"ContentDescriptionBackButton\">Кнопка назад</string>\n    <string name=\"ContentDescriptionCloseTabButton\">Кнопка закрытия вкладки</string>\n    <string name=\"ContentDescriptionBookmarksButton\">Кнопка закладок</string>\n    <string name=\"ContentDescriptionNewTabButton\">Кнопка новой вкладки</string>\n    <string name=\"ContentDescriptionForwardButton\">Кнопка вперед</string>\n    <string name=\"ContentDescriptionHomeButton\">Кнопка домой</string>\n    <string name=\"ContentDescriptionWebsiteSettingsLocation\">Местоположение сайта</string>\n    <string name=\"ContentDescriptionWebsiteSettingsUsage\">Использование сайта</string>\n    <string name=\"ContentDescriptionWebsiteSettingsFeature\">Функции сайта</string>\n\n    <string-array name=\"DefaultBookmarksTitles\">\n        <item>Яндекс</item>\n        <item>Google</item>\n        <item>Wikipedia</item>\n        <item>Лента</item>\n        <item>YouTube</item>\n        <item>ВКонтакте</item>\n    </string-array>\n    \n    <string-array name=\"DefaultBookmarksUrls\">\n        <item>http://www.yandex.ru/</item>\n        <item>http://www.google.com/</item>\n        <item>http://ru.wikipedia.org/</item>\n        <item>http://www.lenta.ru/</item>\n        <item>http://www.youtube.com/</item>\n        <item>http://vk.com/</item>\n    </string-array>\n\n    <!-- 1.2 -->\n    <string name=\"IncognitoTab\">Приватная вкладка</string>\n    <string name=\"ContextMenuOpenInBackground\">Открыть в фоновой вкладке</string>\n    <string name=\"ContentDescriptionPrivateBrowsingIndicator\">Индикатор приватного просмотра</string>\n\n    <!-- 1.3 -->\n    <string name=\"Folder\">Каталог</string>\n    <string name=\"NewFolder\">Новый каталог</string>\n    <string name=\"NewFolderHint\">Имя нового каталога</string>\n    <string name=\"ProvideNewFolderName\">Пожалуйста укажите имя нового каталога или выберите существующий</string>\n    \n    <string name=\"DeleteFolder\">Удалить каталог</string>\n    <string name=\"ConfirmDeleteFolderMessage\">Удалить каталог и все его содержимое?</string>\n    <string name=\"DeleteFolderTitle\">Удалить каталог</string>\n    <string name=\"DeleteFolderMessage\">Пожалуйста подождите, пока каталог и все его содержимое удаляется&#8230;</string>\n    \n    <string name=\"ContentDescriptionBookmarksFoldersBack\">Вернуться к иерархии закладок</string>\n\n    <!-- 1.4 -->\n    <string name=\"PreferenceHeaderAccessibilityTitle\">Специальные возможности</string>\n    <string name=\"PreferenceCategoryTextSizeTitle\">Размер текста</string>\n    <string name=\"PreferenceAccessibilityTextSizePreviewTitle\">Просмотр размера текста</string>\n    <string name=\"PreferenceAccessibilityTextScalingTitle\">Масштабирование текста</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">Минимальный размер шрифта</string>\n    <string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">Установите минимальный размер шрифта, используемый для отображения текста в браузере.</string>\n    \n    <string name=\"FontPreviewTextTiny\">Крошечный</string>\n    <string name=\"FontPreviewTextSmall\">Маленький</string>\n    <string name=\"FontPreviewTextNormal\">Обычный</string>\n    <string name=\"FontPreviewTextLarge\">Большой</string>\n    <string name=\"FontPreviewTextHuge\">Огромный</string>\n\n    <string-array name=\"FontPreviewText\">\n        <item>@string/FontPreviewTextTiny</item>\n        <item>@string/FontPreviewTextSmall</item>\n        <item>@string/FontPreviewTextNormal</item>\n        <item>@string/FontPreviewTextLarge</item>\n        <item>@string/FontPreviewTextHuge</item>\n    </string-array>\n\n    <string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">Режим инверсии</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingTitle\">Инверсия</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingSummary\">Черное становится белым и наоборот. Может не работать на некоторых устройствах.</string>\n    <string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">Контраст</string>\n    \n    <string name=\"ContentDescriptionAutocompleteQueryBuilder\">Автозавершение адреса в адресной строке, без перехода.</string>\n\n    <!-- 1.5 -->\n    <string name=\"UnknownAutority\">Неизвестные полномочия</string>\n    <string name=\"RememberMyChoice\">Запомнить мой выбор</string>\n    <string name=\"SslExceptionAccessAllowedByUserToast\">Исключение безопасности SSL: доступ к %s разрешен пользователем.</string>\n    <string name=\"SslExceptionAccessDisallowedByUserToast\">Исключение безопасности SSL: доступ к %s запрещен пользователем.</string>\n    \n    <string name=\"PreferenceSslExceptionsTitle\">Исключения безопасности SSL</string>\n    <string name=\"PreferenceSslExceptionsSummary\">Список исключений безопасности SSL сайтов.</string>\n    <string name=\"SslExceptionWebsitesText\"><i>Нажмите, чтобы удалить исключение.</i></string>\n    <string name=\"SslExceptionEmptyText\">У вас нет никаких исключений безопасности SSL.</string>\n    \n    <string name=\"RemoveSslExceptionTitle\">Удалить исключение безопасности</string>\n    <string name=\"RemoveSslExceptionMessage\">Вы действительно хотите удалить исключения безопасности для этого сайта?</string>\n    \n    <string name=\"SslInvalid\">Этот сертификат является недействительным.</string>\n    <string name=\"SslDateInvalid\">Дата данного сертификата является недействительной.</string>\n    \n    <string name=\"Authorized\">Авторизованный:</string>\n    <string name=\"Reasons\">Причины:</string>\n    \n    <string name=\"SearchUrlDialogText1\">Ваша поисковая система по умолчанию:</string>\n    <string name=\"SearchUrlDialogText2\">Вы можете настроить ее выбирая среди поисковых систем указанных ниже.</string>\n    <string name=\"SearchUrlGetOnline\"><a href=\"\">Вручную редактировать поисковую систему</a></string>\n    <string name=\"SearchUrlConnecting\">Соединение&#8230;</string>\n    <string name=\"SearchUrlParsing\">Результаты разбора&#8230;</string>\n    <string name=\"SearchUrlBadResponseCodeMessage\">Не могу соединиться с репозитарием поисковых систем (Код ответа: %s).</string>\n    \n    <string name=\"SearchUrlDefault\">Яндекс</string>\n    <string name=\"SearchUrlCustom\">Пользовательская система поиска</string>\n    \n    <string name=\"SortBookmarks\">Упорядочить закладки</string>\n    <string name=\"MostUsedSortMode\">Наиболее часто используемые</string>\n    <string name=\"AlphaSortMode\">В алфавитном порядке</string>\n    <string name=\"RecentSortMode\">Самые посещаемые</string>\n\n    <!-- 1.6 -->\n    <string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">Неверный формат файла</string>\n    <string name=\"HistoryBookmarksImportFoldersProgressMessage\">Чтение %1$s каталога из %2$s.</string>\n    <string name=\"HistoryBookmarksImportFoldersLinkMessage\">Привязанные папки&#8230;</string>\n    <string name=\"HistoryBookmarksImportBookmarksProgressMessage\">Чтение %1$s закладки из %2$s.</string>\n    <string name=\"HistoryBookmarksImportHistoryProgressMessage\">Чтение %1$s элемента истории из %2$s.</string>\n    \n    <string name=\"FullScreen\">Полноэкранный режим</string>\n    <string name=\"ContentDescriptionExitFullScreen\">Кнопка выхода из полноэкранного режима</string>\n\n    <!-- 1.7 -->\n    <string name=\"StartPageLabel\">Стартовая страница</string>\n\n    <string name=\"RestartDialogTitle\">Требуется перезагрузка</string>\n    <string name=\"RestartDialogMessage\">Это изменение не вступит в силу до перезапуска приложения. Вы хотите сделать это сейчас?</string>\n    \n    <string name=\"ContentDescriptionTabPreview\">Предпросмотр вкладки</string>\n    \n    <string name=\"PreferenceClosePanelOnNewTabTitle\">Закрыть боковую панель на новой вкладке</string>\n    <string name=\"PreferenceClosePanelOnNewTabSummary\">Если отмечено, то боковая панель будет закрыта в новой вкладе.</string>\n    \n    <string name=\"AboutChangelogTitle\">Список изменений</string>\n    <string name=\"AboutContributorsTitle\">Авторы</string>\n    <string name=\"AboutLicensesTitle\">Другие лицензии</string>\n    \n    <string name=\"RestoreTabsDialogTitle\">Восстановление вкладок</string>\n    <string name=\"RestoreTabsDialogMessage\">Вы хотите восстановить вкладки предыдущего сеанса?</string>\n    \n    <string name=\"PreferenceRestoreTabsTitle\">Восстановление вкладок</string>\n    <string name=\"PreferenceRestoreTabsSummary\">Выберите вкладки, которые хотите восстановить из предыдущей сессии</string>\n    \n    <string name=\"PreferenceRestoreTabsAsk\">Спрашивать</string>\n    <string name=\"PreferenceRestoreTabsAlways\">Всегда</string>\n    <string name=\"PreferenceRestoreTabsNever\">Никогда</string>\n    \n    <string-array name=\"PreferenceRestoreTabsEntries\">\n\t\t<item>@string/PreferenceRestoreTabsAsk</item>\n\t\t<item>@string/PreferenceRestoreTabsAlways</item>\n\t\t<item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceRestoreTabsValues\">\n\t\t<item>ASK</item>\n\t\t<item>ALWAYS</item>\n\t\t<item>NEVER</item>\n\t</string-array>\n\t\n    <string name=\"PreferenceUITypeTitle\">Тип интерфейса</string>\n    <string name=\"PreferenceUITypeSummary\">Выберите тип пользовательского интерфейса.</string>\n    \n    <string name=\"PreferenceUITypeAuto\">Автоматически</string>\n    <string name=\"PreferenceUITypePhone\">Телефон</string>\n    <string name=\"PreferenceUITypeLegacyPhone\">Телефон (legacy)</string>\n    <string name=\"PreferenceUITypeTablet\">Планшет</string>\n    \n    <string-array name=\"PreferenceUITypeEntries\">\n\t\t<item>@string/PreferenceUITypeAuto</item>\n\t\t<item>@string/PreferenceUITypePhone</item>\n\t\t<item>@string/PreferenceUITypeLegacyPhone</item>\n\t\t<item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n    <string-array name=\"PreferenceUITypeValues\">\n\t\t<item>AUTO</item>\n\t\t<item>PHONE</item>\n\t\t<item>LEGACY_PHONE</item>\n\t\t<item>TABLET</item>\n\t</string-array>\n\t\n    <!-- 1.8 -->\n    <string name=\"PreferenceDevelopersTitle\">Разработчики</string>\n    <string name=\"PreferenceJsLogOnLocatTitle\">Войти JS журналы LogCat</string>\n    <string name=\"PreferenceJsLogOnLocatSummary\">Перенаправить JS журналы на LogCat буфер.</string>\n    <string name=\"ContextMenuViewImageInNewTab\">Открыть изображение в новой вкладке</string>\n    \n</resources>"
  },
  {
    "path": "res/values-sw600dp/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <bool name=\"isTablet\">true</bool>\n</resources>\n"
  },
  {
    "path": "res/values-sw600dp/dimensions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">    \n    \n    <dimen name=\"bookmarks_fragment_margin_top_bottom\">25dip</dimen>\n    <dimen name=\"bookmarks_fragment_margin_left_right\">75dip</dimen>\n    <dimen name=\"bookmarks_fragment_breadcrumb_margin_left_right\">70dip</dimen>\n    \n    <dimen name=\"bookmarks_fragment_column_width\">125dip</dimen>\n    <dimen name=\"bookmarks_fragment_vertical_spacing\">25dip</dimen>\n    <dimen name=\"bookmarks_fragment_horizontal_spacing\">25dip</dimen>\n    \n    <dimen name=\"tablet_history_fragment_header_margin_left\">24dp</dimen>\n    <dimen name=\"tablet_history_fragment_values_margin_right\">24dp</dimen>\n    \n    <dimen name=\"startpage_fragment_margin_top_bottom\">10dip</dimen>\n    <dimen name=\"startpage_fragment_margin_left_right\">50dip</dimen>\n    \n    <dimen name=\"startpage_fragment_column_width\">125dip</dimen>\n    <dimen name=\"startpage_fragment_vertical_spacing\">25dip</dimen>\n    <dimen name=\"startpage_fragment_horizontal_spacing\">25dip</dimen>\n    \n    <dimen name=\"history_row_padding_left_right\">5dip</dimen>\n    <dimen name=\"history_row_padding_top_bottom\">10dip</dimen>\n</resources>\n"
  },
  {
    "path": "res/values-sw600dp/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    \n    <integer name=\"default_start_page_items_number\">12</integer>\n    \n</resources>\n"
  },
  {
    "path": "res/values-sw600dp-port/dimensions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">    \n    \n    <dimen name=\"bookmarks_fragment_margin_left_right\">55dip</dimen>\n    <dimen name=\"bookmarks_fragment_breadcrumb_margin_left_right\">50dip</dimen>\n    \n    <dimen name=\"tablet_history_fragment_header_margin_left\">12dp</dimen>\n    <dimen name=\"tablet_history_fragment_values_margin_right\">12dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "res/values-sw720dp/dimensions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">    \n    \n    <dimen name=\"bookmarks_fragment_margin_top_bottom\">75dip</dimen>\n    <dimen name=\"bookmarks_fragment_margin_left_right\">150dip</dimen>\n    <dimen name=\"bookmarks_fragment_breadcrumb_margin_left_right\">145dip</dimen>\n    \n    <dimen name=\"bookmarks_fragment_column_width\">125dip</dimen>\n    <dimen name=\"bookmarks_fragment_vertical_spacing\">25dip</dimen>\n    <dimen name=\"bookmarks_fragment_horizontal_spacing\">25dip</dimen>\n    \n    <dimen name=\"tablet_history_fragment_header_margin_left\">96dp</dimen>\n    <dimen name=\"tablet_history_fragment_values_margin_right\">96dp</dimen>\n    \n    <dimen name=\"startpage_fragment_margin_top_bottom\">50dip</dimen>\n    <dimen name=\"startpage_fragment_margin_left_right\">150dip</dimen>\n    \n    <dimen name=\"startpage_fragment_column_width\">125dip</dimen>\n    <dimen name=\"startpage_fragment_vertical_spacing\">25dip</dimen>\n    <dimen name=\"startpage_fragment_horizontal_spacing\">25dip</dimen>\n    \n    <dimen name=\"history_row_padding_left_right\">20dip</dimen>\n    <dimen name=\"history_row_padding_top_bottom\">10dip</dimen>\n</resources>\n"
  },
  {
    "path": "res/values-sw720dp-port/dimensions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">    \n    \n    <dimen name=\"bookmarks_fragment_margin_left_right\">75dip</dimen>\n    <dimen name=\"bookmarks_fragment_breadcrumb_margin_left_right\">70dip</dimen>\n    \n    <dimen name=\"tablet_history_fragment_header_margin_left\">24dp</dimen>\n    <dimen name=\"tablet_history_fragment_values_margin_right\">24dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "res/values-xhdpi/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n \n<resources xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\">\n    \n    <integer name=\"favicon_size\">32</integer>\n    <integer name=\"application_button_size\">72</integer>\n    \n</resources>\n"
  },
  {
    "path": "res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    \n\t<string name=\"ApplicationName\">Tint Browser</string>\n\t<string name=\"ApplicationDescription\">Tint浏览器是Android下的开源项目。</string>\n\t\n\t<string name=\"AboutVersionText\">版本: %1$s (%2$s)</string>\n\t<string name=\"AboutLicenseText\">协议: GPLv3</string>\n\t<string name=\"AboutUrlText\">https://github.com/Anasthase/TintBrowser</string>\n\t<string name=\"AboutChangelogText\">更新日志:</string>\n\t\n\t<string name=\"PermissionReadBookmarksLabel\">打开浏览器书签</string>\n\t<string name=\"PermissionReadBookmarksDescription\">允许第三方应用或者附加组件打历史记录或者书签。</string>\n\t\n\t<string name=\"PermissionWriteBookmarksLabel\">添加新书签</string>\n\t<string name=\"PermissionWriteBookmarksDescription\">允许第三封应用或者附加组件添加新的历史记录或者书签。</string>    \n\t\n\t<string name=\"PermissionBindAddonServiceLabel\">绑定附加组件服务</string>\n\t<string name=\"PermissionBindAddonServiceDescription\">在Tint浏览器自身允许下应用可以绑定附加组件服务</string>\n\t\n\t<string name=\"OK\">确定</string>\n\t<string name=\"Cancel\">取消</string>\n\t<string name=\"Yes\">Yes</string>\n\t<string name=\"No\">No</string>\n\t<string name=\"On\">打开</string>\n\t<string name=\"Off\">关闭</string>\n\t<string name=\"Clear\">清空</string>\n\t<string name=\"Continue\">继续</string>\n\t<string name=\"Proceed\">开始</string>\n\t<string name=\"VideoLoading\">正在加载视频\\u2026</string>\n\t<string name=\"History\">历史</string>\n\t<string name=\"All\">全部</string>\n\t<string name=\"Bookmarks\">书签</string>\n\t<string name=\"Preferences\">设置</string>\n\t\n\t<string name=\"UrlBarUrlDefaultSubTitle\">点击输入搜索或地址。</string>\n\t<string name=\"UrlBarUrlHint\">输入搜索或地址</string>\n\t\n\t<string name=\"ShareChooserTitle\">分享</string>\n\t<string name=\"FileChooserPrompt\">选择上传文件</string>\n\t\n\t<string name=\"DownloadStart\">已下载 %1$s&#8230;</string>\n\t<string name=\"DownloadComplete\">下载完成</string>\n\t<string name=\"DownloadFailedWithErrorMessage\">下载失败: %1$s.</string>\n\t<string name=\"DownloadErrorDisk\">磁盘错误，请检查您的磁盘是否有足够的存储空间。</string>\n\t<string name=\"DownloadErrorHttp\">网络错误</string>\n\t<string name=\"DownloadErrorRedirection\">重定向错误</string>\n\t<string name=\"DownloadErrorUnknown\">未知错误</string>\n\t\n\t<string name=\"ContextMenuOpen\">打开</string>\n\t<string name=\"ContextMenuOpenNewTab\">在新标签中打开</string>\n\t<string name=\"ContextMenuCopyLinkUrl\">复制链接地址</string>\n\t<string name=\"ContextMenuDownload\">下载</string>\n\t<string name=\"ContextMenuShareLinkUrl\">分享链接</string>\n\t\n\t<string name=\"ContextMenuViewImage\">打开图片</string>\n\t<string name=\"ContextMenuCopyImageUrl\">复制图片地址</string>\n\t<string name=\"ContextMenuDownloadImage\">下载图片</string>\n\t<string name=\"ContextMenuShareImageUrl\">分享图片</string>\n\t\n\t<string name=\"ContextMenuSendEmail\">发送邮件</string>\n\t<string name=\"ContextMenuCopyEmailUrl\">复制邮件地址</string>\n\t<string name=\"ContextMenuShareEmailUrl\">分享邮件</string>\n\t\n\t<string name=\"UrlCopyToastMessage\">地址已经被复制到剪切板。</string>\n\t<string name=\"ContextMenuShareUrl\">分享</string>\n\t\n\t<string name=\"JavaScriptAlertDialog\">JavaScript警告对话框</string>\n\t<string name=\"JavaScriptConfirmDialog\">JavaScript确认对话框</string>\n\t<string name=\"JavaScriptPromptDialog\">JavaScript提示对话框</string>    \n\t\n\t<string name=\"SslWarning\">安全警告</string>\n\t<string name=\"SslWarningsHeader\">该网站的安全证书不受信任 (%s)。</string>\n\t<string name=\"SslUntrusted\">该证书不是由信任机构颁发。</string>\n\t<string name=\"SslIDMismatch\">网站名称与证书名称不匹配。</string>\n\t<string name=\"SslExpired\">该证书已过期。</string>\n\t<string name=\"SslNotYetValid\">该证书无效。</string>    \n\t\n\t<string name=\"NewTab\">新建标签页</string>\n\t\n\t<string name=\"CloseTab\">关闭标签页</string>\n\t<string name=\"AddBookmark\">添加书签</string>\n\t<string name=\"SharePage\">分享页面</string>\n\t<string name=\"Search\">页内查找</string>\n\t\n\t<string name=\"BookmarksTitle\">书签 &amp; 历史</string>\n\t<string name=\"BookmarksTabTitle\">书签</string>\n\t<string name=\"HistoryTabTitle\">历史</string>\n\t\n\t<string name=\"ImportHistoryBookmarks\">导入</string>\n\t<string name=\"ExportHistoryBookmarks\">导出</string>\n\t<string name=\"ClearHistoryBookmarks\">清空</string>\n\t\n\t<string name=\"AddBookmarkTitle\">添加书签</string>\n\t<string name=\"BookmarkText\">书签名</string>\n\t<string name=\"UrlText\">地址</string>\n\t<string name=\"UrlHint\">http://</string>\n\t<string name=\"AddBookmarkLabelOrUrlEmpty\">请输入有效书签名和地址。</string>\n\t\n\t<string name=\"OpenInTab\">在新标签中打开</string>\n\t<string name=\"EditBookmark\">编辑书签</string>\n\t<string name=\"CopyUrl\">复制地址</string>\n\t<string name=\"DeleteBookmark\">删除书签</string>\n\t<string name=\"DeleteHistoryItem\">从历史记录中删除</string>\n\t\n\t<string name=\"PreferencesActivityTitle\">设置</string>\n\t\n\t<string name=\"PreferenceHeaderGeneralSettingsTitle\">通用设置</string>\n\t\n\t<string name=\"PreferenceGeneralHomepageTitle\">主页</string>\n\t<string name=\"PreferenceGeneralHomepageSummary\">设置加载或者打开新标签时的主页。</string>\n\t<string name=\"PreferenceHomePageDialogTitle\">主页</string>\n\t\n\t<string name=\"PreferenceGeneralSearchUrlTitle\">搜索引擎</string>\n\t<string name=\"PreferenceGeneralSearchUrlSummary\">设置地址栏中的默认搜索引擎。</string>\n\t\n\t<string name=\"PreferenceCategoryStartPageTitle\">起始页</string>\n\t<string name=\"PreferenceGeneralStartPageLimitTitle\">起始页中的项目数</string>\n\t<string name=\"PreferenceGeneralStartPageLimitSummary\">设置起始页中的项目数。</string>\n\t\n\t<string name=\"PreferenceCategoryUITitle\">用户界面</string>\n\t\n\t<string name=\"PreferenceBubblePositionTitle\">气泡提示的位置</string>\n\t<string name=\"PreferenceBubblePositionSummary\">气泡提示的位置允许显示工具条。</string>\n\t\n\t<string name=\"PreferenceBubblePositionRight\">右</string>\n\t<string name=\"PreferenceBubblePositionLeft\">左</string>\n\t<string name=\"PreferenceBubblePositionBoth\">两边</string>\n\t\n\t<string-array name=\"PreferenceBubblePositionEntries\">\n\t    <item>@string/PreferenceBubblePositionRight</item>\n\t    <item>@string/PreferenceBubblePositionLeft</item>\n\t    <item>@string/PreferenceBubblePositionBoth</item>\n\t</string-array>\n\t\n\t<string-array name=\"PreferenceBubblePositionValues\">\n\t    <item>RIGHT</item>\n\t    <item>LEFT</item>\n\t    <item>BOTH</item>\n\t</string-array>\n\t\n\t<string name=\"PreferenceToolbarsAutoHideDurationTitle\">工具条显示时间</string>\n\t<string name=\"PreferenceToolbarsAutoHideDurationSummary\">设置工具条显示时间，单位为秒。</string>\n\t\n\t<string name=\"PreferenceSwitchTabsMethodTitle\">标签页切换方式</string>\n\t<string name=\"PreferenceSwitchTabsMethodSummary\">设置标签页切换方式。</string>\n\t\n\t<string name=\"PreferenceSwitchTabsMethodButtons\">Buttons</string>\n\t<string name=\"PreferenceSwitchTabsMethodFling\">Fling</string>\n\t<string name=\"PreferenceSwitchTabsMethodBoth\">Both</string>\n\t\n\t<string-array name=\"PreferenceSwitchTabsMethodEntries\">\n\t    <item>@string/PreferenceSwitchTabsMethodButtons</item>\n\t    <item>@string/PreferenceSwitchTabsMethodFling</item>\n\t    <item>@string/PreferenceSwitchTabsMethodBoth</item>\n\t</string-array>\n\t\n\t<string-array name=\"PreferenceSwitchTabsMethodValues\">\n\t    <item>BUTTONS</item>\n\t    <item>FLING</item>\n\t    <item>BOTH</item>\n\t</string-array>\n\t\n\t<string name=\"PreferenceHeaderBrowserSettingsTitle\">浏览器设置</string>\n\t\n\t<string name=\"PreferenceEnableJavascriptTitle\">启用JavaScript</string>\n\t<string name=\"PreferenceEnableJavascriptSummaryOn\">JavaScript已启用。</string>\n\t<string name=\"PreferenceEnableJavascriptSummaryOff\">JavaScript已关闭。</string>\n\t<string name=\"PreferenceEnableImagesTitle\">载入图像</string>\n\t<string name=\"PreferenceEnableImagesSummary\">确认您是否想载入图像。</string>\n\t<string name=\"PreferenceUseWideViewportTitle\">使用宽屏端口</string>\n\t<string name=\"PreferenceUseWideViewportSummary\">如果选择，浏览器将打开桌面版网站。</string>\n\t<string name=\"PreferenceLoadPagesWithOverviewTitle\">加载概述页</string>\n\t<string name=\"PreferenceLoadPagesWithOverviewSummary\">如果你想加载缩放的网页来显示概述页，请选择。</string>\n\t<string name=\"PreferencePluginsTitle\">启用插件</string>\n\t<string name=\"PreferencePluginsSummary\">选择插件启用方式。</string>\n\t\n\t<string name=\"PreferencePluginsAlwaysOff\">已禁用</string>\n\t<string name=\"PreferencePluginsOnDemand\">手动</string>\n\t<string name=\"PreferencePluginsAlwaysOn\">已启用</string>\n\t\n\t<string-array name=\"PreferencePluginsEntries\">\n\t    <item>@string/PreferencePluginsAlwaysOff</item>\n\t    <item>@string/PreferencePluginsOnDemand</item>\n\t    <item>@string/PreferencePluginsAlwaysOn</item>\n\t</string-array>\n\t\n\t<string-array name=\"PreferencePluginsValues\">\n\t    <item>OFF</item>\n\t    <item>ON_DEMAND</item>\n\t    <item>ON</item>\n\t</string-array>\n\t\n\t<string name=\"PreferenceUserAgentTitle\">代理</string>\n\t<string name=\"PreferenceUserAgentSummary\">设置浏览器使用的代理字段。</string>\n\t<string name=\"PreferenceUserAgentDialogTitle\">代理</string>\n\t\n\t<string name=\"PreferenceHeaderPrivacySettingsTitle\">隐私和安全设置</string>\n\t\n\t<string name=\"PreferencePrivacyClearCacheTitle\">清除缓存</string>\n\t<string name=\"PreferencePrivacyClearCacheSummary\">清除本地缓存和数据。</string>\n\t\n\t<string name=\"PreferenceCategoryHistoryTitle\">历史</string>\n\t<string name=\"PreferencePrivacyHistorySizeTitle\">历史限制</string>\n\t<string name=\"PreferencePrivacyHistorySizeSummary\">设置保存历史的数量。</string>\n\t<string name=\"PreferencePrivacyClearHistoryTitle\">清除历史</string>\n\t<string name=\"PreferencePrivacyClearHistorySummary\">清除浏览器导航历史。</string>\n\t\n\t<string name=\"PreferenceCategoryCookiesTitle\">Cookies</string>\n\t<string name=\"PreferencePrivacyAcceptCookiesTitle\">接受 Cookies</string>\n\t<string name=\"PreferencePrivacyAcceptCookiesSummary\">允许网站保存和读取 Cookie数据。</string>\n\t<string name=\"PreferencePrivacyClearCookiesTitle\">清除 Cookies</string>\n\t<string name=\"PreferencePrivacyClearCookiesSummary\">清除所有 Cookies.</string>\n\t\n\t<string name=\"PreferenceCategoryGeolocationTitle\">位置设置</string>\n\t<string name=\"PreferencePrivacyEnableGeolocationTitle\">允许定位</string>\n\t<string name=\"PreferencePrivacyEnableGeolocationSummary\">允许网站访问您的位置信息。</string>\n\t<string name=\"PreferencePrivacyClearGeolocationTitle\">清除位置信息</string>\n\t<string name=\"PreferencePrivacyClearGeolocationSummary\">对所有网站清除位置信息。</string>\n\t\n\t<string name=\"PreferenceCategoryFormDataTitle\">表单数据</string>\n\t<string name=\"PreferencePrivacyRememberFormDataTitle\">保存表单数据</string>\n\t<string name=\"PreferencePrivacyRememberFormDataSummary\">记住我在表单中填写的数据。</string>\n\t<string name=\"PreferencePrivacyClearFormDataTitle\">清除表单数据</string>\n\t<string name=\"PreferencePrivacyClearFormDataSummary\">清除所有保存的表单数据。</string>\n\t\n\t<string name=\"PreferenceCategoryPasswordsTitle\">密码</string>\n\t<string name=\"PreferencePrivacyRememberPasswordsTitle\">保存密码</string>\n\t<string name=\"PreferencePrivacyRememberPasswordsSummary\">保存网站的用户名和密码。</string>\n\t<string name=\"PreferencePrivacyClearPasswordsTitle\">清除密码</string>\n\t<string name=\"PreferencePrivacyClearPasswordsSummary\">清除所有已保存的密码。</string>\n\t\n\t<string name=\"PreferencePrivacyWebsitesSettingsTitle\">网站设置</string>\n\t<string name=\"PreferencePrivacyWebsitesSettingsSummary\">针对个别网站的高级设置。</string>\n\t\n\t<string name=\"HistoryToday\">今天</string>\n\t<string name=\"HistoryYesterday\">昨天</string>\n\t<string name=\"HistoryLastSevenDays\">过去7天</string>\n\t<string name=\"HistoryLastMonth\">过去一个月</string>\n\t<string name=\"HistoryOlder\">更早</string>\n\t\n\t<string name=\"ClearCacheMessage\">删除本地缓存内容和数据?</string>\n\t<string name=\"ClearHistoryMessage\">删除浏览器导航历史?</string>\n\t<string name=\"ClearCookiesMessage\">删除所有 Cookies?</string>\n\t<string name=\"ClearGeolocationMessage\">清除网站位置信息?</string>\n\t<string name=\"ClearFormDataMessage\">删除所有已保存的表单数据?</string>\n\t<string name=\"ClearPasswordsMessage\">删除所有已保存的密码?</string>\n\t\n\t<string name=\"PreferenceHomepageStart\">起始页</string>\n\t<string name=\"PreferenceHomepageBlank\">空白页</string>\n\t<string name=\"PreferenceHomepageCustom\">自定义页</string>\n\t\n\t<string-array name=\"HomepageTitles\">\n\t    <item>@string/PreferenceHomepageStart</item>\n\t    <item>@string/PreferenceHomepageBlank</item>\n\t    <item>@string/PreferenceHomepageCustom</item>\n\t</string-array>\n\t\n\t<string name=\"PreferenceUserAgentAndroid\">Android</string>\n\t<string name=\"PreferenceUserAgentDesktop\">桌面</string>\n\t<string name=\"PreferenceUserAgentOther\">其他</string>\n\t\n\t<string-array name=\"UserAgentsTitles\">\n\t    <item>@string/PreferenceUserAgentAndroid</item>\n\t    <item>@string/PreferenceUserAgentDesktop</item>\n\t    <item>@string/PreferenceUserAgentOther</item>\n\t</string-array>\n\t\n\t<string name=\"SearchUrlGoogle\">http://www.google.com/m?q={searchTerms}</string>\n\t\n\t<string name=\"PreferenceHeaderAddonsTitle\">附加组件</string>\n\t\n\t<string name=\"PreferenceHeaderAboutTitle\">关于</string>\n\t\n\t<string name=\"HttpAuthenticationDialogDialogTitle\">登陆到 %1$s - %2$s</string>\n\t<string name=\"HttpAuthenticationDialogUserName\">用户名</string>\n\t<string name=\"HttpAuthenticationDialogPassword\">密码</string>\n\t\n\t<string name=\"FormResubmitTitle\">重新提交表单</string>\n\t<string name=\"FormResubmitMessage\">您试图访问的页面内容已经被提交 (\\\"POSTDATA\\\")。如果您重发数据，该页面上表单上的任何请求都会重复（比如搜索或者在线购物）。</string>\n\t\n\t<string name=\"BookmarkAdded\">已添加到书签。</string>\n\t<string name=\"BookmarkRemoved\">已从书签中移除。</string>\n\t\n\t<string name=\"SDCardErrorNoSDMsg\">没有找到存储卡。</string>\n\t<string name=\"SDCardErrorSDUnavailable\">存储卡不可用。</string>\n\t\n\t<string name=\"HistoryBookmarksClearTitle\">清除</string>\n\t\n\t<string-array name=\"ClearHistoryBookmarksChoice\">\n\t    <item>@string/History</item>\n\t    <item>@string/Bookmarks</item>\n\t    <item>@string/All</item>\n\t</string-array>\n\t\n\t<string name=\"HistoryBookmarksImportSourceTitle\">导入文件</string>\n\t<string name=\"HistoryBookmarksImportFileUnavailable\">文件不可用, 文件不存在或者不可读。</string>\n\t<string name=\"HistoryBookmarksImportTitle\">导入历史和书签</string>\n\t<string name=\"HistoryBookmarksImportInitialMessage\">正在导入历史和书签&#8230;</string>\n\t<string name=\"HistoryBookmarksImportReadingFile\">正在读取文件&#8230;</string>\n\t<string name=\"HistoryBookmarksImportParsingFile\">正在解析文件&#8230;</string>\n\t<string name=\"HistoryBookmarksImportProgressMessage\">正在导入 %1$s of %2$s.</string>\n\t<string name=\"HistoryBookmarksImportInsertMessage\">正在插入内容&#8230;</string>\n\t<string name=\"HistoryBookmarksImportErrorTitle\">导入过程出错</string>\n\t<string name=\"HistoryBookmarksImportErrorMessage\">导入历史和书签过程中发生错误: %s</string>\n\t\n\t<string name=\"HistoryBookmarksExportTitle\">导出历史和书签</string>\n\t<string name=\"HistoryBookmarksExportInitialMessage\">正在导出历史和书签&#8230;</string>\n\t<string name=\"HistoryBookmarksExportCheckCardMessage\">正在验证外部存储器&#8230;</string>\n\t<string name=\"HistoryBookmarksExportProgressMessage\">正在导出 %1$s of %2$s.</string>\n\t<string name=\"HistoryBookmarksExportErrorTitle\">导出过程出错</string>\n\t<string name=\"HistoryBookmarksExportErrorMessage\">导出历史和书签过程中发生错误: %s</string>\n\t\n\t<string name=\"GeolocationTitle\">位置信息请求</string>\n\t<string name=\"GeolocationMessage\">网站 %s 请求您的位置信息。</string>    \n\t<string name=\"GeolocationAccept\">同意</string>\n\t<string name=\"GeolocationDecline\">拒绝</string>\n\t\n\t<string name=\"WebsitesSettingsEmpty\">该网站没有设置信息。</string>\n\t\n\t<string name=\"WebsitesSettingsSiteTitle\">设置 %s</string>\n\t\n\t<string name=\"WebsitesSettingsDataUsage\">%s MB 存储在您的设备中。</string>\n\t<string name=\"WebsitesSettingsDataClickToClear\">点击清除存储数据。</string>\n\t<string name=\"WebsitesSettingsCleatDataDialogTitle\">删除数据</string>\n\t<string name=\"WebsitesSettingsCleatDataDialogMessage\">删除该网站存储的所有数据?</string>\n\t\n\t<string name=\"WebsitesSettingsGeolocationClickToClear\">点击清除位置信息。</string>\n\t<string name=\"WebsitesSettingsGeolocationAllowed\">该网站可以获取您的位置信息。</string>\n\t<string name=\"WebsitesSettingsGeolocationNotAllowed\">该网站不能获取您的位置信息。</string>\n\t<string name=\"WebsitesSettingsGeolocationPageDialogTitle\">清除位置信息</string>\n\t<string name=\"WebsitesSettingsGeolocationPageDialogMessage\">清除该网站获取的位置信息?</string>\n\t\n\t<string name=\"AddonsWarningText\">请只安装可靠来源的附加组件。如果浏览器有异常行为，请关闭所有附加组件。</string>\n\t<string name=\"AddonsGetAddons\"><a href=\"\">获取附加组件</a></string>\n\t<string name=\"AddonsMarketNotFoundTitle\">未找到Google Play</string>\n\t<string name=\"AddonsMarketNotFoundMessage\">在您的设备中似乎没有Google Play应用。</string>\n\t<string name=\"AddonsEnableAll\">全部启用</string>\n\t<string name=\"AddonsDisableAll\">全部禁用</string>\n\t\n\t<string name=\"AddonDetailsContact\">内容: %s</string>\n\t<string name=\"AddonDetailsUsedCallbacksTitle\">该附加组件:</string>\n\t\n\t<string name=\"AddonCallbackPageStarted\">当页面加载时提示。</string>\n\t<string name=\"AddonCallbackPageFinished\">当页面加载完毕时提示。</string>\n\t<string name=\"AddonCallbackTabOpened\">当打开新标签页时提示。</string>\n\t<string name=\"AddonCallbackTabClosed\">当关闭标签页时提示。</string>\n\t<string name=\"AddonCallbackTabSwitched\">当切换标签时提示。</string>\n\t<string name=\"AddonCallbackHasPreferencesPage\">设置页面。</string>\n\t<string name=\"AddonCallbackContributeMainMenu\">可以影响主菜单。</string>\n\t<string name=\"AddonCallbackContributeLinkContextMenu\">可以影响连接内容菜单。</string>\n\t<string name=\"AddonCallbackContributeHistoryBookmarksMenu\">可以影响历史和书签菜单。</string>\n\t<string name=\"AddonCallbackContributeBookmarkContextMenu\">可以影响书签内容菜单。</string>\n\t<string name=\"AddonCallbackContributeHistoryContextMenu\">可以影响历史内容菜单。</string>\n\t\n\t<string name=\"AddonDetailsUsedPermissionsTitle\">有以下权限:</string>\n\t<string name=\"AddonDetailsPermissionsNone\">无。</string>\n\t<string name=\"AddonDetailsUnableToGetPermissions\">无法获取权限，请检查您的设备的应用管理器。</string>\n\t\n\t<string name=\"ContentDescriptionDivider\">分配器</string>\n\t<string name=\"ContentDescriptionApplicationIcon\">应用图标</string>\n\t<string name=\"ContentDescriptionSuggestionIcon\">建议图标</string>\n\t<string name=\"ContentDescriptionBookmarkThumbnail\">书签缓存</string>\n\t<string name=\"ContentDescriptionFavicon\">网站图标</string>\n\t<string name=\"ContentDescriptionGoStopReloadButton\">前进 / 停止 / 重载 按钮</string>\n\t<string name=\"ContentDescriptionMenuButton\">菜单按钮</string>\n\t<string name=\"ContentDescriptionPreviousTabButton\">上一书签按钮</string>\n\t<string name=\"ContentDescriptionNextTabButton\">下一书签按钮</string>\n\t<string name=\"ContentDescriptionLeftBubble\">左气泡</string>\n\t<string name=\"ContentDescriptionRightBubble\">右气泡</string>\n\t<string name=\"ContentDescriptionBackButton\">后气泡</string>\n\t<string name=\"ContentDescriptionCloseTabButton\">关闭标签页按钮</string>\n\t<string name=\"ContentDescriptionBookmarksButton\">书签按钮</string>\n\t<string name=\"ContentDescriptionNewTabButton\">新建标签页按钮</string>\n\t<string name=\"ContentDescriptionForwardButton\">前进按钮</string>\n\t<string name=\"ContentDescriptionHomeButton\">Home按钮</string>\n\t<string name=\"ContentDescriptionWebsiteSettingsLocation\">网站位置</string>\n\t<string name=\"ContentDescriptionWebsiteSettingsUsage\">网站使用率</string>\n\t<string name=\"ContentDescriptionWebsiteSettingsFeature\">网站特色</string>\n\t\n\t<string-array name=\"DefaultBookmarksTitles\">\n\t    <item>Google</item>\n\t    <item>Wikipedia</item>\n\t    <item>YouTube</item>\n\t    <item>Yahoo!</item>\n\t    <item>BBC</item>\n\t    <item>eBay</item>\n\t</string-array>\n\t\n\t<string-array name=\"DefaultBookmarksUrls\">\n\t    <item>http://www.google.com/</item>\n\t    <item>http://en.wikipedia.org/</item>\n\t    <item>http://www.youtube.com/</item>\n\t    <item>http://www.yahoo.com/</item>\n\t    <item>http://www.bbc.co.uk/</item>\n\t    <item>http://www.ebay.com/</item>\n\t</string-array>\n\t\n\t<!-- 1.2 -->\n\t<string name=\"IncognitoTab\">新建隐私浏览标签页</string>\n\t<string name=\"ContextMenuOpenInBackground\">在后台打开</string>\n\t<string name=\"ContentDescriptionPrivateBrowsingIndicator\">私人浏览指示器</string>\n\t\n\t<!-- 1.3 -->\n\t<string name=\"Folder\">文件夹</string>\n\t<string name=\"NewFolder\">新文件夹</string>    \n\t<string name=\"NewFolderHint\">新文件夹的名称</string>\n\t<string name=\"ProvideNewFolderName\">请输入新文件夹名称或者选择现有名称。</string>\n\t\n\t<string name=\"DeleteFolder\">删除文件夹</string>\n\t<string name=\"ConfirmDeleteFolderMessage\">删除该文件夹及其中内容?</string>\n\t<string name=\"DeleteFolderTitle\">正在删除文件夹</string>\n\t<string name=\"DeleteFolderMessage\">请稍等正在删除文件夹及其中内容&#8230;</string>\n\t\n\t<string name=\"ContentDescriptionBookmarksFoldersBack\">返回到书签文件夹树</string>\n\t\n\t<!-- 1.4 -->\n\t<string name=\"PreferenceHeaderAccessibilityTitle\">实用性设置</string>\n\t<string name=\"PreferenceCategoryTextSizeTitle\">文本尺寸</string>\n\t<string name=\"PreferenceAccessibilityTextSizePreviewTitle\">文本尺寸预览</string>\n\t<string name=\"PreferenceAccessibilityTextScalingTitle\">文本缩放比例</string>\n\t<string name=\"PreferenceAccessibilityMinimumFontSizeTitle\">最小字体尺寸</string>\n\t<string name=\"PreferenceAccessibilityMinimumFontSizeSummary\">设置浏览器中显示文本的最小尺寸。</string>\n\t\n\t<string name=\"FontPreviewTextTiny\">很小</string>\n\t<string name=\"FontPreviewTextSmall\">小</string>\n\t<string name=\"FontPreviewTextNormal\">正常</string>\n\t<string name=\"FontPreviewTextLarge\">大</string>\n\t<string name=\"FontPreviewTextHuge\">巨大</string>\n\t\n\t<string-array name=\"FontPreviewText\">\n\t    <item>@string/FontPreviewTextTiny</item>\n\t    <item>@string/FontPreviewTextSmall</item>\n\t    <item>@string/FontPreviewTextNormal</item>\n\t    <item>@string/FontPreviewTextLarge</item>\n\t    <item>@string/FontPreviewTextHuge</item>\n\t</string-array>\n\t\n\t<string name=\"PreferenceCategoryInvertedScreenRenderingTitle\">屏幕反相渲染</string>\n\t<string name=\"PreferenceAccessibilityInvertedRenderingTitle\">反相渲染</string>\n\t<string name=\"PreferenceAccessibilityInvertedRenderingSummary\">反相屏幕颜色，部分设备不可用。</string>\n\t<string name=\"PreferenceAccessibilityInvertedRenderingContrastTitle\">对比度</string>\n\t\n\t<string name=\"ContentDescriptionAutocompleteQueryBuilder\">在导航工具栏中设置建议地址。</string>\n\t\n\t<!-- 1.5 -->\n\t<string name=\"UnknownAutority\">未知机构</string>\n\t<string name=\"RememberMyChoice\">记住我的选择</string>\n\t<string name=\"SslExceptionAccessAllowedByUserToast\">SSL 安全设置: 用户允许连接到 %s 。</string>\n\t<string name=\"SslExceptionAccessDisallowedByUserToast\">SSL 安全设置: 用户禁止连接到 %s 。</string>\n\t\n\t<string name=\"PreferenceSslExceptionsTitle\">SSL 安全设置</string>\n\t<string name=\"PreferenceSslExceptionsSummary\">网站的SSL安全设置列表。</string>\n\t<string name=\"SslExceptionWebsitesText\"><i>点击移除列表</i></string>\n\t<string name=\"SslExceptionEmptyText\">您未设置任何安全列表。</string>\n\t\n\t<string name=\"RemoveSslExceptionTitle\">移除列表</string>\n\t<string name=\"RemoveSslExceptionMessage\">您想移除该网站的安全列表吗?</string>\n\t\n\t<string name=\"SslInvalid\">该证书无效。</string>\n\t<string name=\"SslDateInvalid\">该证书日期无效。</string>\n\t\n\t<string name=\"Authorized\">授权:</string>\n\t<string name=\"Reasons\">原因:</string>\n\t\n\t<string name=\"SearchUrlDialogText1\">现在您的搜索引擎被设置为:</string>\n\t<string name=\"SearchUrlDialogText2\">您可以选择以下搜索引擎来自定义。</string>\n\t<string name=\"SearchUrlGetOnline\"><a href=\"\">手工编辑搜索引擎</a></string>    \n\t<string name=\"SearchUrlConnecting\">正在连接&#8230;</string>\n\t<string name=\"SearchUrlParsing\">正在解析结果&#8230;</string>\n\t<string name=\"SearchUrlBadResponseCodeMessage\">无法连接搜索引擎库 (返回代码: %s)。</string>\n\t\n\t<string name=\"SearchUrlDefault\">Google Worldwide</string>\n\t<string name=\"SearchUrlCustom\">自定义搜索引擎</string>\n\t\n\t<string name=\"SortBookmarks\">排列书签</string>    \n\t<string name=\"MostUsedSortMode\">最常用</string>\n\t<string name=\"AlphaSortMode\">字母排列</string>\n\t<string name=\"RecentSortMode\">最近访问最多</string>\n\t\n\t<!-- 1.6 -->\n\t<string name=\"HistoryBookmarksImportErrorInvalidFileFormat\">无效文件格式</string>\n\t<string name=\"HistoryBookmarksImportFoldersProgressMessage\">正在读取文件夹 %1$s of %2$s.</string>\n\t<string name=\"HistoryBookmarksImportFoldersLinkMessage\">正在连接文件夹&#8230;</string>\n\t<string name=\"HistoryBookmarksImportBookmarksProgressMessage\">正在读取书签 %1$s of %2$s.</string>\n\t<string name=\"HistoryBookmarksImportHistoryProgressMessage\">正在读取历史项目 %1$s of %2$s.</string>\n\t\n\t<string name=\"FullScreen\">全屏</string>\n\t<string name=\"ContentDescriptionExitFullScreen\">退出全屏按钮</string>\n\t\n\t<!-- 1.7 -->\n\t<string name=\"StartPageLabel\">起始页</string>\n\t\n\t<string name=\"RestartDialogTitle\">重新请求</string>\n\t<string name=\"RestartDialogMessage\">程序只有重启后更改才能生效。你想现在重启吗?</string>\n\t\n\t<string name=\"ContentDescriptionTabPreview\">标签页预览</string>\n\t\n\t<string name=\"PreferenceClosePanelOnNewTabTitle\">在新标签页中关闭侧边栏</string>\n\t<string name=\"PreferenceClosePanelOnNewTabSummary\">如果选择,侧边栏不会在新的标签页中出现。</string>\n\t\n\t<string name=\"AboutChangelogTitle\">更新日志</string>\n\t<string name=\"AboutContributorsTitle\">贡献者</string>\n\t<string name=\"AboutLicensesTitle\">其他许可</string>\n\t\n\t<string name=\"RestoreTabsDialogTitle\">恢复标签页</string>\n\t<string name=\"RestoreTabsDialogMessage\">您想恢复上一个会话的标签页吗?</string>\n\t\n\t<string name=\"PreferenceRestoreTabsTitle\">恢复标签页</string>\n\t<string name=\"PreferenceRestoreTabsSummary\">选择您恢复上一个会话标签页的方式。</string>\n\t\n\t<string name=\"PreferenceRestoreTabsAsk\">询问</string>\n\t<string name=\"PreferenceRestoreTabsAlways\">总是恢复</string>\n\t<string name=\"PreferenceRestoreTabsNever\">从不</string>\n\t\n\t<string-array name=\"PreferenceRestoreTabsEntries\">\n\t    <item>@string/PreferenceRestoreTabsAsk</item>\n\t    <item>@string/PreferenceRestoreTabsAlways</item>\n\t    <item>@string/PreferenceRestoreTabsNever</item>\n\t</string-array>\n\t\n\t<string-array name=\"PreferenceRestoreTabsValues\">\n\t    <item>ASK</item>\n\t    <item>ALWAYS</item>\n\t    <item>NEVER</item>\n\t</string-array>\n\t\n\t<string name=\"PreferenceUITypeTitle\">界面类型</string>\n\t<string name=\"PreferenceUITypeSummary\">选择用户界面类型。</string>\n\t\n\t<string name=\"PreferenceUITypeAuto\">自动</string>\n\t<string name=\"PreferenceUITypePhone\">手机</string>\n\t<string name=\"PreferenceUITypeLegacyPhone\">手机 (传统)</string>\n\t<string name=\"PreferenceUITypeTablet\">平板</string>\n\t\n\t<string-array name=\"PreferenceUITypeEntries\">\n\t    <item>@string/PreferenceUITypeAuto</item>\n\t    <item>@string/PreferenceUITypePhone</item>\n\t    <item>@string/PreferenceUITypeLegacyPhone</item>\n\t    <item>@string/PreferenceUITypeTablet</item>\n\t</string-array>\n\t\n\t<string-array name=\"PreferenceUITypeValues\">\n\t    <item>AUTO</item>\n\t    <item>PHONE</item>\n\t    <item>LEGACY_PHONE</item>\n\t    <item>TABLET</item>\n\t</string-array>\n\t\n</resources>"
  },
  {
    "path": "res/xml/preferences_about.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<PreferenceScreen\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res/org.tint\" >\n\n    <org.tint.ui.preferences.AboutPreference />\n\n    <org.tint.ui.preferences.WebViewDialogPreference\n        android:title=\"@string/AboutChangelogTitle\"\n        app:html=\"@raw/changelog_html\" />\n    \n    <org.tint.ui.preferences.WebViewDialogPreference\n        android:title=\"@string/AboutContributorsTitle\"\n        app:html=\"@raw/contributors_html\" />\n    \n    <org.tint.ui.preferences.WebViewDialogPreference\n        android:title=\"@string/AboutLicensesTitle\"\n        app:html=\"@raw/licenses_html\" />\n\n</PreferenceScreen>"
  },
  {
    "path": "res/xml/preferences_accessibility_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<PreferenceScreen\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res/org.tint\" >\n    \n    <PreferenceCategory android:title=\"@string/PreferenceCategoryTextSizeTitle\">\n        \n        <org.tint.ui.preferences.AccessibilityPreviewPreference\n            android:title=\"@string/PreferenceAccessibilityTextSizePreviewTitle\" />\n        \n        <org.tint.ui.preferences.SeekBarPreference\n            android:title=\"@string/PreferenceAccessibilityTextScalingTitle\"\n            android:defaultValue=\"100\"\n            app:minValue=\"50\"\n            app:maxValue=\"200\"\n            app:symbol=\"%%\"\n            app:stepValue=\"5\"\n            android:key=\"PREFERENCE_TEXT_SCALING\" />\n        \n        <org.tint.ui.preferences.SeekBarPreference\n            android:title=\"@string/PreferenceAccessibilityMinimumFontSizeTitle\"\n            android:summary=\"@string/PreferenceAccessibilityMinimumFontSizeSummary\"\n            android:defaultValue=\"1\"\n            app:minValue=\"1\"\n            app:maxValue=\"24\"\n            app:symbol=\"pt\"\n            android:key=\"PREFERENCE_MINIMUM_FONT_SIZE\" />\n        \n    </PreferenceCategory>\n    \n    <PreferenceCategory android:title=\"@string/PreferenceCategoryInvertedScreenRenderingTitle\">\n    \t\n    \t<CheckBoxPreference\n\t        android:defaultValue=\"false\"\n    \t    android:key=\"PREFERENCE_INVERTED_DISPLAY\"\n        \tandroid:summary=\"@string/PreferenceAccessibilityInvertedRenderingSummary\"\n        \tandroid:title=\"@string/PreferenceAccessibilityInvertedRenderingTitle\" />\n    \t\n    \t<org.tint.ui.preferences.SeekBarPreference\n            android:title=\"@string/PreferenceAccessibilityInvertedRenderingContrastTitle\"\n            android:defaultValue=\"100\"\n            app:minValue=\"100\"\n            app:maxValue=\"300\"\n            app:symbol=\" %%\"\n            app:stepValue=\"10\"\n            android:key=\"PREFERENCE_INVERTED_DISPLAY_CONTRAST\" />\n    \n    </PreferenceCategory>\n\n</PreferenceScreen>"
  },
  {
    "path": "res/xml/preferences_browser_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferenceEnableJavascriptTitle\"\t\t\t\n\t\t\tandroid:summaryOn=\"@string/PreferenceEnableJavascriptSummaryOn\"\n\t\t\tandroid:summaryOff=\"@string/PreferenceEnableJavascriptSummaryOff\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_ENABLE_JAVASCRIPT\" />\n    \n    <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferenceEnableImagesTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferenceEnableImagesSummary\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_ENABLE_IMAGES\" />\n    \n    <ListPreference android:title=\"@string/PreferencePluginsTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferencePluginsSummary\"\n\t\t\tandroid:entries=\"@array/PreferencePluginsEntries\"\n\t\t\tandroid:entryValues=\"@array/PreferencePluginsValues\"\n\t\t\tandroid:defaultValue=\"ON_DEMAND\"\n\t\t\tandroid:key=\"PREFERENCE_PLUGINS\" />\n    \n    <org.tint.ui.preferences.UserAgentSpinnerPreference\n            android:title=\"@string/PreferenceUserAgentTitle\"\n            android:summary=\"@string/PreferenceUserAgentSummary\"\n            android:dialogTitle=\"@string/PreferenceUserAgentDialogTitle\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_USER_AGENT\" />\n    \n    <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferenceLoadPagesWithOverviewTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferenceLoadPagesWithOverviewSummary\"\n\t\t\tandroid:defaultValue=\"false\"\n\t\t\tandroid:key=\"PREFERENCE_LOAD_WITH_OVERVIEW\" />\n    \n    <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferenceUseWideViewportTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferenceUseWideViewportSummary\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_USE_WIDE_VIEWPORT\" />\n    \n    <PreferenceCategory        \n        android:title=\"@string/PreferenceDevelopersTitle\" >\n        \n        <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferenceJsLogOnLocatTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferenceJsLogOnLocatSummary\"\n\t\t\tandroid:defaultValue=\"false\"\n\t\t\tandroid:key=\"PREFERENCE_JS_LOG_ON_LOGCAT\" />        \n    </PreferenceCategory>\n\n</PreferenceScreen>"
  },
  {
    "path": "res/xml/preferences_general_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n-->\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <org.tint.ui.preferences.HomepageSpinnerPreference\n        android:dialogTitle=\"@string/PreferenceHomePageDialogTitle\"\n        android:key=\"PREFERENCE_HOME_PAGE\"\n        android:negativeButtonText=\"@string/Cancel\"\n        android:positiveButtonText=\"@string/OK\"\n        android:summary=\"@string/PreferenceGeneralHomepageSummary\"\n        android:title=\"@string/PreferenceGeneralHomepageTitle\" />\n\n    <org.tint.ui.preferences.SearchEnginePreference\n        android:key=\"PREFERENCE_SEARCH_URL\"\n        android:summary=\"@string/PreferenceGeneralSearchUrlSummary\"\n        android:title=\"@string/PreferenceGeneralSearchUrlTitle\" />\n\n    <ListPreference\n        android:defaultValue=\"ASK\"\n        android:entries=\"@array/PreferenceRestoreTabsEntries\"\n        android:entryValues=\"@array/PreferenceRestoreTabsValues\"\n        android:key=\"PREFERENCE_RESTORE_TABS\"\n        android:summary=\"@string/PreferenceRestoreTabsSummary\"\n        android:title=\"@string/PreferenceRestoreTabsTitle\" />\n\n    <PreferenceCategory android:title=\"@string/PreferenceCategoryStartPageTitle\" >\n        <EditTextPreference\n            android:defaultValue=\"@integer/default_start_page_items_number\"\n            android:key=\"PREFERENCE_START_PAGE_LIMIT\"\n            android:numeric=\"integer\"\n            android:summary=\"@string/PreferenceGeneralStartPageLimitSummary\"\n            android:title=\"@string/PreferenceGeneralStartPageLimitTitle\" />\n    </PreferenceCategory>\n    <PreferenceCategory\n        android:key=\"PREFERENCE_CATEGORY_TABLET_UI\"\n        android:title=\"@string/PreferenceCategoryUITitle\" >\n        <ListPreference\n            android:defaultValue=\"AUTO\"\n            android:entries=\"@array/PreferenceUITypeEntries\"\n            android:entryValues=\"@array/PreferenceUITypeValues\"\n            android:key=\"PREFERENCE_UI_TYPE\"\n            android:summary=\"@string/PreferenceUITypeSummary\"\n            android:title=\"@string/PreferenceUITypeTitle\" />\n    </PreferenceCategory>\n    <PreferenceCategory\n        android:key=\"PREFERENCE_CATEGORY_OLD_PHONE_UI\"\n        android:title=\"@string/PreferenceCategoryUITitle\" >\n        <ListPreference\n            android:defaultValue=\"AUTO\"\n            android:entries=\"@array/PreferenceUITypeEntries\"\n            android:entryValues=\"@array/PreferenceUITypeValues\"\n            android:key=\"PREFERENCE_UI_TYPE\"\n            android:summary=\"@string/PreferenceUITypeSummary\"\n            android:title=\"@string/PreferenceUITypeTitle\" />\n        <ListPreference\n            android:defaultValue=\"RIGHT\"\n            android:entries=\"@array/PreferenceBubblePositionEntries\"\n            android:entryValues=\"@array/PreferenceBubblePositionValues\"\n            android:key=\"PREFERENCE_BUBBLE_POSITION\"\n            android:summary=\"@string/PreferenceBubblePositionSummary\"\n            android:title=\"@string/PreferenceBubblePositionTitle\" />\n\n        <EditTextPreference\n            android:defaultValue=\"3\"\n            android:key=\"PREFERENCE_TOOLBARS_AUTOHIDE_DURATION\"\n            android:numeric=\"integer\"\n            android:summary=\"@string/PreferenceToolbarsAutoHideDurationSummary\"\n            android:title=\"@string/PreferenceToolbarsAutoHideDurationTitle\" />\n\n        <ListPreference\n            android:defaultValue=\"BUTTONS\"\n            android:entries=\"@array/PreferenceSwitchTabsMethodEntries\"\n            android:entryValues=\"@array/PreferenceSwitchTabsMethodValues\"\n            android:key=\"PREFERENCES_SWITCH_TABS_METHOD\"\n            android:summary=\"@string/PreferenceSwitchTabsMethodSummary\"\n            android:title=\"@string/PreferenceSwitchTabsMethodTitle\" />\n    </PreferenceCategory>\n    <PreferenceCategory\n        android:key=\"PREFERENCE_CATEGORY_NEW_PHONE_UI\"\n        android:title=\"@string/PreferenceCategoryUITitle\" >\n        <ListPreference\n            android:defaultValue=\"AUTO\"\n            android:entries=\"@array/PreferenceUITypeEntries\"\n            android:entryValues=\"@array/PreferenceUITypeValues\"\n            android:key=\"PREFERENCE_UI_TYPE\"\n            android:summary=\"@string/PreferenceUITypeSummary\"\n            android:title=\"@string/PreferenceUITypeTitle\" />\n\n        <CheckBoxPreference\n            android:defaultValue=\"true\"\n            android:key=\"PREFERENCE_CLOSE_PANEL_ON_NEW_TAB\"\n            android:summary=\"@string/PreferenceClosePanelOnNewTabSummary\"\n            android:title=\"@string/PreferenceClosePanelOnNewTabTitle\" />\n    </PreferenceCategory>\n\n</PreferenceScreen>"
  },
  {
    "path": "res/xml/preferences_headers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<preference-headers xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <header android:fragment=\"org.tint.ui.preferences.GeneralPreferencesFragment\"            \n            android:title=\"@string/PreferenceHeaderGeneralSettingsTitle\" />\n    \n\t<header android:fragment=\"org.tint.ui.preferences.BrowserPreferencesFragment\"            \n            android:title=\"@string/PreferenceHeaderBrowserSettingsTitle\" />\n\t\n\t<header android:fragment=\"org.tint.ui.preferences.PrivacyPreferencesFragment\"            \n            android:title=\"@string/PreferenceHeaderPrivacySettingsTitle\" />\n\t\n\t<header android:fragment=\"org.tint.ui.preferences.AccessibilityPreferencesFragment\"            \n            android:title=\"@string/PreferenceHeaderAccessibilityTitle\" />\n\t\n\t<!--\n\t<header android:fragment=\"org.tint.ui.preferences.AdvancedPreferencesFragment\"            \n            android:title=\"@string/PreferenceHeaderAdvancedSettingsTitle\" />\n    -->\n\t\n\t<header android:fragment=\"org.tint.ui.preferences.AddonsFragment\"            \n            android:title=\"@string/PreferenceHeaderAddonsTitle\" />\n\t\n\t<header android:fragment=\"org.tint.ui.preferences.AboutFragment\"            \n            android:title=\"@string/PreferenceHeaderAboutTitle\" />\n    \n</preference-headers>"
  },
  {
    "path": "res/xml/preferences_privacy_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--\n   Tint Browser for Android\n  \n   Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n \n   This program is free software; you can redistribute it and/or\n   modify it under the terms of the GNU General Public License\n   version 3 as published by the Free Software Foundation.\n \n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n -->\n\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n    \n    <org.tint.ui.preferences.ClearPreference\n            android:title=\"@string/PreferencePrivacyClearCacheTitle\"\n            android:summary=\"@string/PreferencePrivacyClearCacheSummary\"\n            android:dialogTitle=\"@string/Clear\"\n            android:dialogMessage=\"@string/ClearCacheMessage\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_CLEAR_CACHE\" />\n    \n    <PreferenceScreen            \n            android:title=\"@string/PreferencePrivacyWebsitesSettingsTitle\"\n            android:summary=\"@string/PreferencePrivacyWebsitesSettingsSummary\"\n            android:key=\"PREFERENCE_WEBSITES_SETTINGS\" />\n    \n    <PreferenceScreen            \n            android:title=\"@string/PreferenceSslExceptionsTitle\"\n            android:summary=\"@string/PreferenceSslExceptionsSummary\"\n            android:key=\"PREFERENCE_SSL_EXCEPTIONS\" />\n    \n    <PreferenceCategory android:title=\"@string/PreferenceCategoryHistoryTitle\">\n        \n        <EditTextPreference\n\t\t\tandroid:title=\"@string/PreferencePrivacyHistorySizeTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferencePrivacyHistorySizeSummary\"\n\t\t\tandroid:defaultValue=\"30\"\n\t\t\tandroid:numeric=\"integer\"\n\t\t\tandroid:key=\"PREFERENCE_HISTORY_SIZE\" />\n        \n        <org.tint.ui.preferences.ClearPreference\n            android:title=\"@string/PreferencePrivacyClearHistoryTitle\"\n            android:summary=\"@string/PreferencePrivacyClearHistorySummary\"\n            android:dialogTitle=\"@string/Clear\"\n            android:dialogMessage=\"@string/ClearHistoryMessage\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_CLEAR_HISTORY\" />\n        \n    </PreferenceCategory>\n    \n    <PreferenceCategory android:title=\"@string/PreferenceCategoryCookiesTitle\">\n        \n        <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferencePrivacyAcceptCookiesTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferencePrivacyAcceptCookiesSummary\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_ACCEPT_COOKIES\" />\n        \n        <org.tint.ui.preferences.ClearPreference\n            android:title=\"@string/PreferencePrivacyClearCookiesTitle\"\n            android:summary=\"@string/PreferencePrivacyClearCookiesSummary\"\n            android:dialogTitle=\"@string/Clear\"\n            android:dialogMessage=\"@string/ClearCookiesMessage\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_CLEAR_COOKIES\" />\n        \n    </PreferenceCategory>\n    \n\t<PreferenceCategory android:title=\"@string/PreferenceCategoryFormDataTitle\">\n        \n        <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferencePrivacyRememberFormDataTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferencePrivacyRememberFormDataSummary\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_REMEMBER_FORM_DATA\" />\n        \n        <org.tint.ui.preferences.ClearPreference\n            android:title=\"@string/PreferencePrivacyClearFormDataTitle\"\n            android:summary=\"@string/PreferencePrivacyClearFormDataSummary\"\n            android:dialogIcon=\"@android:drawable/ic_dialog_alert\"\n            android:dialogTitle=\"@string/Clear\"\n            android:dialogMessage=\"@string/ClearFormDataMessage\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_CLEAR_FORM_DATA\" />\n        \n    </PreferenceCategory>\n    \n\t<PreferenceCategory android:title=\"@string/PreferenceCategoryGeolocationTitle\">\n        \n        <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferencePrivacyEnableGeolocationTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferencePrivacyEnableGeolocationSummary\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_ENABLE_GEOLOCATION\" />\n        \n        <org.tint.ui.preferences.ClearPreference\n            android:title=\"@string/PreferencePrivacyClearGeolocationTitle\"\n            android:summary=\"@string/PreferencePrivacyClearGeolocationSummary\"\n            android:dialogTitle=\"@string/Clear\"\n            android:dialogMessage=\"@string/ClearGeolocationMessage\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_CLEAR_GEOLOCATION\" />\n        \n    </PreferenceCategory>\n    \n\t<PreferenceCategory android:title=\"@string/PreferenceCategoryPasswordsTitle\">\n        \n        <CheckBoxPreference\n\t\t\tandroid:title=\"@string/PreferencePrivacyRememberPasswordsTitle\"\t\t\t\n\t\t\tandroid:summary=\"@string/PreferencePrivacyRememberPasswordsSummary\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:key=\"PREFERENCE_REMEMBER_PASSWORDS\" />\n        \n        <org.tint.ui.preferences.ClearPreference\n            android:title=\"@string/PreferencePrivacyClearPasswordsTitle\"\n            android:summary=\"@string/PreferencePrivacyClearPasswordsSummary\"\n            android:dialogIcon=\"@android:drawable/ic_dialog_alert\"\n            android:dialogTitle=\"@string/Clear\"\n            android:dialogMessage=\"@string/ClearPasswordsMessage\"            \n            android:positiveButtonText=\"@string/OK\"\n            android:negativeButtonText=\"@string/Cancel\"            \n            android:key=\"PREFERENCE_CLEAR_PASSWORDS\" />\n        \n    </PreferenceCategory>\t\n    \n    <PreferenceCategory android:title=\"@string/PreferencePrivacyIncognitoTitle\">\n    \n        <CheckBoxPreference\n            android:title=\"@string/PreferencePrivacyIncognitoDefaultTitle\"\n            android:summary=\"@string/PreferencePrivacyIncognitoDefaultSummary\"\n            android:defaultValue=\"false\"\n            android:key=\"PREFERENCE_INCOGNITO_BY_DEFAULT\" />\n    \n    </PreferenceCategory>\n\n</PreferenceScreen>"
  },
  {
    "path": "src/org/tint/addons/Addon.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.tint.R;\nimport org.tint.addons.AddonServiceConnection.AddonServiceConnectionListener;\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.Callbacks;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.Editor;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.content.pm.ResolveInfo;\nimport android.preference.PreferenceManager;\nimport android.text.TextUtils;\n\npublic class Addon {\n\t\n\tprivate Context mContext;\n\t\n\t/**\n\t * The addon id is its position in the addons array in the AddonManager.\n\t */\n\tprivate int mId;\n\t\n\tprivate String mName;\n\tprivate String mShortDescription;\n\tprivate String mDescription;\n\tprivate String mContact;\n\t\n\tprivate String mPreferenceName;\n\t\n\tprivate ResolveInfo mResolveInfo;\n\t\n\tprivate boolean mIsEnabled;\n\tprivate int mCallbacks;\n\t\n\tprivate AddonServiceConnection mServiceConnection;\n\t\n\tprivate OnSharedPreferenceChangeListener mPreferenceChangeListener;\n\t\n\tpublic Addon(Context context, int id, ResolveInfo resolveInfo, String category) {\n\t\tmContext = context;\n\t\tmId = id;\n\t\tmResolveInfo = resolveInfo;\n\t\t\n\t\tmIsEnabled = false;\n\t\tmCallbacks = 0;\n\t\t\n\t\tmPreferenceChangeListener = null;\n\t\t\n\t\tIntent i = new Intent(AddonManager.ACTION_ADDON);\n\t\ti.addCategory(category);\n\t\t\n\t\tmServiceConnection = new AddonServiceConnection(i);\n\t\t\n\t\tmServiceConnection.setAddonServiceConnectionListener(new AddonServiceConnectionListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onServiceConnected() {\n\t\t\t\tinit();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmContext.bindService(i, mServiceConnection, Context.BIND_AUTO_CREATE);\t\t\t\t\n\t}\n\t\n\tpublic ResolveInfo getResolveInfo() {\n\t\treturn mResolveInfo;\n\t}\n\t\n\t/**\n\t * Gets the menu id for this addon.\n\t * I'm not sure how to avoid conflicts between Android generated menu ids,\n\t * and the ones used when an addon contribute to a menu.\n\t * For now, make the assumption that Android do not use negatives ids, and start from - 1000.\n\t * The real addon id can be retrived by the inverse operation.\n\t * @return The menu id to use when this addon contribute to a menu. \n\t */\n\tpublic int getMenuId() {\n\t\treturn - (1000 + mId);\n\t}\n\t\n\tpublic String getName() {\n\t\treturn mName;\n\t}\n\t\n\tpublic String getShortDescription() {\n\t\treturn mShortDescription;\n\t}\n\t\n\tpublic String getDescription() {\n\t\treturn mDescription;\n\t}\n\t\n\tpublic String getContact() {\n\t\treturn mContact;\n\t}\n\t\n\tpublic boolean isEnabled() {\n\t\treturn mIsEnabled;\n\t}\n\t\n\tpublic boolean hasSettingsPage() {\n\t\treturn (mCallbacks & Callbacks.HAS_SETTINGS_PAGE) == Callbacks.HAS_SETTINGS_PAGE;\n\t}\n\t\n\tpublic void setEnabled(boolean value) {\n\t\tmIsEnabled = value;\n\t\t\n\t\tEditor edit = PreferenceManager.getDefaultSharedPreferences(mContext).edit();\n\t\tedit.putBoolean(mPreferenceName, mIsEnabled);\n\t\tedit.commit();\n\t}\n\t\n\tpublic void unbindService() {\n\t\tmIsEnabled = false;\n\t\tPreferenceManager.getDefaultSharedPreferences(mContext).unregisterOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t\t\n\t\tmContext.unbindService(mServiceConnection);\n\t}\n\t\n\tpublic List<Action> onPageStarted(String tabId, String url) {\n\t\tif (makeCall(Callbacks.PAGE_STARTED)) {\n\t\t\treturn mServiceConnection.onPageStarted(tabId, url);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onPageFinished(String tabId, String url) {\n\t\tif (makeCall(Callbacks.PAGE_FINISHED)) {\n\t\t\treturn mServiceConnection.onPageFinished(tabId, url);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onTabOpened(String tabId) {\n\t\tif (makeCall(Callbacks.TAB_OPENED)) {\n\t\t\treturn mServiceConnection.onTabOpened(tabId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onTabClosed(String tabId) {\n\t\tif (makeCall(Callbacks.TAB_CLOSED)) {\n\t\t\treturn mServiceConnection.onTabClosed(tabId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onTabSwitched(String tabId) {\n\t\tif (makeCall(Callbacks.TAB_SWITCHED)) {\n\t\t\treturn mServiceConnection.onTabSwitched(tabId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic String getContributedMainMenuItem(String currentTabId, String currentTitle, String currentUrl) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_MAIN_MENU)) {\n\t\t\treturn mServiceConnection.getContributedMainMenuItem(currentTabId, currentTitle, currentUrl); \n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onContributedMainMenuItemSelected(String currentTabId, String currentTitle, String currentUrl) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_MAIN_MENU)) {\n\t\t\treturn mServiceConnection.onContributedMainMenuItemSelected(currentTabId, currentTitle, currentUrl);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic String getContributedLinkContextMenuItem(String currentTabId, int hitTestResult, String url) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_LINK_CONTEXT_MENU)) {\n\t\t\t\treturn mServiceConnection.getContributedLinkContextMenuItem(currentTabId, hitTestResult, url);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onContributedLinkContextMenuItemSelected(String currentTabId, int hitTestResult, String url) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_LINK_CONTEXT_MENU)) {\n\t\t\treturn mServiceConnection.onContributedLinkContextMenuItemSelected(currentTabId, hitTestResult, url);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic String getContributedHistoryBookmarksMenuItem(String currentTabId) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_HISTORY_BOOKMARKS_MENU)) {\n\t\t\treturn mServiceConnection.getContributedHistoryBookmarksMenuItem(currentTabId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onContributedHistoryBookmarksMenuItemSelected(String currentTabId) {\n\t\treturn mServiceConnection.onContributedHistoryBookmarksMenuItemSelected(currentTabId);\n\t}\n\t\n\tpublic String getContributedBookmarkContextMenuItem(String currentTabId) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_BOOKMARK_CONTEXT_MENU)) {\n\t\t\treturn mServiceConnection.getContributedBookmarkContextMenuItem(currentTabId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onContributedBookmarkContextMenuItemSelected(String currentTabId, String title, String url) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_BOOKMARK_CONTEXT_MENU)) {\n\t\t\treturn mServiceConnection.onContributedBookmarkContextMenuItemSelected(currentTabId, title, url);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic String getContributedHistoryContextMenuItem(String currentTabId) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_HISTORY_CONTEXT_MENU)) {\n\t\t\treturn mServiceConnection.getContributedHistoryContextMenuItem(currentTabId);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onContributedHistoryContextMenuItemSelected(String currentTabId, String title, String url) {\n\t\tif (makeCall(Callbacks.CONTRIBUTE_HISTORY_CONTEXT_MENU)) {\n\t\t\treturn mServiceConnection.onContributedHistoryContextMenuItemSelected(currentTabId, title, url);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onUserConfirm(String currentTabId, int questionId, boolean positiveAnswer) {\n\t\tif (makeCallWithoutSpecificCallback()) {\n\t\t\treturn mServiceConnection.onUserConfirm(currentTabId, questionId, positiveAnswer);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onUserInput(String currentTabId, int questionId, boolean cancelled, String userInput) {\n\t\tif (makeCallWithoutSpecificCallback()) {\n\t\t\treturn mServiceConnection.onUserInput(currentTabId, questionId, cancelled, userInput);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic List<Action> onUserChoice(String currentTabId, int questionId, boolean cancelled, int userChoice) {\n\t\tif (makeCallWithoutSpecificCallback()) {\n\t\t\treturn mServiceConnection.onUserChoice(currentTabId, questionId, cancelled, userChoice);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic void showAddonSettingsActivity() {\n\t\tif (makeCallEvenDisabled(Callbacks.HAS_SETTINGS_PAGE)) {\n\t\t\tmServiceConnection.showAddonSettingsActivity();\n\t\t}\n\t}\n\t\n\tpublic List<String> getUserReadbleCallbacks() {\n\t\tList<String> results = new ArrayList<String>();\n\t\t\n\t\tif ((mCallbacks & Callbacks.PAGE_STARTED) == Callbacks.PAGE_STARTED) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackPageStarted));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.PAGE_FINISHED) == Callbacks.PAGE_FINISHED) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackPageFinished));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.TAB_OPENED) == Callbacks.TAB_OPENED) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackTabOpened));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.TAB_CLOSED) == Callbacks.TAB_CLOSED) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackTabClosed));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.TAB_SWITCHED) == Callbacks.TAB_SWITCHED) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackTabSwitched));\n\t\t}\n\n\t\tif ((mCallbacks & Callbacks.CONTRIBUTE_MAIN_MENU) == Callbacks.CONTRIBUTE_MAIN_MENU) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackContributeMainMenu));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.CONTRIBUTE_LINK_CONTEXT_MENU) == Callbacks.CONTRIBUTE_LINK_CONTEXT_MENU) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackContributeLinkContextMenu));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.CONTRIBUTE_HISTORY_BOOKMARKS_MENU) == Callbacks.CONTRIBUTE_HISTORY_BOOKMARKS_MENU) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackContributeHistoryBookmarksMenu));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.CONTRIBUTE_BOOKMARK_CONTEXT_MENU) == Callbacks.CONTRIBUTE_BOOKMARK_CONTEXT_MENU) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackContributeBookmarkContextMenu));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.CONTRIBUTE_HISTORY_CONTEXT_MENU) == Callbacks.CONTRIBUTE_HISTORY_CONTEXT_MENU) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackContributeHistoryContextMenu));\n\t\t}\n\t\t\n\t\tif ((mCallbacks & Callbacks.HAS_SETTINGS_PAGE) == Callbacks.HAS_SETTINGS_PAGE) {\n\t\t\tresults.add(mContext.getString(R.string.AddonCallbackHasPreferencesPage));\n\t\t}\n\t\t\n\t\treturn results;\n\t}\n\t\n\tprivate boolean makeCall(int callback) {\n\t\treturn (mIsEnabled && mServiceConnection.isBinded() && (mCallbacks & callback) == callback);\n\t}\n\t\n\tprivate boolean makeCallEvenDisabled(int callback) {\n\t\treturn (mServiceConnection.isBinded() && (mCallbacks & callback) == callback);\n\t}\n\t\n\tprivate boolean makeCallWithoutSpecificCallback() {\n\t\treturn mIsEnabled && mServiceConnection.isBinded();\n\t}\n\t\n\tprivate void init() {\n\t\tmIsEnabled = false;\n\t\tmPreferenceChangeListener = null;\n\t\t\n\t\tmCallbacks = mServiceConnection.getCallbacks();\n\t\t\n\t\tmName = mServiceConnection.getName();\n\t\tmShortDescription = mServiceConnection.getShortDescription();\n\t\tmDescription = mServiceConnection.getDescription();\n\t\tmContact = mServiceConnection.getContact();\n\t\t\n\t\tif (!TextUtils.isEmpty(mName)) {\n\t\t\tmPreferenceName = Constants.TECHNICAL_PREFERENCE_ADDON_ENABLED + mName.toUpperCase().replace(\" \", \"_\");\n\t\t\tmIsEnabled = PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(mPreferenceName, true);\n\t\t\t\n\t\t\tmPreferenceChangeListener = new OnSharedPreferenceChangeListener() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\t\t\t\tif (mPreferenceName.equals(key)) {\n\t\t\t\t\t\tmIsEnabled = PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(mPreferenceName, true);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t};\n\t\t\t\n\t\t\tPreferenceManager.getDefaultSharedPreferences(mContext).registerOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/AddonManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.tint.addons.executors.BaseActionExecutor;\nimport org.tint.addons.executors.ExecutorFactory;\nimport org.tint.addons.framework.Action;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.managers.UIManager;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.text.TextUtils;\n\npublic class AddonManager {\n\t\n\tpublic static final String ACTION_ADDON = \"org.tint.intent.action.ADDON\";\n\t\n\tprivate Context mMainContext;\n\tprivate UIManager mUIManager;\n\tprivate PackageManager mPackageManager;\n\tprivate List<Addon> mAddons;\n\t\n\tpublic AddonManager(Context context, UIManager uiManager) {\n\t\tmMainContext = context;\n\t\tmUIManager = uiManager;\n\t\tmPackageManager = mMainContext.getPackageManager();\n\t\tmAddons = new ArrayList<Addon>();\n\t}\n\t\n\tpublic List<Addon> getAddons() {\n\t\treturn mAddons;\n\t}\n\t\n\tpublic void bindAddons() {\n\t\tmAddons.clear();\n\t\t\n\t\tIntent baseIntent = new Intent(ACTION_ADDON);\n\t\tList<ResolveInfo> addonInfoList = mPackageManager.queryIntentServices(baseIntent, PackageManager.GET_RESOLVED_FILTER);\n\t\t\n\t\tint addonId = 0;\n\t\t\n\t\tfor (ResolveInfo addonInfo : addonInfoList) {\n\t\t\tString category = addonInfo.filter.categoriesIterator().next();\n\t\t\t\n\t\t\tAddon addon = new Addon(mMainContext, addonId, addonInfo, category);\t\t\t\n\t\t\tmAddons.add(addon);\n\t\t\t\n\t\t\taddonId++;\n\t\t}\t\t\n\t}\n\t\n\tpublic void unbindAddons() {\n\t\tfor (Addon addon : mAddons) {\n\t\t\taddon.unbindService();\n\t\t}\n\t\t\n\t\tmAddons.clear();\n\t}\n\t\n\tpublic void onPageStarted(Context context, CustomWebView webView, String url) {\n\t\tList<AddonResponseWrapper> responses = new ArrayList<AddonResponseWrapper>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tList<Action> response = addon.onPageStarted(webView.getParentFragment().getUUID().toString(), url);\n\t\t\tif (response != null) {\n\t\t\t\tresponses.add(new AddonResponseWrapper(addon, response));\n\t\t\t}\n\t\t}\n\t\t\n\t\tprocessResponses(context, webView, responses);\n\t}\n\t\n\tpublic void onPageFinished(Context context, CustomWebView webView, String url) {\n\t\tList<AddonResponseWrapper> responses = new ArrayList<AddonResponseWrapper>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tList<Action> response = addon.onPageFinished(webView.getParentFragment().getUUID().toString(), url);\n\t\t\tif (response != null) {\n\t\t\t\tresponses.add(new AddonResponseWrapper(addon, response));\n\t\t\t}\n\t\t}\n\t\t\n\t\tprocessResponses(context, webView, responses);\n\t}\n\t\n\tpublic void onTabOpened(Context context, CustomWebView webView) {\n\t\tList<AddonResponseWrapper> responses = new ArrayList<AddonResponseWrapper>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tList<Action> response = addon.onTabOpened(webView.getParentFragmentUUID().toString());\n\t\t\tif (response != null) {\n\t\t\t\tresponses.add(new AddonResponseWrapper(addon, response));\n\t\t\t}\n\t\t}\n\t\t\n\t\tprocessResponses(context, webView, responses);\n\t}\n\t\n\tpublic void onTabClosed(Context context, CustomWebView webView) {\n\t\tList<AddonResponseWrapper> responses = new ArrayList<AddonResponseWrapper>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tList<Action> response = addon.onTabClosed(webView.getParentFragmentUUID().toString());\n\t\t\tif (response != null) {\n\t\t\t\tresponses.add(new AddonResponseWrapper(addon, response));\n\t\t\t}\n\t\t}\n\t\t\n\t\tprocessResponses(context, webView, responses);\n\t}\n\t\n\tpublic void onTabSwitched(Context context, CustomWebView webView) {\n\t\tList<AddonResponseWrapper> responses = new ArrayList<AddonResponseWrapper>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tList<Action> response = addon.onTabSwitched(webView.getParentFragmentUUID().toString());\n\t\t\tif (response != null) {\n\t\t\t\tresponses.add(new AddonResponseWrapper(addon, response));\n\t\t\t}\n\t\t}\n\t\t\n\t\tprocessResponses(context, webView, responses);\n\t}\n\t\n\tpublic List<AddonMenuItem> getContributedMainMenuItems(CustomWebView currentWebview) {\n\t\tList<AddonMenuItem> result = new ArrayList<AddonMenuItem>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tString response = addon.getContributedMainMenuItem(\n\t\t\t\t\tcurrentWebview.getParentFragmentUUID().toString(),\n\t\t\t\t\tcurrentWebview.getTitle(),\n\t\t\t\t\tcurrentWebview.getUrl());\n\t\t\t\n\t\t\tif (!TextUtils.isEmpty(response)) {\n\t\t\t\tresult.add(new AddonMenuItem(addon, response));\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic boolean onContributedMainMenuItemSelected(Context context, int addonId, CustomWebView currentWebview) {\n\t\taddonId = Math.abs(addonId) - 1000;\n\t\t\n\t\tif ((addonId >= 0) &&\n\t\t\t\t(addonId < mAddons.size())) {\n\t\t\t\n\t\t\tAddon addon = mAddons.get(addonId);\n\t\t\t\n\t\t\tList<Action> response = addon.onContributedMainMenuItemSelected(\n\t\t\t\t\tcurrentWebview.getParentFragmentUUID().toString(),\n\t\t\t\t\tcurrentWebview.getTitle(),\n\t\t\t\t\tcurrentWebview.getUrl());\n\t\t\t\n\t\t\tprocessOneResponse(context, currentWebview, addon, response);\n\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic List<AddonMenuItem> getContributedLinkContextMenuItems(CustomWebView currentWebview, int hitTestResult, String url) {\n\t\tList<AddonMenuItem> result = new ArrayList<AddonMenuItem>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tString response = addon.getContributedLinkContextMenuItem(\n\t\t\t\t\tcurrentWebview.getParentFragmentUUID().toString(),\n\t\t\t\t\thitTestResult,\n\t\t\t\t\turl);\n\t\t\t\n\t\t\tif (!TextUtils.isEmpty(response)) {\n\t\t\t\tresult.add(new AddonMenuItem(addon, response));\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic void onContributedContextLinkMenuItemSelected(Context context, int addonId, int hitTestResult, String url, CustomWebView currentWebview) {\n\t\taddonId = Math.abs(addonId) - 1000;\n\t\t\n\t\tif ((addonId >= 0) &&\n\t\t\t\t(addonId < mAddons.size())) {\n\t\t\t\n\t\t\tAddon addon = mAddons.get(addonId);\n\t\t\t\n\t\t\tList<Action> response = addon.onContributedLinkContextMenuItemSelected(\n\t\t\t\t\tcurrentWebview.getParentFragmentUUID().toString(),\n\t\t\t\t\thitTestResult,\n\t\t\t\t\turl);\n\t\t\t\n\t\t\tprocessOneResponse(context, currentWebview, addon, response);\n\t\t}\n\t}\n\t\n\tpublic List<AddonMenuItem> getContributedHistoryBookmarksMenuItems(CustomWebView currentWebview) {\n\t\tList<AddonMenuItem> result = new ArrayList<AddonMenuItem>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tString response = addon.getContributedHistoryBookmarksMenuItem(currentWebview.getParentFragmentUUID().toString());\n\t\t\t\n\t\t\tif (!TextUtils.isEmpty(response)) {\n\t\t\t\tresult.add(new AddonMenuItem(addon, response));\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic boolean onContributedHistoryBookmarksMenuItemSelected(Context context, int addonId, CustomWebView currentWebView) {\n\t\taddonId = Math.abs(addonId) - 1000;\n\t\t\n\t\tif ((addonId >= 0) &&\n\t\t\t\t(addonId < mAddons.size())) {\n\t\t\t\n\t\t\tAddon addon = mAddons.get(addonId);\n\t\t\t\n\t\t\tList<Action> response = addon.onContributedHistoryBookmarksMenuItemSelected(currentWebView.getParentFragmentUUID().toString());\n\t\t\tprocessOneResponse(context, currentWebView, addon, response);\n\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic List<AddonMenuItem> getContributedBookmarkContextMenuItems(CustomWebView currentWebview) {\n\t\tList<AddonMenuItem> result = new ArrayList<AddonMenuItem>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tString response = addon.getContributedBookmarkContextMenuItem(currentWebview.getParentFragmentUUID().toString());\n\t\t\t\n\t\t\tif (!TextUtils.isEmpty(response)) {\n\t\t\t\tresult.add(new AddonMenuItem(addon, response));\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic boolean onContributedBookmarkContextMenuItemSelected(Context context, int addonId, String title, String url, CustomWebView currentWebView) {\n\t\taddonId = Math.abs(addonId) - 1000;\n\t\t\n\t\tif ((addonId >= 0) &&\n\t\t\t\t(addonId < mAddons.size())) {\n\t\t\t\n\t\t\tAddon addon = mAddons.get(addonId);\n\t\t\t\n\t\t\tList<Action> response = addon.onContributedBookmarkContextMenuItemSelected(\n\t\t\t\t\tcurrentWebView.getParentFragmentUUID().toString(),\n\t\t\t\t\ttitle,\n\t\t\t\t\turl);\n\t\t\t\n\t\t\tprocessOneResponse(context, currentWebView, addon, response);\n\t\t\t\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic List<AddonMenuItem> getContributedHistoryContextMenuItems(CustomWebView currentWebview) {\n\t\tList<AddonMenuItem> result = new ArrayList<AddonMenuItem>();\n\t\t\n\t\tfor (Addon addon : mAddons) {\n\t\t\tString response = addon.getContributedHistoryContextMenuItem(currentWebview.getParentFragmentUUID().toString());\n\t\t\t\n\t\t\tif (!TextUtils.isEmpty(response)) {\n\t\t\t\tresult.add(new AddonMenuItem(addon, response));\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic boolean onContributedHistoryContextMenuItemSelected(Context context, int addonId, String title, String url, CustomWebView currentWebView) {\n\t\taddonId = Math.abs(addonId) - 1000;\n\t\t\n\t\tif ((addonId >= 0) &&\n\t\t\t\t(addonId < mAddons.size())) {\n\t\t\t\n\t\t\tAddon addon = mAddons.get(addonId);\n\t\t\t\n\t\t\tList<Action> response = addon.onContributedHistoryContextMenuItemSelected(\n\t\t\t\t\tcurrentWebView.getParentFragmentUUID().toString(),\n\t\t\t\t\ttitle,\n\t\t\t\t\turl);\n\t\t\t\n\t\t\tprocessOneResponse(context, currentWebView, addon, response);\n\t\t\t\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic void onUserConfirm(Context context, CustomWebView currentWebView, Addon addon, int actionId, boolean positiveAnswer) {\n\t\tList<Action> response = addon.onUserConfirm(\n\t\t\t\tcurrentWebView.getParentFragmentUUID().toString(),\n\t\t\t\tactionId,\n\t\t\t\tpositiveAnswer);\n\t\t\n\t\tprocessOneResponse(context, currentWebView, addon, response);\n\t}\n\t\n\tpublic void onUserInput(Context context, CustomWebView currentWebView, Addon addon, int actionId, boolean cancelled, String userInput) {\n\t\tList<Action> response = addon.onUserInput(\n\t\t\t\tcurrentWebView.getParentFragmentUUID().toString(),\n\t\t\t\tactionId,\n\t\t\t\tcancelled,\n\t\t\t\tuserInput);\n\t\t\n\t\tprocessOneResponse(context, currentWebView, addon, response);\n\t}\n\t\n\tpublic void onUserChoice(Context context, CustomWebView currentWebView, Addon addon, int actionId, boolean cancelled, int userChoice) {\n\t\tList<Action> response = addon.onUserChoice(\n\t\t\t\tcurrentWebView.getParentFragmentUUID().toString(),\n\t\t\t\tactionId,\n\t\t\t\tcancelled,\n\t\t\t\tuserChoice);\n\t\t\n\t\tprocessOneResponse(context, currentWebView, addon, response);\n\t}\n\t\n\tprivate void processOneAction(final Context context, final CustomWebView webView, final Addon addon, final Action addonAction) {\n\t\tBaseActionExecutor executor = ExecutorFactory.getExecutor(addonAction);\n\t\t\n\t\tif (executor != null) {\n\t\t\texecutor.execute(context, mUIManager, webView, addon, addonAction);\n\t\t}\n\t}\n\t\n\tprivate void processOneResponse(Context context, CustomWebView webView, Addon addon, List<Action> response) {\n\t\tif (response != null) {\n\t\t\tfor (Action action : response) {\n\t\t\t\tprocessOneAction(context, webView, addon, action);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void processOneResponse(Context context, CustomWebView webView, AddonResponseWrapper responseWrapper) {\n\t\tif (responseWrapper != null) {\n\t\t\tAddon addon = responseWrapper.getAddon();\n\t\t\tList<Action> response = responseWrapper.getResponse();\n\n\t\t\tprocessOneResponse(context, webView, addon, response);\n\t\t}\n\t}\n\t\n\tprivate void processResponses(Context context, CustomWebView webView, List<AddonResponseWrapper> responses) {\n\t\tif (responses != null) {\n\t\t\tfor (AddonResponseWrapper response : responses) {\n\t\t\t\tprocessOneResponse(context, webView, response);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/AddonMenuItem.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons;\n\npublic class AddonMenuItem {\n\n\tprivate Addon mAddon;\n\tprivate String mMenuItem;\t\n\t\n\tpublic AddonMenuItem(Addon addon, String menuItem) {\n\t\tmAddon = addon;\n\t\tmMenuItem = menuItem;\n\t}\n\t\n\tpublic Addon getAddon() {\n\t\treturn mAddon;\n\t}\n\t\n\tpublic String getMenuItem() {\n\t\treturn mMenuItem;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/addons/AddonResponseWrapper.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons;\n\nimport java.util.List;\n\nimport org.tint.addons.framework.Action;\n\npublic class AddonResponseWrapper {\n\n\tprivate Addon mAddon;\n\tprivate List<Action> mResponse;\n\t\n\tpublic AddonResponseWrapper(Addon addon, List<Action> response) {\n\t\tmAddon = addon;\n\t\tmResponse = response;\n\t}\n\t\n\tpublic Addon getAddon() {\n\t\treturn mAddon;\n\t}\n\t\n\tpublic List<Action> getResponse() {\n\t\treturn mResponse;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/addons/AddonServiceConnection.java",
    "content": "/*\r\n * Tint Browser for Android\r\n * \r\n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License\r\n * version 3 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n */\r\n\r\npackage org.tint.addons;\r\n\r\nimport java.util.List;\r\n\r\nimport org.tint.addons.framework.Action;\r\nimport org.tint.addons.framework.IAddon;\r\n\r\nimport android.content.ComponentName;\r\nimport android.content.Intent;\r\nimport android.content.ServiceConnection;\r\nimport android.os.IBinder;\r\nimport android.os.RemoteException;\r\n\r\npublic class AddonServiceConnection implements ServiceConnection {\r\n\r\n\tpublic interface AddonServiceConnectionListener {\r\n\t\tvoid onServiceConnected();\r\n\t}\r\n\t\r\n\tprivate Intent mIntent;\r\n\tprivate IAddon mAddon;\r\n\t\r\n\tprivate boolean mIsBinded;\r\n\t\r\n\tprivate AddonServiceConnectionListener mListener;\r\n\t\r\n\tpublic AddonServiceConnection(Intent intent) {\r\n\t\tmIntent = intent;\r\n\t\tmAddon = null;\r\n\t\tmIsBinded = false;\r\n\t\tmListener = null;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void onServiceConnected(ComponentName className, IBinder boundService) {\r\n\t\tmAddon = IAddon.Stub.asInterface(boundService);\r\n\t\tmIsBinded = true;\r\n\r\n\t\ttry {\t\t\t\r\n\t\t\tmAddon.onBind();\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\t\r\n\t\tif (mListener != null) {\r\n\t\t\tmListener.onServiceConnected();\r\n\t\t}\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void onServiceDisconnected(ComponentName className) {\r\n\t\t\r\n\t\ttry {\r\n\t\t\tmAddon.onUnbind();\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t\t\r\n\t\tmAddon = null;\r\n\t\tmIsBinded = false;\r\n\t}\r\n\t\r\n\tpublic void setAddonServiceConnectionListener(AddonServiceConnectionListener listener) {\r\n\t\tmListener = listener;\r\n\t}\r\n\t\r\n\tpublic int getCallbacks() {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getCallbacks();\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getName();\r\n\t\t} catch (RemoteException e) {\t\t\t\t\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getShortDescription() {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getShortDescription();\r\n\t\t} catch (RemoteException e) {\t\t\t\t\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getDescription() {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getDescription();\r\n\t\t} catch (RemoteException e) {\t\t\t\t\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getContact() {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getContact();\r\n\t\t} catch (RemoteException e) {\t\t\t\t\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onPageStarted(String tabId, String url) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onPageStarted(tabId, url);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onPageFinished(String tabId, String url) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onPageFinished(tabId, url);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onTabOpened(String tabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onTabOpened(tabId);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onTabClosed(String tabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onTabClosed(tabId);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onTabSwitched(String tabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onTabSwitched(tabId);\r\n\t\t} catch (RemoteException e) {\t\t\t\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getContributedMainMenuItem(String currentTabId, String currentTitle, String currentUrl) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getContributedMainMenuItem(currentTabId, currentTitle, currentUrl);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onContributedMainMenuItemSelected(String currentTabId, String currentTitle, String currentUrl) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onContributedMainMenuItemSelected(currentTabId, currentTitle, currentUrl);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getContributedLinkContextMenuItem(String currentTabId, int hitTestResult, String url) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getContributedLinkContextMenuItem(currentTabId, hitTestResult, url);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onContributedLinkContextMenuItemSelected(String currentTabId, int hitTestResult, String url) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onContributedLinkContextMenuItemSelected(currentTabId, hitTestResult, url);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getContributedHistoryBookmarksMenuItem(String currentTabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getContributedHistoryBookmarksMenuItem(currentTabId);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onContributedHistoryBookmarksMenuItemSelected(String currentTabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onContributedHistoryBookmarksMenuItemSelected(currentTabId);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getContributedBookmarkContextMenuItem(String currentTabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getContributedBookmarkContextMenuItem(currentTabId);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onContributedBookmarkContextMenuItemSelected(String currentTabId, String title, String url) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onContributedBookmarkContextMenuItemSelected(currentTabId, title, url);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic String getContributedHistoryContextMenuItem(String currentTabId) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.getContributedHistoryContextMenuItem(currentTabId);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onContributedHistoryContextMenuItemSelected(String currentTabId, String title, String url) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onContributedHistoryContextMenuItemSelected(currentTabId, title, url);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onUserConfirm(String currentTabId, int questionId, boolean positiveAnswer) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onUserConfirm(currentTabId, questionId, positiveAnswer);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onUserInput(String currentTabId, int questionId, boolean cancelled, String userInput) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onUserInput(currentTabId, questionId, cancelled, userInput);\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic List<Action> onUserChoice(String currentTabId, int questionId, boolean cancelled, int userChoice) {\r\n\t\ttry {\r\n\t\t\treturn mAddon.onUserChoice(currentTabId, questionId, cancelled, userChoice);\r\n\t\t} catch (RemoteException e) {\t\t\t\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void showAddonSettingsActivity() {\r\n\t\ttry {\r\n\t\t\tmAddon.showAddonSettingsActivity();\r\n\t\t} catch (RemoteException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\t\r\n\t\r\n\tpublic Intent getIntent() {\r\n\t\treturn mIntent;\r\n\t}\r\n\t\r\n\tpublic boolean isBinded() {\r\n\t\treturn mIsBinded;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/org/tint/addons/executors/AskUserChoiceExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport org.tint.R;\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.AskUserChoiceAction;\nimport org.tint.controllers.Controller;\n\nimport android.app.AlertDialog;\nimport android.content.DialogInterface;\nimport android.content.DialogInterface.OnCancelListener;\nimport android.content.DialogInterface.OnClickListener;\n\npublic class AskUserChoiceExecutor extends BaseActionExecutor {\n\n\tprivate AskUserChoiceAction mAddonAction;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (AskUserChoiceAction) addonAction;\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\tAlertDialog.Builder builder = new AlertDialog.Builder(mContext);\n\t\t\n\t\tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n\t\tbuilder.setTitle(mAddonAction.getTitle());\n\t\t\n\t\tbuilder.setSingleChoiceItems(mAddonAction.getChoices().toArray(new String[mAddonAction.getChoices().size()]), 0, new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tdialog.dismiss();\n\t\t\t\t\n\t\t\t\tController.getInstance().getAddonManager().onUserChoice(\n\t\t\t\t\t\tmContext,\n\t\t\t\t\t\tmWebView,\n\t\t\t\t\t\tmAddon,\n\t\t\t\t\t\tmAddonAction.getId(),\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\twhich);\n\t\t\t}\t\t\t\n\t\t});\n\t\t\n\t\tbuilder.setCancelable(true);\n\t\tbuilder.setNegativeButton(R.string.Cancel, new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tController.getInstance().getAddonManager().onUserChoice(\n\t\t\t\t\t\tmContext,\n\t\t\t\t\t\tmWebView,\n\t\t\t\t\t\tmAddon,\n\t\t\t\t\t\tmAddonAction.getId(),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t-1);\n\t\t\t}\t\t\t\n\t\t\t\n\t\t});\n\t\t\n\t\tbuilder.setOnCancelListener(new OnCancelListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onCancel(DialogInterface dialog) {\n\t\t\t\tController.getInstance().getAddonManager().onUserChoice(\n\t\t\t\t\t\tmContext,\n\t\t\t\t\t\tmWebView,\n\t\t\t\t\t\tmAddon,\n\t\t\t\t\t\tmAddonAction.getId(),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t-1);\n\t\t\t}\n\t\t});\n\t\t\n\t\tAlertDialog alert = builder.create();\n    \talert.show();\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/AskUserConfirmationExecutor.java",
    "content": "/*\r\n * Tint Browser for Android\r\n * \r\n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License\r\n * version 3 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n */\r\n\r\npackage org.tint.addons.executors;\r\n\r\nimport org.tint.addons.framework.Action;\r\nimport org.tint.addons.framework.AskUserConfirmationAction;\r\nimport org.tint.controllers.Controller;\r\n\r\nimport android.app.AlertDialog;\r\nimport android.content.DialogInterface;\r\nimport android.content.DialogInterface.OnCancelListener;\r\nimport android.content.DialogInterface.OnClickListener;\r\n\r\npublic class AskUserConfirmationExecutor extends BaseActionExecutor {\r\n\r\n\tprivate AskUserConfirmationAction mAddonAction;\r\n\t\r\n\t@Override\r\n\tprotected void finishInit(Action addonAction) {\r\n\t\tmAddonAction = (AskUserConfirmationAction) addonAction;\r\n\t}\r\n\r\n\t@Override\r\n\tprotected void internalExecute() {\r\n\t\tAlertDialog.Builder builder = new AlertDialog.Builder(mContext);\r\n\t\t\r\n    \tbuilder.setCancelable(true);\r\n    \tbuilder.setIcon(android.R.drawable.ic_dialog_info);\r\n    \tbuilder.setTitle(mAddonAction.getTitle());\r\n    \tbuilder.setMessage(mAddonAction.getMessage());\r\n\r\n    \tbuilder.setInverseBackgroundForced(true);\r\n    \tbuilder.setPositiveButton(mAddonAction.getPositiveButtonCaption(), new OnClickListener() {\r\n\t\t\t@Override\r\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\t\t\tController.getInstance().getAddonManager().onUserConfirm(mContext, mWebView, mAddon, mAddonAction.getId(), true);\r\n\t\t\t}\r\n\t\t});\r\n    \t\r\n    \tbuilder.setNegativeButton(mAddonAction.getNegativeButtonCaption(), new OnClickListener() {\t\t\t\r\n\t\t\t@Override\r\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\t\t\tController.getInstance().getAddonManager().onUserConfirm(mContext, mWebView, mAddon, mAddonAction.getId(), false);\r\n\t\t\t}\r\n\t\t});\r\n    \t\r\n    \tbuilder.setOnCancelListener(new OnCancelListener() {\t\t\t\r\n\t\t\t@Override\r\n\t\t\tpublic void onCancel(DialogInterface dialog) {\r\n\t\t\t\tController.getInstance().getAddonManager().onUserConfirm(mContext, mWebView, mAddon, mAddonAction.getId(), false);\r\n\t\t\t}\r\n\t\t});\r\n    \t\r\n    \tAlertDialog alert = builder.create();\r\n    \talert.show();\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/org/tint/addons/executors/AskUserInputExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport org.tint.R;\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.AskUserInputAction;\nimport org.tint.controllers.Controller;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.DialogInterface.OnCancelListener;\nimport android.content.DialogInterface.OnClickListener;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\npublic class AskUserInputExecutor extends BaseActionExecutor {\n\n\tprivate AskUserInputAction mAddonAction;\n\n\tprivate LayoutInflater mInflater = null;\n\t\n\tprivate View mView = null;\n\tprivate TextView mMessage;\n\tprivate EditText mInput;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (AskUserInputAction) addonAction;\n\t\t\n\t\tif (mInflater == null) {\n\t\t\tmInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\t\t\t\n\t\t}\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\t\n\t\tmView = mInflater.inflate(R.layout.ask_user_input_dialog, null);\n\t\tmMessage = (TextView) mView.findViewById(R.id.AskUserInputMessage);\n\t\tmInput = (EditText) mView.findViewById(R.id.AskUserInput);\n\t\t\n\t\tAlertDialog.Builder builder = new AlertDialog.Builder(mContext);\n\t\t\n\t\tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n\t\tbuilder.setCancelable(true);\n\t\t\n\t\tbuilder.setTitle(mAddonAction.getTitle());\n\t\t\n\t\tmMessage.setText(mAddonAction.getMessage());\n\t\t\t\t\n\t\tmInput.setInputType(mAddonAction.getInputType());\n\t\tmInput.setHint(mAddonAction.getInputHint());\n\t\tmInput.setText(mAddonAction.getDefaultInput());\n\t\t\n\t\tbuilder.setView(mView);\n\t\t\n\t\tbuilder.setPositiveButton(R.string.OK, new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tController.getInstance().getAddonManager().onUserInput(\n\t\t\t\t\t\tmContext,\n\t\t\t\t\t\tmWebView,\n\t\t\t\t\t\tmAddon,\n\t\t\t\t\t\tmAddonAction.getId(),\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tmInput.getText().toString());\n\t\t\t}\n\t\t});\n\t\t\n\t\tbuilder.setNegativeButton(R.string.Cancel, new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tController.getInstance().getAddonManager().onUserInput(\n\t\t\t\t\t\tmContext,\n\t\t\t\t\t\tmWebView,\n\t\t\t\t\t\tmAddon,\n\t\t\t\t\t\tmAddonAction.getId(),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tnull);\n\t\t\t}\n\t\t});\n\t\t\n\t\tbuilder.setOnCancelListener(new OnCancelListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onCancel(DialogInterface dialog) {\n\t\t\t\tController.getInstance().getAddonManager().onUserInput(\n\t\t\t\t\t\tmContext,\n\t\t\t\t\t\tmWebView,\n\t\t\t\t\t\tmAddon,\n\t\t\t\t\t\tmAddonAction.getId(),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tnull);\n\t\t\t}\n\t\t});\n\t\t\n\t\tAlertDialog alert = builder.create();\n    \talert.show();\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/BaseActionExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport org.tint.addons.Addon;\nimport org.tint.addons.framework.Action;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.managers.UIManager;\n\nimport android.content.Context;\n\npublic abstract class BaseActionExecutor {\n\t\n\tprotected Context mContext;\n\tprotected UIManager mUIManager;\n\tprotected CustomWebView mWebView;\n\tprotected Addon mAddon;\n\t\n\tprivate void init(Context context, UIManager uiManager, CustomWebView webView, Addon addon, Action addonAction) {\n\t\tmContext = context;\n\t\tmUIManager = uiManager;\n\t\tmWebView = webView;\n\t\tmAddon = addon;\n\t\t\n\t\tfinishInit(addonAction);\n\t}\n\t\n\tprotected abstract void finishInit(Action addonAction);\n\t\n\tprotected abstract void internalExecute();\n\t\n\tpublic synchronized void execute(Context context, UIManager uiManager, CustomWebView webView, Addon addon, Action addonAction) {\n\t\tinit(context, uiManager, webView, addon, addonAction);\n\t\tinternalExecute();\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/ExecutorFactory.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.AskUserChoiceAction;\nimport org.tint.addons.framework.AskUserConfirmationAction;\nimport org.tint.addons.framework.AskUserInputAction;\nimport org.tint.addons.framework.LoadUrlAction;\nimport org.tint.addons.framework.OpenTabAction;\nimport org.tint.addons.framework.ShowDialogAction;\nimport org.tint.addons.framework.ShowToastAction;\nimport org.tint.addons.framework.TabAction;\n\npublic class ExecutorFactory {\n\t\n\tprivate static Map<String, BaseActionExecutor> sClassMap;\n\t\n\tstatic {\n\t\tsClassMap = new HashMap<String, BaseActionExecutor>();\n\t\tsClassMap.put(TabAction.class.getName(), new TabActionExecutor());\n\t\tsClassMap.put(ShowDialogAction.class.getName(), new ShowDialogExecutor());\n\t\tsClassMap.put(LoadUrlAction.class.getName(), new LoadUrlExecutor());\n\t\tsClassMap.put(ShowToastAction.class.getName(), new ShowToastExecutor());\n\t\tsClassMap.put(OpenTabAction.class.getName(), new OpenTabExecutor());\n\t\tsClassMap.put(AskUserConfirmationAction.class.getName(), new AskUserConfirmationExecutor());\n\t\tsClassMap.put(AskUserInputAction.class.getName(), new AskUserInputExecutor());\n\t\tsClassMap.put(AskUserChoiceAction.class.getName(), new AskUserChoiceExecutor());\n\t}\n\t\n\tpublic static BaseActionExecutor getExecutor(Action addonAction) {\n\t\tif (addonAction != null) {\n\t\t\treturn sClassMap.get(addonAction.getClass().getName());\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/LoadUrlExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport java.util.UUID;\n\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.LoadUrlAction;\nimport android.text.TextUtils;\n\npublic class LoadUrlExecutor extends BaseActionExecutor {\n\n\tprivate LoadUrlAction mAddonAction;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (LoadUrlAction) addonAction;\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\tString tabId = mAddonAction.getTabId();\t\t\t\t\n\t\tString url = mAddonAction.getUrl();\n\t\t\n\t\tif (TextUtils.isEmpty(tabId)) {\n\t\t\tif (mWebView != null) {\t\t\t\t\n\t\t\t\t\n\t\t\t\tif (mAddonAction.getLoadRawUrl()) {\n\t\t\t\t\tmWebView.loadRawUrl(url);\n\t\t\t\t} else {\n\t\t\t\t\tif (TextUtils.isEmpty(url)) {\n\t\t\t\t\t\tmUIManager.loadHomePage();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmUIManager.loadUrl(url);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t\n\t\t\tUUID id;\t\t\t\n\t\t\ttry {\n\t\t\t\tid = UUID.fromString(tabId);\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\tid = null;\n\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\tid = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (id != null) {\t\t\t\n\t\t\t\tif (mAddonAction.getLoadRawUrl()) {\n\t\t\t\t\tmUIManager.loadRawUrl(id, url, false);\n\t\t\t\t} else {\n\t\t\t\t\tif (TextUtils.isEmpty(url)) {\n\t\t\t\t\t\tmUIManager.loadHomePage(id, false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmUIManager.loadUrl(id, url, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/OpenTabExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.OpenTabAction;\n\nimport android.text.TextUtils;\n\npublic class OpenTabExecutor extends BaseActionExecutor {\n\n\tprivate OpenTabAction mAddonAction;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (OpenTabAction) addonAction;\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\tString url = mAddonAction.getUrl();\n\t\t\n\t\tif (TextUtils.isEmpty(url)) {\n\t\t\tmUIManager.addTab(true, false);\n\t\t} else {\n\t\t\tmUIManager.addTab(url, false, false);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/ShowDialogExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.ShowDialogAction;\nimport org.tint.utils.ApplicationUtils;\n\npublic class ShowDialogExecutor extends BaseActionExecutor {\n\n\tprivate ShowDialogAction mAddonAction;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (ShowDialogAction) addonAction;\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\tApplicationUtils.showMessageDialog(mContext, mAddonAction.getTitle(), mAddonAction.getMessage());\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/ShowToastExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.ShowToastAction;\nimport android.widget.Toast;\n\npublic class ShowToastExecutor extends BaseActionExecutor {\n\n\tprivate ShowToastAction mAddonAction;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (ShowToastAction) addonAction;\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\tToast.makeText(mContext, mAddonAction.getMessage(), mAddonAction.getLength()).show();\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/addons/executors/TabActionExecutor.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.addons.executors;\n\nimport java.util.UUID;\n\nimport org.tint.addons.framework.Action;\nimport org.tint.addons.framework.TabAction;\nimport org.tint.ui.components.CustomWebView;\n\nimport android.text.TextUtils;\n\npublic class TabActionExecutor extends BaseActionExecutor {\n\n\tprivate TabAction mAddonAction;\n\t\n\t@Override\n\tprotected void finishInit(Action addonAction) {\n\t\tmAddonAction = (TabAction) addonAction;\n\t}\n\n\t@Override\n\tprotected void internalExecute() {\n\t\tString tabId = mAddonAction.getTabId();\n\t\t\n\t\tUUID id;\n\t\tCustomWebView webView;\n\t\t\n\t\t// If we do not have a tab id, use the current WebView.\n\t\t// Else, check if provided id is valid, and get the associated WebView.\n\t\t// If the provided id is not valid, or does not correspond to a currently opened tab,\n\t\t// webView will be null, and no action will be performed.\n\t\tif (!TextUtils.isEmpty(tabId)) {\n\t\t\ttry {\n\t\t\t\tid = UUID.fromString(tabId);\n\t\t\t\twebView = mUIManager.getWebViewByTabId(id);\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\tid = null;\n\t\t\t\twebView = null;\n\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\tid = null;\n\t\t\t\twebView = null;\n\t\t\t}\n\t\t} else {\n\t\t\tid = null;\n\t\t\twebView = mWebView;\n\t\t}\n\t\t\n\t\tswitch (mAddonAction.getAction()) {\n\t\tcase Action.ACTION_CLOSE_TAB:\n\t\t\tif (TextUtils.isEmpty(tabId)) {\n\t\t\t\tmUIManager.closeCurrentTab();\n\t\t\t} else {\n\t\t\t\tmUIManager.closeTab(id);\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase Action.ACTION_BROWSE_STOP:\n\t\t\tif (webView != null) {\n\t\t\t\twebView.stopLoading();\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase Action.ACTION_BROWSE_RELOAD:\n\t\t\tif (webView != null) {\n\t\t\t\twebView.reload();\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase Action.ACTION_BROWSE_FORWARD:\t\t\t\n\t\t\tif ((webView != null) &&\n\t\t\t\t\t(webView.canGoForward())) {\n\t\t\t\twebView.goForward();\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase Action.ACTION_BROWSE_BACK:\n\t\t\tif ((webView != null) &&\n\t\t\t\t\t(webView.canGoBack())) {\n\t\t\t\twebView.goBack();\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tdefault: break;\n\t\t}\n\t}\t\n\n}\n"
  },
  {
    "path": "src/org/tint/controllers/Controller.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.controllers;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.tint.addons.AddonManager;\nimport org.tint.model.DownloadItem;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.managers.UIManager;\n\npublic class Controller { \n\t\n\t/**\n\t * Holder for singleton implementation.\n\t */\n\tprivate static final class ControllerHolder {\n\t\tprivate static final Controller INSTANCE = new Controller();\n\t\t/**\n\t\t * Private Constructor.\n\t\t */\n\t\tprivate ControllerHolder() { }\n\t}\n\t\n\t/**\n\t * Get the unique instance of the Controller.\n\t * @return The instance of the Controller\n\t */\n\tpublic static Controller getInstance() {\n\t\treturn ControllerHolder.INSTANCE;\n\t}\n\t\n\t/**\n\t * Private Constructor.\n\t */\n\tprivate Controller() {\n\t\tmDownloads = new ArrayList<DownloadItem>();\n\t}\n\t\n\tprivate UIManager mUIManager;\n\tprivate TintBrowserActivity mMainActivity;\n\t\n\tprivate List<DownloadItem> mDownloads;\n\t\n\tprivate AddonManager mAddonManager;\n\t\n\tpublic void init(UIManager uiManager, TintBrowserActivity activity) {\n\t\tmUIManager = uiManager;\n\t\tmMainActivity = activity;\n\t\tmAddonManager = new AddonManager(mMainActivity, mUIManager);\n\t}\n\t\n\tpublic UIManager getUIManager() {\n\t\treturn mUIManager;\n\t}\n\t\n\tpublic TintBrowserActivity getMainActivity() {\n\t\treturn mMainActivity;\n\t}\n\n\tpublic List<DownloadItem> getDownloadsList() {\n\t\treturn mDownloads;\n\t}\n\t\n\tpublic DownloadItem getDownloadItemById(long id) {\n\t\tfor (DownloadItem item : mDownloads) {\n\t\t\tif (item.getId() == id) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic AddonManager getAddonManager() {\n\t\treturn mAddonManager;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/model/BookmarkHistoryItem.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\n\n/**\n * Represent an history element.\n */\npublic class BookmarkHistoryItem {\n\t\n\tprivate long mId;\n\tprivate String mTitle;\n\tprivate String mUrl;\n\tprivate boolean mIsBookmark;\n\tprivate boolean mIsFolder;\n\tprivate long mFolderId;\n\tprivate Bitmap mFavicon;\n\n\t/**\n\t * Constructor.\n\t * @param id The element id.\n\t * @param title The title.\n\t * @param url The url.\n\t * @param isBookmark True if this item is also a bookmark.\n\t * @param faviconData The favicon.\n\t */\n\tpublic BookmarkHistoryItem(long id, String title, String url, boolean isBookmark, boolean isFolder, long folderId, byte[] faviconData) {\n\t\tmId = id;\n\t\tmTitle = title;\n\t\tmUrl = url;\n\t\tmIsBookmark = isBookmark;\n\t\tmIsFolder = isFolder;\n\t\tmFolderId = folderId;\n\t\t\n\t\tif (faviconData != null) {\n\t\t\tmFavicon = BitmapFactory.decodeByteArray(faviconData, 0, faviconData.length);\n\t\t} else {\n\t\t\tmFavicon = null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the id.\n\t * @return The id.\n\t */\n\tpublic long getId() {\n\t\treturn mId;\n\t}\n\n\t/**\n\t * Get the title.\n\t * @return The title.\n\t */\n\tpublic String getTitle() {\n\t\treturn mTitle;\n\t}\n\n\t/**\n\t * Get the url.\n\t * @return The url.\n\t */\n\tpublic String getUrl() {\n\t\treturn mUrl;\n\t}\n\t\n\tpublic boolean isBookmark() {\n\t\treturn mIsBookmark;\n\t}\n\t\n\tpublic boolean isFolder() {\n\t\treturn mIsFolder;\n\t}\n\t\n\tpublic long getFolderId() {\n\t\treturn mFolderId;\n\t}\n\t\n\t/**\n\t * Get the favicon.\n\t * @return The favicon.\n\t */\n\tpublic Bitmap getFavicon() {\n\t\treturn mFavicon;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/model/BookmarksAdapter.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport org.tint.R;\nimport org.tint.providers.BookmarksProvider;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.graphics.BitmapFactory;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.SimpleCursorAdapter;\nimport android.widget.TextView;\n\npublic class BookmarksAdapter extends SimpleCursorAdapter {\n\t\n\tprivate int mDefaultThumbnailId;\n\t\n\tpublic BookmarksAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags, int defaultThumbnailId) {\n\t\tsuper(context, layout, c, from, to, flags);\n\t\t\n\t\tmDefaultThumbnailId = defaultThumbnailId;\n\t}\n\t\n\t@Override\n\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\tView superView = super.getView(position, convertView, parent);\n\t\t\t\t\n\t\tImageView thumbnailView = (ImageView) superView.findViewById(R.id.BookmarkRow_Thumbnail);\n\t\t\n\t\tboolean isFolder = getCursor().getInt(getCursor().getColumnIndex(BookmarksProvider.Columns.IS_FOLDER)) > 0 ? true : false;\n\t\t\n\t\tif (!isFolder) {\t\t\t\n\t\t\tbyte[] thumbnail = getCursor().getBlob(getCursor().getColumnIndex(BookmarksProvider.Columns.THUMBNAIL));\n\t\t\tif (thumbnail != null) {\n\t\t\t\tthumbnailView.setImageBitmap(BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length));\n\t\t\t} else {\n\t\t\t\tthumbnailView.setImageResource(mDefaultThumbnailId);\n\t\t\t}\n\t\t} else {\n\t\t\tTextView tv = (TextView) superView.findViewById(R.id.BookmarkRow_Url);\n\t\t\tif (tv != null) {\n\t\t\t\ttv.setText(R.string.Folder);\n\t\t\t}\n\t\t\t\n\t\t\tthumbnailView.setImageResource(R.drawable.ic_folder);\n\t\t}\n\t\t\n\t\treturn superView;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/model/DownloadItem.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport android.app.DownloadManager.Request;\nimport android.net.Uri;\nimport android.os.Environment;\n\npublic class DownloadItem extends Request {\n\t\n\tprivate long mId;\n\tprivate String mUrl;\n\tprivate String mFileName;\n\tprivate Boolean mIncognito;\n\t\n\tpublic DownloadItem(String url) {\n\t\tsuper(Uri.parse(url));\n\t\tmUrl = url;\n\t\tmFileName = mUrl.substring(url.lastIndexOf(\"/\") + 1);\n\t\t\n\t\tsetTitle(mFileName);\n\t\tsetDescription(mUrl);\n\t\tsetDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, mFileName);\n\t}\n\t\n\tpublic long getId() {\n\t\treturn mId;\n\t}\n\t\n\tpublic void setId(long value) {\n\t\tmId = value;\n\t}\n\t\n\tpublic void setFilename(String filename) {\n\t\tmFileName = filename;\n\t\tsetTitle(filename);\n\t\tsetDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);\n\t}\n\t\n\tpublic void setIncognito(Boolean incognito) {\n\t\tmIncognito = incognito;\n\t\tsetVisibleInDownloadsUi(!incognito);\n\t}\n\t\n\tpublic Boolean isIncognito() {\n\t\treturn mIncognito;\n\t}\n\t\n\tpublic String getFileName() {\n\t\treturn mFileName;\n\t}\n\t\n\tpublic String getUrl() {\n\t\treturn mUrl;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/model/FolderItem.java",
    "content": "/*\r\n * Tint Browser for Android\r\n * \r\n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License\r\n * version 3 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n */\r\n\r\npackage org.tint.model;\r\n\r\npublic class FolderItem {\r\n\t\r\n\tprivate long mId;\r\n\tprivate String mTitle;\r\n\t\r\n\tpublic FolderItem(long id, String title) {\r\n\t\tmId = id;\r\n\t\tmTitle = title;\r\n\t}\r\n\t\r\n\tpublic long getId() {\r\n\t\treturn mId;\r\n\t}\r\n\t\r\n\tpublic String getTitle() {\r\n\t\treturn mTitle;\r\n\t}\r\n\r\n}\r\n"
  },
  {
    "path": "src/org/tint/model/HistoryAdapter.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport org.tint.R;\nimport org.tint.providers.BookmarksProvider;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.DateSorter;\nimport android.widget.BaseExpandableListAdapter;\nimport android.widget.CheckBox;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.CompoundButton.OnCheckedChangeListener;\n\n/**\n * Custom adapter for displaying history, splitted in bins.\n * Adapted from:\n * https://github.com/CyanogenMod/android_packages_apps_Browser/blob/gingerbread/src/com/android/browser/BrowserHistoryPage.java\n * http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/2.2_r1.1/com/android/browser/DateSortedExpandableListAdapter.java/?v=source\n */\npublic class HistoryAdapter extends BaseExpandableListAdapter {\n\t\n\tprivate LayoutInflater mInflater = null;\n\t\n\tprivate int[] mItemMap;\n\tprivate int mNumberOfBins;\n\tprivate DateSorter mDateSorter;\n\tprivate int mIdIndex;\n\t\n\tprivate Context mContext;\n\tprivate Cursor mCursor;\n\t\n\tprivate int mDateIndex;\n\t\n\tprivate int mFaviconSize;\n\t\n\tprivate OnCheckedChangeListener mBookmarkStarChangeListener;\n\t\n\t/**\n\t * Constructor.\n\t * @param context The current context.\n\t * @param cursor The data cursor.\n\t * @param dateIndex The date index ?\n\t */\n\tpublic HistoryAdapter(Context context, OnCheckedChangeListener bookmarksChangeListener, int faviconSize) {\n\t\tmContext = context;\n\t\tmBookmarkStarChangeListener = bookmarksChangeListener;\n\t\tmCursor = null;\n\t\tmDateIndex = -1;\n\t\tmFaviconSize = faviconSize;\n\t\t\n\t\tmDateSorter = new DateSorter(mContext);\n\t\t\n\t\tmInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t}\n\t\n\tpublic void changeCursor(Cursor cursor) {\n\t\tif (mCursor == cursor) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tmCursor = cursor;\n\t\t\n\t\tif (mCursor != null) {\n\t\t\tmIdIndex = mCursor.getColumnIndexOrThrow(BookmarksProvider.Columns._ID);\n\t\t\tmDateIndex = mCursor.getColumnIndexOrThrow(BookmarksProvider.Columns.VISITED_DATE);\n\t\t\t\n\t\t\tbuildMap();\n\t\t\t\n\t\t\tnotifyDataSetChanged();\n\t\t} else {\n\t\t\tmIdIndex = -1;\n\t\t\tmDateIndex = -1;\n\t\t\t\n\t\t\tnotifyDataSetInvalidated();\n\t\t}\n\t}\n\t\n\t/**\n\t * Get a long-typed data from mCursor.\n\t * @param cursorIndex The column index.\n\t * @return The long data.\n\t */\n\tprivate long getLong(int cursorIndex) {\n        return mCursor.getLong(cursorIndex);\n    }\n\t\n\t/**\n\t * Split the data in the cursor into several \"bins\": today, yesterday, last 7 days, last month, older.\n\t */\n\tprivate void buildMap() {\n\t\tint[] array = new int[DateSorter.DAY_COUNT];\n        // Zero out the array.\n        for (int j = 0; j < DateSorter.DAY_COUNT; j++) {\n            array[j] = 0;\n        }\n        \n        mNumberOfBins = 0;\n        int dateIndex = -1;\n        if (mCursor.moveToFirst() && mCursor.getCount() > 0) {\n            while (!mCursor.isAfterLast()) {\n                long date = getLong(mDateIndex);\n                int index = mDateSorter.getIndex(date);\n                if (index > dateIndex) {\n                    mNumberOfBins++;\n                    if (index == DateSorter.DAY_COUNT - 1) {\n                        // We are already in the last bin, so it will\n                        // include all the remaining items\n                        array[index] = mCursor.getCount()\n                                - mCursor.getPosition();\n                        break;\n                    }\n                    dateIndex = index;\n                }\n                array[dateIndex]++;\n                mCursor.moveToNext();\n            }\n        }\n        \n        mItemMap = array;\n\t}\n\t\n\t/**\n     * Translates from a group position in the ExpandableList to a bin.  This is\n     * necessary because some groups have no history items, so we do not include\n     * those in the ExpandableList.\n     * @param groupPosition Position in the ExpandableList's set of groups\n     * @return The corresponding bin that holds that group.\n     */\n    private int groupPositionToBin(int groupPosition) {\n        if (groupPosition < 0 || groupPosition >= DateSorter.DAY_COUNT) {\n            throw new AssertionError(\"group position out of range\");\n        }\n        \n        if (DateSorter.DAY_COUNT == mNumberOfBins || 0 == mNumberOfBins) {\n            // In the first case, we have exactly the same number of bins\n            // as our maximum possible, so there is no need to do a\n            // conversion\n            // The second statement is in case this method gets called when\n            // the array is empty, in which case the provided groupPosition\n            // will do fine.\n            return groupPosition;\n        }\n        \n        int arrayPosition = -1;\n        while (groupPosition > -1) {\n            arrayPosition++;\n            if (mItemMap[arrayPosition] != 0) {\n                groupPosition--;\n            }\n        }\n        \n        return arrayPosition;\n    }\n    \n    /**\n     * Move the cursor to the record corresponding to the given group position and child position. \n     * @param groupPosition The group position.\n     * @param childPosition The child position.\n     * @return True if the move has succeeded.\n     */\n\tprivate boolean moveCursorToChildPosition(int groupPosition, int childPosition) {\n        if (mCursor.isClosed()) {\n        \treturn false;\n        }\n        \n        groupPosition = groupPositionToBin(groupPosition);\n        int index = childPosition;\n        for (int i = 0; i < groupPosition; i++) {\n            index += mItemMap[i];\n        }\n        \n        return mCursor.moveToPosition(index);\n    }\n\t\n\t/**\n\t * Create a new child view.\n\t * @return The created view.\n\t */\n\tprivate View getCustomChildView() {\t\t\n\t\treturn mInflater.inflate(R.layout.history_row, null, false);\n\t}\n\n\t@Override\n\tpublic Object getChild(int groupPosition, int childPosition) {\n\t\tmoveCursorToChildPosition(groupPosition, childPosition);\n\n\t\treturn new BookmarkHistoryItem(mCursor.getLong(mCursor.getColumnIndex(BookmarksProvider.Columns._ID)),\n\t\t\t\tmCursor.getString(mCursor.getColumnIndex(BookmarksProvider.Columns.TITLE)),\n\t\t\t\tmCursor.getString(mCursor.getColumnIndex(BookmarksProvider.Columns.URL)),\n\t\t\t\tmCursor.getInt(mCursor.getColumnIndex(BookmarksProvider.Columns.BOOKMARK)) >= 1 ? true : false,\n\t\t\t\tmCursor.getInt(mCursor.getColumnIndex(BookmarksProvider.Columns.IS_FOLDER)) >= 1 ? true : false,\n\t\t\t\tmCursor.getLong(mCursor.getColumnIndex(BookmarksProvider.Columns.PARENT_FOLDER_ID)),\n\t\t\t\tmCursor.getBlob(mCursor.getColumnIndex(BookmarksProvider.Columns.FAVICON)));\n\t}\n\n\t@Override\n\tpublic long getChildId(int groupPosition, int childPosition) {\n\t\tif (moveCursorToChildPosition(groupPosition, childPosition)) {\n            return getLong(mIdIndex);\n        }\n\t\t\n        return 0;\n\t}\n\n\t@Override\n\tpublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {\n\t\tView view = getCustomChildView();\n        \n\t\tTextView titleView = (TextView) view.findViewById(R.id.HistoryRow_Title);\n\t\t\n\t\tBookmarkHistoryItem item = (BookmarkHistoryItem) getChild(groupPosition, childPosition);\n\t\ttitleView.setText(item.getTitle());\n\t\t\n\t\tTextView urlView = (TextView) view.findViewById(R.id.HistoryRow_Url);\t\t \t\t\t\t\t\n\t\turlView.setText(item.getUrl());\n\t\t\n\t\tCheckBox bookmarkStar = (CheckBox) view.findViewById(R.id.HistoryRow_BookmarkStar);\n\t\t\n\t\tbookmarkStar.setTag(item.getId());\n\t\t\n\t\tbookmarkStar.setOnCheckedChangeListener(null);\n\t\tbookmarkStar.setChecked(item.isBookmark());\n\t\tbookmarkStar.setOnCheckedChangeListener(mBookmarkStarChangeListener);\n\t\t\n\t\tImageView faviconView = (ImageView) view.findViewById(R.id.HistoryRow_Thumbnail);\n\t\tBitmap favicon = item.getFavicon();\n\t\tif (favicon != null) {\n\t\t\tBitmapDrawable icon = new BitmapDrawable(view.getResources(), favicon);\n\t\t\t\n\t\t\tBitmap bm = Bitmap.createBitmap(mFaviconSize, mFaviconSize, Bitmap.Config.ARGB_8888);\n\t\t\tCanvas canvas = new Canvas(bm);\n\t\t\t\n\t\t\ticon.setBounds(0, 0, mFaviconSize, mFaviconSize);\n\t\t\ticon.draw(canvas);\n\t\t\t\n\t\t\tfaviconView.setImageBitmap(bm);\n\t\t} else {\n\t\t\tfaviconView.setImageResource(R.drawable.app_web_browser_sm);\n\t\t}\n        \n        return view;\n\t}\n\n\t@Override\n\tpublic int getChildrenCount(int groupPosition) {\n\t\tif (mItemMap != null) {\n\t\t\treturn mItemMap[groupPositionToBin(groupPosition)];\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t@Override\n\tpublic Object getGroup(int groupPosition) {\n\t\tint binIndex = groupPositionToBin(groupPosition);\n\t\t\n\t\tswitch (binIndex) {\n\t\tcase 0: return mContext.getResources().getString(R.string.HistoryToday);\n\t\tcase 1: return mContext.getResources().getString(R.string.HistoryYesterday);\n\t\tcase 2: return mContext.getResources().getString(R.string.HistoryLastSevenDays);\n\t\tcase 3: return mContext.getResources().getString(R.string.HistoryLastMonth);\n\t\tdefault: return mContext.getResources().getString(R.string.HistoryOlder);\n\t\t}\n\t}\n\n\t@Override\n\tpublic int getGroupCount() {\n\t\treturn mNumberOfBins;\n\t}\n\n\t@Override\n\tpublic long getGroupId(int groupPosition) {\n\t\treturn groupPosition;\n\t}\n\n\t@Override\n\tpublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {\t\t\n        \n        TextView item;\n        if ((convertView == null) ||\n        \t\t(!(convertView instanceof TextView))) {\n        \tLayoutInflater factory = LayoutInflater.from(mContext);\n        \titem = (TextView) factory.inflate(R.layout.expandable_list_header, null);\n        } else {\n        \titem = (TextView) convertView;\n        }\n        \n        item.setText(getGroup(groupPosition).toString());\n        \n        return item;\n\t}\n\n\t@Override\n\tpublic boolean hasStableIds() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean isChildSelectable(int groupPosition, int childPosition) {\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/model/SearchUrlAdapter.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport java.util.List;\n\nimport org.tint.R;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseExpandableListAdapter;\nimport android.widget.TextView;\n\npublic class SearchUrlAdapter extends BaseExpandableListAdapter {\n\n\tprivate Context mContext;\n\tprivate List<SearchUrlGroup> mData;\n\t\n\tpublic SearchUrlAdapter(Context context, List<SearchUrlGroup> data) {\n\t\tmContext = context;\n\t\tmData = data;\n\t}\n\t\n\t@Override\n\tpublic Object getChild(int groupPosition, int childPosition) {\n\t\treturn mData.get(groupPosition).getItems().get(childPosition);\n\t}\n\n\t@Override\n\tpublic long getChildId(int groupPosition, int childPosition) {\n\t\treturn mData.get(groupPosition).getItems().get(childPosition).hashCode();\n\t}\n\n\t@Override\n\tpublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {\n\t\tTextView item;\n        if ((convertView == null) ||\n        \t\t(!(convertView instanceof TextView))) {\n        \tLayoutInflater inflater = LayoutInflater.from(mContext);\n        \titem = (TextView) inflater.inflate(R.layout.expandable_list_item, null);\n        } else {\n        \titem = (TextView) convertView;\n        }\n        \n        item.setText(((SearchUrlItem) getChild(groupPosition, childPosition)).getName());\n\t\t\n\t\treturn item;\n\t}\n\n\t@Override\n\tpublic int getChildrenCount(int groupPosition) {\t\t\n\t\treturn mData.get(groupPosition).getItems().size();\n\t}\n\n\t@Override\n\tpublic Object getGroup(int groupPosition) {\n\t\treturn mData.get(groupPosition);\n\t}\n\n\t@Override\n\tpublic int getGroupCount() {\n\t\treturn mData.size();\n\t}\n\n\t@Override\n\tpublic long getGroupId(int groupPosition) {\n\t\treturn mData.get(groupPosition).hashCode();\n\t}\n\n\t@Override\n\tpublic View getGroupView(int groupPosition, boolean isExpanded,\tView convertView, ViewGroup parent) {\n\t\tTextView item;\n        if ((convertView == null) ||\n        \t\t(!(convertView instanceof TextView))) {\n        \tLayoutInflater factory = LayoutInflater.from(mContext);\n        \titem = (TextView) factory.inflate(R.layout.expandable_list_header, null);\n        } else {\n        \titem = (TextView) convertView;\n        }\n        \n        item.setText(((SearchUrlGroup) getGroup(groupPosition)).getName());\n        \n        return item;\n\t}\n\n\t@Override\n\tpublic boolean hasStableIds() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean isChildSelectable(int groupPosition, int childPosition) {\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/model/SearchUrlGroup.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\npublic class SearchUrlGroup {\n\t\n\tprivate String mName;\n\tprivate List<SearchUrlItem> mItems;\n\t\n\tpublic SearchUrlGroup(String name) {\n\t\tmName = name;\n\t\tmItems = new ArrayList<SearchUrlItem>();\n\t}\t\n\t\n\tpublic String getName() {\n\t\treturn mName;\n\t}\n\t\n\tpublic List<SearchUrlItem> getItems() {\n\t\treturn mItems;\n\t}\n\t\n\tpublic void addItem(String name, String url) {\n\t\tmItems.add(new SearchUrlItem(name, url));\n\t}\n\t\n\tpublic void sort() {\n\t\tCollections.sort(mItems, new Comparator<SearchUrlItem>() {\n\t\t\t@Override\n\t\t\tpublic int compare(SearchUrlItem lhs, SearchUrlItem rhs) {\t\t\t\t\t\t\n\t\t\t\treturn lhs.getName().compareTo(rhs.getName());\n\t\t\t}\t\t        \t\n        });\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/model/SearchUrlItem.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\npublic class SearchUrlItem {\n\t\n\tprivate String mName;\n\tprivate String mUrl;\n\t\n\tpublic SearchUrlItem(String name, String url) {\n\t\tmName = name;\n\t\tmUrl = url;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn mName;\n\t}\n\t\n\tpublic String getUrl() {\n\t\treturn mUrl;\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/model/UrlSuggestionCursorAdapter.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.model;\n\nimport org.tint.R;\nimport org.tint.providers.BookmarksProvider;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.SimpleCursorAdapter;\n\n/**\n * Adapter for suggestions.\n */\npublic class UrlSuggestionCursorAdapter extends SimpleCursorAdapter {\n\t\n\tpublic interface QueryBuilderListener {\n\t\tpublic void onSuggestionSelected(String url);\n\t}\n\t\n\tprivate QueryBuilderListener mQueryBuilderListener = null;\n\t\n\t/**\n\t * Constructor.\n\t * @param context The context.\n\t * @param layout The layout.\n\t * @param c The Cursor. \n\t * @param from Input array.\n\t * @param to Output array.\n\t */\n\tpublic UrlSuggestionCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags, QueryBuilderListener listener) {\t\t\n\t\tsuper(context, layout, c, from, to, flags);\n\t\tmQueryBuilderListener = listener;\n\t}\n\t\n\t@Override\n\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\n\t\tView superView = super.getView(position, convertView, parent);\t\t\n\t\t\n\t\tImageView iconView = (ImageView) superView.findViewById(R.id.AutocompleteImageView);\n\n\t\tint resultType = getCursor().getInt(getCursor().getColumnIndex(BookmarksProvider.Columns.BOOKMARK));\n\t\t\n\t\tswitch (resultType) {\n\t\tcase 0: iconView.setImageResource(R.drawable.ic_search_category_history); break;\n\t\tdefault: iconView.setImageResource(R.drawable.ic_search_category_bookmark); break;\n\t\t}\n\t\t\n\t\tfinal String url = getCursor().getString(getCursor().getColumnIndex(BookmarksProvider.Columns.URL));\n\t\t\n\t\tImageView queryBuilderView = (ImageView) superView.findViewById(R.id.AutoCompleteQueryBuilder);\n\t\tqueryBuilderView.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mQueryBuilderListener != null) {\n\t\t\t\t\tmQueryBuilderListener.onSuggestionSelected(url);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn superView;\n\t}\n\t\n\t\n\n}\n"
  },
  {
    "path": "src/org/tint/providers/BookmarksProvider.java",
    "content": "/*\r\n * Tint Browser for Android\r\n * \r\n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License\r\n * version 3 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n */\r\n\r\npackage org.tint.providers;\r\n\r\nimport android.content.ContentProvider;\r\nimport android.content.ContentUris;\r\nimport android.content.ContentValues;\r\nimport android.content.Context;\r\nimport android.content.UriMatcher;\r\nimport android.database.Cursor;\r\nimport android.database.SQLException;\r\nimport android.database.sqlite.SQLiteDatabase;\r\nimport android.database.sqlite.SQLiteOpenHelper;\r\nimport android.database.sqlite.SQLiteQueryBuilder;\r\nimport android.database.sqlite.SQLiteStatement;\r\nimport android.net.Uri;\r\nimport android.text.TextUtils;\r\n\r\npublic class BookmarksProvider extends ContentProvider {\t\r\n\t\r\n\tpublic static final String AUTHORITY = \"org.tint.providers.bookmarksprovider\";\r\n\t\r\n\tprivate static final String BOOKMARKS_TABLE = \"bookmarks\";\r\n\t\r\n\tpublic static final String CONTENT_TYPE = \"vnd.android.cursor.dir/vnd.tint.bookmarks\";\r\n\tpublic static final String CONTENT_ITEM_TYPE = \"vnd.android.cursor.item/vnd.tint.bookmarks\";\r\n\t\r\n\tpublic static final Uri BOOKMARKS_URI = Uri.parse(\"content://\" + AUTHORITY + \"/\" + BOOKMARKS_TABLE);\r\n\t\r\n\tpublic static class Columns {\r\n\t\tpublic static final String _ID = \"_id\";\r\n\t\tpublic static final String TITLE = \"title\";\r\n\t\tpublic static final String URL = \"url\";\r\n\t\tpublic static final String CREATION_DATE = \"creation_date\";\r\n\t\tpublic static final String VISITED_DATE = \"visited_date\";\r\n\t\tpublic static final String VISITS = \"visits\";\r\n\t\tpublic static final String BOOKMARK = \"bookmark\";\r\n\t\tpublic static final String IS_FOLDER = \"is_folder\";\r\n\t\tpublic static final String PARENT_FOLDER_ID = \"parent_folder_id\";\r\n\t\tpublic static final String FAVICON = \"favicon\";\r\n\t\tpublic static final String THUMBNAIL = \"thumbnail\";\r\n\t}\r\n\t\r\n\tprivate static final int DATABASE_VERSION = 2;\r\n\tprivate static final String DATABASE_NAME = \"bookmarks.db\";\r\n\t\r\n\tprivate static final String BOOKMARKS_TABLE_CREATE = \"CREATE TABLE \" + BOOKMARKS_TABLE + \" (\" + \r\n\t\tColumns._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT, \" +\r\n\t\tColumns.TITLE + \" TEXT, \" +\r\n\t\tColumns.URL + \" TEXT, \" +\r\n\t\tColumns.VISITS + \" INTEGER, \" +\r\n\t\tColumns.CREATION_DATE + \" LONG, \" +\r\n\t\tColumns.VISITED_DATE + \" LONG, \" +\r\n\t\tColumns.BOOKMARK + \" INTEGER, \" +\r\n\t\tColumns.IS_FOLDER + \" INTEGER NOT NULL DEFAULT 0, \" +\r\n\t\tColumns.PARENT_FOLDER_ID + \" INTEGER NOT NULL DEFAULT -1, \" +\r\n\t\tColumns.FAVICON + \" BLOB DEFAULT NULL, \" + \r\n\t\tColumns.THUMBNAIL + \" BLOB DEFAULT NULL);\";\r\n\t\r\n\tprivate static final int BOOKMARKS = 1;\r\n\tprivate static final int BOOKMARKS_BY_ID = 2;\r\n\t\r\n\tprivate static final UriMatcher sUriMatcher;\r\n\t\r\n\tprivate SQLiteDatabase mDb;\r\n\tprivate DatabaseHelper mDbHelper;\r\n\t\r\n\tprivate boolean mNotifyChanges;\r\n\t\r\n\tprivate Context mContext;\r\n\t\r\n\tstatic {\r\n\t\tsUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);\r\n\t\tsUriMatcher.addURI(AUTHORITY, BOOKMARKS_TABLE, BOOKMARKS);\r\n\t\tsUriMatcher.addURI(AUTHORITY, BOOKMARKS_TABLE + \"/#\", BOOKMARKS_BY_ID);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic boolean onCreate() {\t\t\r\n\t\tmContext = getContext();\r\n\t\tmDbHelper = new DatabaseHelper(mContext);\r\n\t\tmDb = mDbHelper.getWritableDatabase();\r\n\t\tmNotifyChanges = true;\r\n\t\t\r\n\t\treturn true;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int delete(Uri uri, String whereClause, String[] whereArgs) {\r\n\t\tint count = 0;\r\n\t\t\r\n\t\tswitch (sUriMatcher.match(uri)) {\r\n\t\tcase BOOKMARKS:\r\n\t\t\tcount = mDb.delete(BOOKMARKS_TABLE, whereClause, whereArgs);\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\r\n\t\t}\t\t\r\n\t\t\r\n\t\tif ((mNotifyChanges) &&\r\n\t\t\t\t(count > 0)) {\r\n\t\t\tmContext.getContentResolver().notifyChange(uri, null);\r\n\t\t}\r\n\t\t\r\n\t\treturn count;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String getType(Uri uri) {\r\n\t\tswitch (sUriMatcher.match(uri)) {\r\n\t\tcase BOOKMARKS:\r\n\t\t\treturn CONTENT_TYPE;\r\n\t\tcase BOOKMARKS_BY_ID:\r\n\t\t\treturn CONTENT_ITEM_TYPE;\r\n\r\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\r\n\t\t}\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Uri insert(Uri uri, ContentValues values) {\r\n\t\tswitch (sUriMatcher.match(uri)) {\r\n\t\tcase BOOKMARKS:\r\n\t\t\tlong rowId = mDb.insert(BOOKMARKS_TABLE, null, values);\r\n\t\t\tif (rowId > 0) {\r\n\t\t\t\tUri rowUri = ContentUris.withAppendedId(BOOKMARKS_URI, rowId);\r\n\t\t\t\t\r\n\t\t\t\tif (mNotifyChanges) {\r\n\t\t\t\t\tmContext.getContentResolver().notifyChange(rowUri, null);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\treturn rowUri;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthrow new SQLException(\"Failed to insert row into \" + uri);\r\n\t\t\t\r\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\r\n\t\t}\r\n\t}\r\n\r\n\t@Override\r\n\tpublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {\r\n\t\tSQLiteQueryBuilder qb = new SQLiteQueryBuilder();\r\n\t\t\r\n\t\tswitch (sUriMatcher.match(uri)) {\r\n\t\tcase BOOKMARKS:\r\n\t\t\tqb.setTables(BOOKMARKS_TABLE);\t\t\t\r\n\t\t\tbreak;\r\n\t\tcase BOOKMARKS_BY_ID:\r\n\t\t\tqb.setTables(BOOKMARKS_TABLE);\r\n\t\t\tqb.appendWhere(Columns._ID + \" = \" + uri.getPathSegments().get(1));\r\n\t\t\tbreak;\t\t\r\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\r\n\t\t}\r\n\t\t\r\n\t\tCursor c = qb.query(mDb, projection, selection, selectionArgs, null, null, sortOrder);\r\n\t\tc.setNotificationUri(getContext().getContentResolver(), uri);\r\n\t\t\r\n\t\treturn c;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {\r\n\t\tint count = 0;\r\n\t\tswitch (sUriMatcher.match(uri)) {\r\n\t\tcase BOOKMARKS:\r\n\t\t\tcount = mDb.update(BOOKMARKS_TABLE, values, selection, selectionArgs);\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\r\n\t\t}\r\n\t\t\t\t\t\t\r\n\t\tif ((mNotifyChanges) &&\r\n\t\t\t\t(count > 0)) {\r\n\t\t\tmContext.getContentResolver().notifyChange(uri, null);\r\n\t\t}\r\n\t\t\r\n\t\treturn count;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic int bulkInsert(Uri uri, ContentValues[] values) {\r\n\t\tswitch (sUriMatcher.match(uri)) {\r\n\t\tcase BOOKMARKS:\r\n\t\t\tint numInserted = 0;\r\n\t\t\t\r\n\t\t\tmDb.beginTransaction();\r\n\t\t\t\r\n\t\t\ttry {\r\n\t\t\t\t\r\n\t\t\t\tSQLiteStatement insert = mDb.compileStatement(\r\n\t\t\t\t\t\t\"INSERT INTO \" + BOOKMARKS_TABLE + \"(\" +\r\n\t\t\t\t\t\tColumns.TITLE + \", \" + \r\n\t\t\t\t\t\tColumns.URL + \", \" +\r\n\t\t\t\t\t\tColumns.VISITS + \", \" + \r\n\t\t\t\t\t\tColumns.CREATION_DATE + \", \" +\r\n\t\t\t\t\t\tColumns.VISITED_DATE + \", \" + \r\n\t\t\t\t\t\tColumns.BOOKMARK + \", \" +\r\n\t\t\t\t\t\tColumns.IS_FOLDER + \", \" +\r\n\t\t\t\t\t\tColumns.PARENT_FOLDER_ID + \r\n\t\t\t\t\t\t\") VALUES (?, ?, ?, ?, ?, ?, ?, ?)\");\r\n\t\t\t\t\r\n\t\t\t\tfor (ContentValues value : values) {\r\n\t\t\t\t\t\r\n\t\t\t\t\tString title = value.getAsString(Columns.TITLE);\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (!TextUtils.isEmpty(title)) {\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tString url = value.getAsString(Columns.URL);\r\n\t\t\t\t\t\tString visits = value.getAsString(Columns.VISITS);\r\n\t\t\t\t\t\tString creationDate = value.getAsString(Columns.CREATION_DATE);\r\n\t\t\t\t\t\tString visitedDate = value.getAsString(Columns.VISITED_DATE);\r\n\t\t\t\t\t\tString bookmark = value.getAsString(Columns.BOOKMARK);\r\n\t\t\t\t\t\tString isFolder = value.getAsString(Columns.IS_FOLDER);\r\n\t\t\t\t\t\tString parentFolderId = value.getAsString(Columns.PARENT_FOLDER_ID);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tinsert.bindString(1, title);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(url)) {\r\n\t\t\t\t\t\t\tinsert.bindString(2, url);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindNull(2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(visits)) {\r\n\t\t\t\t\t\t\tinsert.bindString(3, visits);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindNull(3);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(creationDate)) {\r\n\t\t\t\t\t\t\tinsert.bindString(4, creationDate);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindNull(4);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(visitedDate)) {\r\n\t\t\t\t\t\t\tinsert.bindString(5, visitedDate);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindNull(5);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(bookmark)) {\r\n\t\t\t\t\t\t\tinsert.bindString(6, bookmark);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindString(6, \"0\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(isFolder)) {\r\n\t\t\t\t\t\t\tinsert.bindString(7, isFolder);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindString(7, \"0\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (!TextUtils.isEmpty(parentFolderId)) {\r\n\t\t\t\t\t\t\tinsert.bindString(8, parentFolderId);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tinsert.bindString(8, \"-1\");\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tinsert.execute();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tmDb.setTransactionSuccessful();\r\n\t\t\t\t\r\n\t\t\t\tmContext.getContentResolver().notifyChange(uri, null);\r\n\t\t\t\t\r\n\t\t\t\tnumInserted = values.length;\r\n\t\t\t} finally {\r\n\t\t\t\tmDb.endTransaction();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn numInserted;\r\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void setNotifyChanges(boolean value) {\r\n\t\tmNotifyChanges = value;\r\n\t}\r\n\t\r\n\tprivate static class DatabaseHelper extends SQLiteOpenHelper {\r\n\r\n\t\tpublic DatabaseHelper(Context context) {\r\n\t\t\tsuper(context, DATABASE_NAME, null, DATABASE_VERSION);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void onCreate(SQLiteDatabase db) {\r\n\t\t\tdb.execSQL(BOOKMARKS_TABLE_CREATE);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tpublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\r\n\t\t\tswitch (oldVersion) {\r\n\t\t\tcase 1: \r\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + BOOKMARKS_TABLE + \" ADD \" + Columns.IS_FOLDER + \" INTEGER NOT NULL DEFAULT 0;\");\r\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + BOOKMARKS_TABLE + \" ADD \" + Columns.PARENT_FOLDER_ID + \" INTEGER NOT NULL DEFAULT -1;\");\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: break;\r\n\t\t\t}\r\n\t\t}\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/org/tint/providers/BookmarksWrapper.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.providers;\n\nimport java.io.ByteArrayOutputStream;\nimport java.util.ArrayList;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.List;\n\nimport org.tint.model.BookmarkHistoryItem;\nimport org.tint.model.FolderItem;\nimport org.tint.utils.Constants;\n\nimport android.content.ContentResolver;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.CursorLoader;\nimport android.database.Cursor;\nimport android.database.DatabaseUtils;\nimport android.graphics.Bitmap;\nimport android.net.Uri;\nimport android.preference.PreferenceManager;\nimport android.util.Log;\n\npublic class BookmarksWrapper {\t\n\t\n\tpublic static String[] HISTORY_BOOKMARKS_PROJECTION = new String[] {\n\t\tBookmarksProvider.Columns._ID,\n        BookmarksProvider.Columns.TITLE,\n        BookmarksProvider.Columns.URL,\n        BookmarksProvider.Columns.VISITS,\n        BookmarksProvider.Columns.CREATION_DATE,\n        BookmarksProvider.Columns.VISITED_DATE,\n        BookmarksProvider.Columns.BOOKMARK,\n        BookmarksProvider.Columns.IS_FOLDER,\n        BookmarksProvider.Columns.PARENT_FOLDER_ID,\n        BookmarksProvider.Columns.FAVICON,\n        BookmarksProvider.Columns.THUMBNAIL };\n\t\n\tpublic static CursorLoader getCursorLoaderForStartPage(Context context, int limit) {\n\t\tCalendar c = Calendar.getInstance();\n\t\tc.setTime(new Date());          \n\t\tc.set(Calendar.HOUR_OF_DAY, 0);\n\t\tc.set(Calendar.MINUTE, 0);\n\t\tc.set(Calendar.SECOND, 0);\n\t\tc.set(Calendar.MILLISECOND, 0);\n\t\tc.add(Calendar.DAY_OF_YEAR, - 14);\n\t\t\n\t\tString whereClause = BookmarksProvider.Columns.VISITED_DATE + \" > \" + Long.toString(c.getTimeInMillis());\t\n\t\t\n\t\tString orderClause = BookmarksProvider.Columns.VISITS + \" DESC, \" + \n\t\t\t\tBookmarksProvider.Columns.VISITED_DATE + \" DESC LIMIT \" + Integer.toString(limit);\n\t\t\n\t\treturn new CursorLoader(context, BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, orderClause);\n\t}\n\t\n\tpublic static CursorLoader getCursorLoaderForBookmarks(Context context, long parentFolderId) {\n\t\tint sortMode = PreferenceManager.getDefaultSharedPreferences(context).getInt(Constants.PREFERENCE_BOOKMARKS_SORT_MODE, 0);\n\t\t\n\t\tString whereClause = BookmarksProvider.Columns.PARENT_FOLDER_ID + \" = \" + parentFolderId + \" AND (\" + BookmarksProvider.Columns.BOOKMARK + \" = 1 OR \" + BookmarksProvider.Columns.IS_FOLDER + \" = 1)\";\n\t\t\n\t\tString orderClause;\n\t\tswitch (sortMode) {\n\t\tcase 0:\n\t\t\torderClause = BookmarksProvider.Columns.IS_FOLDER + \" DESC, \" + BookmarksProvider.Columns.VISITS + \" DESC, \" + BookmarksProvider.Columns.TITLE + \" COLLATE NOCASE\";\n\t\t\tbreak;\n\t\t\n\t\tcase 1:\n\t\t\torderClause = BookmarksProvider.Columns.IS_FOLDER + \" DESC, \" + BookmarksProvider.Columns.TITLE + \" COLLATE NOCASE, \" + BookmarksProvider.Columns.VISITS + \" DESC\";\n\t\t\tbreak;\n\t\t\t\n\t\tcase 2:\n\t\t\torderClause = BookmarksProvider.Columns.IS_FOLDER + \" DESC, \" + BookmarksProvider.Columns.VISITED_DATE + \" DESC, \" + BookmarksProvider.Columns.TITLE + \" COLLATE NOCASE\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\torderClause = BookmarksProvider.Columns.IS_FOLDER + \" DESC, \" + BookmarksProvider.Columns.VISITS + \" DESC, \" + BookmarksProvider.Columns.TITLE + \" COLLATE NOCASE\";\n\t\t\tbreak;\n\t\t}\t\t\n\t\t\n\t\treturn new CursorLoader(context, BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, orderClause);\n\t}\n\t\n\tpublic static CursorLoader getCursorLoaderForHistory(Context context) {\n\t\tString whereClause = BookmarksProvider.Columns.VISITS + \" > 0 AND \" + BookmarksProvider.Columns.IS_FOLDER + \" = 0\";\n\t\tString orderClause = BookmarksProvider.Columns.VISITED_DATE + \" DESC\";\n\t\t\n\t\treturn new CursorLoader(context, BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, orderClause);\n\t}\n\t\n\tpublic static Cursor getAllHistoryBookmarks(ContentResolver contentResolver) {\n\t\treturn contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, null, null, null);\n\t}\n\t\n\tpublic static BookmarkHistoryItem getBookmarkById(ContentResolver contentResolver, long id) {\n\t\tBookmarkHistoryItem result = null;\n\t\tString whereClause = BookmarksProvider.Columns._ID + \" = \" + id;\n\t\t\n\t\tCursor c = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\t\t\t\t\n\t\t\t\tString title = c.getString(c.getColumnIndex(BookmarksProvider.Columns.TITLE));\n                String url = c.getString(c.getColumnIndex(BookmarksProvider.Columns.URL));\n                boolean isBookmarks = c.getInt(c.getColumnIndex(BookmarksProvider.Columns.BOOKMARK)) > 0 ? true : false;\n                boolean isFolder = c.getInt(c.getColumnIndex(BookmarksProvider.Columns.IS_FOLDER)) > 0 ? true : false;\n                long folderId = c.getLong(c.getColumnIndex(BookmarksProvider.Columns.PARENT_FOLDER_ID));\n                byte[] favIcon = c.getBlob(c.getColumnIndex(BookmarksProvider.Columns.FAVICON));\n                result = new BookmarkHistoryItem(id, title, url, isBookmarks, isFolder, folderId, favIcon);\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * Clear the history/bookmarks table.\n\t * @param contentResolver The content resolver.\n\t * @param clearHistory If true, history items will be cleared.\n\t * @param clearBookmarks If true, bookmarked items will be cleared.\n\t */\n\tpublic static void clearHistoryAndOrBookmarks(ContentResolver contentResolver, boolean clearHistory, boolean clearBookmarks) {\n\t\t\n\t\tif (!clearHistory && !clearBookmarks) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tString whereClause = null;\n\t\tif (clearHistory && clearBookmarks) {\n\t\t\twhereClause = null;\n\t\t} else if (clearHistory) {\n\t\t\twhereClause = \"((\" + BookmarksProvider.Columns.BOOKMARK + \" = 0) OR (\" +\n\t\t\t\t\tBookmarksProvider.Columns.BOOKMARK + \" IS NULL)) AND (\" +\n\t\t\t\t\tBookmarksProvider.Columns.IS_FOLDER + \" = 0)\";\n\t\t} else if (clearBookmarks) {\n\t\t\twhereClause = \"(\" + BookmarksProvider.Columns.BOOKMARK + \" = 1) OR (\" + BookmarksProvider.Columns.IS_FOLDER + \" = 1)\";\n\t\t}\n\t\t\n\t\tcontentResolver.delete(BookmarksProvider.BOOKMARKS_URI, whereClause, null);\t\t\n\t}\n\t\n\tpublic static List<FolderItem> getFirstLevelFoldersList(ContentResolver contentResolver) {\n\t\tList<FolderItem> result = new ArrayList<FolderItem>();\n\t\t\n\t\tString whereClause = BookmarksProvider.Columns.IS_FOLDER + \" = 1 AND \" + BookmarksProvider.Columns.PARENT_FOLDER_ID + \" = -1\";\n\t\tString orderClause = BookmarksProvider.Columns.TITLE;\n\t\t\n\t\tCursor c = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, orderClause);\n\t\tif ((c != null) &&\n\t\t\t\t(c.moveToFirst())) {\n\t\t\t\n\t\t\tint idIndex = c.getColumnIndex(BookmarksProvider.Columns._ID);\n\t\t\tint titleIndex = c.getColumnIndex(BookmarksProvider.Columns.TITLE);\n\t\t\t\n\t\t\tdo {\n\t\t\t\tresult.add(new FolderItem(c.getLong(idIndex), c.getString(titleIndex)));\n\t\t\t} while (c.moveToNext());\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic static long getFolderId(ContentResolver contentResolver, String folderName, boolean createIfNotPresent) {\n\t\tString escapedFolderName = DatabaseUtils.sqlEscapeString(folderName);\n\t\t\n\t\tString whereClause = BookmarksProvider.Columns.TITLE + \" = \" + escapedFolderName + \" AND \" + BookmarksProvider.Columns.IS_FOLDER + \" = 1\";\n\t\t\n\t\tCursor c = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\t\tif ((c != null) &&\n\t\t\t\t(c.moveToFirst())) {\n\t\t\treturn c.getLong(c.getColumnIndex(BookmarksProvider.Columns._ID));\n\t\t} else {\n\t\t\tif (createIfNotPresent) {\n\t\t\t\t\n\t\t\t\tContentValues values = new ContentValues();\n\t\t\t\tvalues.put(BookmarksProvider.Columns.TITLE, folderName);\n\t\t\t\tvalues.putNull(BookmarksProvider.Columns.URL);\n\t\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 0);\n\t\t\t\tvalues.put(BookmarksProvider.Columns.IS_FOLDER, 1);\n\t\t\t\t\n\t\t\t\tUri result = contentResolver.insert(BookmarksProvider.BOOKMARKS_URI, values);\n\t\t\t\t\n\t\t\t\tCursor inserted = contentResolver.query(result, HISTORY_BOOKMARKS_PROJECTION, null, null, null);\n\t\t\t\tif ((inserted != null) &&\n\t\t\t\t\t\t(inserted.moveToFirst())) {\n\t\t\t\t\treturn inserted.getLong(inserted.getColumnIndex(BookmarksProvider.Columns._ID));\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Modify a bookmark/history record. If an id is provided, it look for it and update its values. If not, values will be inserted.\n\t * If no id is provided, it look for a record with the given url. It found, its values are updated. If not, values will be inserted.\n\t * @param contentResolver The content resolver.\n\t * @param id The record id to look for.\n\t * @param folderId The id of the folder in which this bookmarks is.\n\t * @param title The record title.\n\t * @param url The record url.\n\t * @param isBookmark If True, the record will be a bookmark.\n\t */\n\tpublic static void setAsBookmark(ContentResolver contentResolver, long id, long folderId, String title, String url, boolean isBookmark) {\n\n\t\tboolean bookmarkExist = false;\n\n\t\tif (id != -1) {\n\t\t\tString[] colums = new String[] { BookmarksProvider.Columns._ID };\n\t\t\tString whereClause = BookmarksProvider.Columns._ID + \" = \" + id;\n\n\t\t\tCursor cursor = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, colums, whereClause, null, null);\n\t\t\tbookmarkExist = (cursor != null) && (cursor.moveToFirst());\n\t\t} else {\n\t\t\tString[] colums = new String[] { BookmarksProvider.Columns._ID };\n\t\t\t\n\t\t\tString escapedUrl = DatabaseUtils.sqlEscapeString(url);\n\t\t\t\n\t\t\tString whereClause = BookmarksProvider.Columns.URL + \" = \" + escapedUrl;\n\n\t\t\tCursor cursor = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, colums, whereClause, null, null);\n\t\t\tbookmarkExist = (cursor != null) && (cursor.moveToFirst());\n\t\t\tif (bookmarkExist) {\n\t\t\t\tid = cursor.getLong(cursor.getColumnIndex(BookmarksProvider.Columns._ID));\n\t\t\t}\n\t\t}\n\n\t\tContentValues values = new ContentValues();\n\t\tif (title != null) {\n\t\t\tvalues.put(BookmarksProvider.Columns.TITLE, title);\n\t\t}\n\n\t\tif (url != null) {\n\t\t\tvalues.put(BookmarksProvider.Columns.URL, url);\n\t\t}\n\n\t\tif (isBookmark) {\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 1);\t\t\t\n\t\t\tvalues.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, folderId);\n\t\t\tvalues.put(BookmarksProvider.Columns.CREATION_DATE, new Date().getTime());\n\t\t} else {\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 0);\n\t\t\tvalues.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, -1);\n\t\t\tvalues.putNull(BookmarksProvider.Columns.CREATION_DATE);\n\t\t}\n\n\t\tif (bookmarkExist) {                                    \n\t\t\tcontentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, BookmarksProvider.Columns._ID + \" = \" + id, null);\n\t\t} else {                        \n\t\t\tcontentResolver.insert(BookmarksProvider.BOOKMARKS_URI, values);\n\t\t}\n\t}\n\t\n\tpublic static void deleteBookmark(ContentResolver contentResolver, long id) {\n\t\tString whereClause = BookmarksProvider.Columns._ID + \" = \" + id;\n        \n\t\tCursor c = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\n\t\t\t\tif (c.getInt(c.getColumnIndex(BookmarksProvider.Columns.BOOKMARK)) == 1) {\n\t\t\t\t\tif (c.getInt(c.getColumnIndex(BookmarksProvider.Columns.VISITS)) > 0) {\n\t\t\t\t\t\t\n\t\t\t\t\t\t// If this record has been visited, keep it in history, but remove its bookmark flag.\n                        ContentValues values = new ContentValues();\n                        values.put(BookmarksProvider.Columns.BOOKMARK, 0);\n                        values.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, -1);\n                        values.putNull(BookmarksProvider.Columns.CREATION_DATE);\n                        \n                        contentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, whereClause, null);\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// never visited, it can be deleted.\n\t\t\t\t\t\tcontentResolver.delete(BookmarksProvider.BOOKMARKS_URI, whereClause, null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t}\n\t\n\tpublic static void deleteFolder(ContentResolver contentResolver, long id) {\t\t\t\t\n\t\t\n\t\tBookmarksProvider provider = (BookmarksProvider) contentResolver.acquireContentProviderClient(BookmarksProvider.BOOKMARKS_URI).getLocalContentProvider();\n\t\tprovider.setNotifyChanges(false);\n\t\t\n\t\t// Delete child folders.\n\t\tCursor c = getChildrenFolders(contentResolver, id);\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\n\t\t\t\t\n\t\t\t\tint idIndex = c.getColumnIndex(BookmarksProvider.Columns._ID);\n\t\t\t\t\n\t\t\t\tdo {\n\t\t\t\t\t\n\t\t\t\t\tlong childId = c.getLong(idIndex);\n\t\t\t\t\tdeleteFolder(contentResolver, childId);\n\t\t\t\t\t\n\t\t\t\t} while (c.moveToNext());\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t\t\n\t\t// Delete content of the folder.\n\t\tString whereClause = BookmarksProvider.Columns.PARENT_FOLDER_ID + \" = \" + id + \" AND \" + BookmarksProvider.Columns.BOOKMARK + \" > 0\";\t\t\n\t\tc = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\n\t\t\t\t\n\t\t\t\tint idIndex = c.getColumnIndex(BookmarksProvider.Columns._ID);\n\t\t\t\tint visitsIndex = c.getColumnIndex(BookmarksProvider.Columns.VISITS);\n\t\t\t\t\n\t\t\t\tdo {\n\t\t\t\t\tlong bookmarkId = c.getLong(idIndex);\n\t\t\t\t\t\n\t\t\t\t\tif (c.getInt(visitsIndex) > 0) {\n\t\t\t\t\t\t// If this record has been visited, keep it in history, but remove its bookmark flag and its folder id.\n                        ContentValues values = new ContentValues();\n                        values.put(BookmarksProvider.Columns.BOOKMARK, 0);\n                        values.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, -1);\n                        values.putNull(BookmarksProvider.Columns.CREATION_DATE);\n                        \n                        contentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, BookmarksProvider.Columns._ID + \" = \" + bookmarkId, null);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontentResolver.delete(BookmarksProvider.BOOKMARKS_URI, BookmarksProvider.Columns._ID + \" = \" + bookmarkId, null);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t} while (c.moveToNext());\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t\t\n\t\t// Finally delete the folder.\n\t\tcontentResolver.delete(BookmarksProvider.BOOKMARKS_URI, BookmarksProvider.Columns._ID + \" = \" + id, null);\n\t\t\n\t\tprovider.setNotifyChanges(true);\n\t}\n\t\n\tpublic static void deleteHistoryRecord(ContentResolver contentResolver, long id) {\n\t\tString whereClause = BookmarksProvider.Columns._ID + \" = \" + id;\n        \n\t\tCursor c = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\n\t\t\t\tif (c.getInt(c.getColumnIndex(BookmarksProvider.Columns.BOOKMARK)) > 0) {\n\t\t\t\t\t// This is a bookmark, we cannot delete it. Instead, set visits count to 0 and visited date to null.\n\t\t\t\t\tContentValues values = new ContentValues();\n                    values.put(BookmarksProvider.Columns.VISITS, 0);\n                    values.putNull(BookmarksProvider.Columns.VISITED_DATE);\n                    \n                    contentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, whereClause, null);\n\t\t\t\t} else {\n\t\t\t\t\t// Not a bookmark, it can be deleted.\n\t\t\t\t\tcontentResolver.delete(BookmarksProvider.BOOKMARKS_URI, whereClause, null);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t}\n\t\n\t/**\n\t * Update the history: visit count and last visited date.\n\t * @param contentResolver The content resolver.\n\t * @param title The title.\n\t * @param url The url.\n\t * @param originalUrl The original url \n\t */\n\tpublic static void updateHistory(ContentResolver contentResolver, String title, String url, String originalUrl) {\n\t\tString[] colums = new String[] { BookmarksProvider.Columns._ID, BookmarksProvider.Columns.URL, BookmarksProvider.Columns.BOOKMARK, BookmarksProvider.Columns.VISITS };\n\t\t\n\t\tString escapedUrl = url != null ? DatabaseUtils.sqlEscapeString(url) : \"\";\n\t\tString escapedOriginalUrl = originalUrl != null ? DatabaseUtils.sqlEscapeString(originalUrl) : \"\";\n\t\t\n\t\tString whereClause = BookmarksProvider.Columns.URL + \" = \" + escapedUrl + \" OR \" + BookmarksProvider.Columns.URL + \" = \" + escapedOriginalUrl;\n\n\t\tCursor cursor = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, colums, whereClause, null, null);\n\n\t\tif (cursor != null) {\n\t\t\tif (cursor.moveToFirst()) {\n\n\t\t\t\tlong id = cursor.getLong(cursor.getColumnIndex(BookmarksProvider.Columns._ID));\n\t\t\t\tint visits = cursor.getInt(cursor.getColumnIndex(BookmarksProvider.Columns.VISITS)) + 1;\n\n\t\t\t\tContentValues values = new ContentValues();\n\n\t\t\t\t// If its not a bookmark, we can update the title. If we were doing it on bookmarks, we would override the title choosen by the user.\n\t\t\t\tif (cursor.getInt(cursor.getColumnIndex(BookmarksProvider.Columns.BOOKMARK)) != 1) {\n\t\t\t\t\tvalues.put(BookmarksProvider.Columns.TITLE, title);\n\t\t\t\t}\n\n\t\t\t\tvalues.put(BookmarksProvider.Columns.VISITED_DATE, new Date().getTime());\n\t\t\t\tvalues.put(BookmarksProvider.Columns.VISITS, visits);\n\n\t\t\t\tcontentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, BookmarksProvider.Columns._ID + \" = \" + id, null);\n\n\t\t\t} else {\n\t\t\t\tContentValues values = new ContentValues();\n\t\t\t\tvalues.put(BookmarksProvider.Columns.TITLE, title);\n\t\t\t\tvalues.put(BookmarksProvider.Columns.URL, url);\n\t\t\t\tvalues.put(BookmarksProvider.Columns.VISITED_DATE, new Date().getTime());\n\t\t\t\tvalues.put(BookmarksProvider.Columns.VISITS, 1);\n\t\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 0);\n\n\t\t\t\tcontentResolver.insert(BookmarksProvider.BOOKMARKS_URI, values);\n\t\t\t}               \n\n\t\t\tcursor.close();\n\t\t}\n\t}\n\t\n\tprivate static final String TRUNCATE_HISTORY_DELETE_WHERE_PATTERN = \"(\" + BookmarksProvider.Columns.BOOKMARK + \" = 0 OR \" + BookmarksProvider.Columns.BOOKMARK + \" IS NULL) AND \" + BookmarksProvider.Columns.VISITED_DATE + \" < %s\";\n\tprivate static final String TRUNCATE_HISTORY_UPDATE_WHERE_PATTERN = BookmarksProvider.Columns.BOOKMARK + \" = 1  AND \" + BookmarksProvider.Columns.VISITED_DATE + \" < %s\";\n\t\n\t/**\n\t * Remove from history values prior to now minus the number of days defined in preferences.\n\t * Only delete history items. For bookmarks, reset their visited value date and visits count.\n\t * @param contentResolver The content resolver.\n\t */\n\tpublic static void truncateHistory(ContentResolver contentResolver, String prefHistorySize) {\n\t\tint historySize;\n\t\ttry {\n\t\t\thistorySize = Integer.parseInt(prefHistorySize);\n\t\t} catch (NumberFormatException e) {\n\t\t\thistorySize = 90;\n\t\t}\n\n\t\tCalendar c = Calendar.getInstance();\n\t\tc.setTime(new Date());          \n\t\tc.set(Calendar.HOUR_OF_DAY, 0);\n\t\tc.set(Calendar.MINUTE, 0);\n\t\tc.set(Calendar.SECOND, 0);\n\t\tc.set(Calendar.MILLISECOND, 0);\n\t\tc.add(Calendar.DAY_OF_YEAR, - historySize);\n\n\t\tString whereClauseDelete = String.format(TRUNCATE_HISTORY_DELETE_WHERE_PATTERN, c.getTimeInMillis());\n\t\tString whereClauseUpdate = String.format(TRUNCATE_HISTORY_UPDATE_WHERE_PATTERN, c.getTimeInMillis());\n\t\t\n\t\tContentValues updateValues = new ContentValues();\n\t\tupdateValues.putNull(BookmarksProvider.Columns.VISITED_DATE);\n\t\tupdateValues.put(BookmarksProvider.Columns.VISITS, 0);\n\t\t\n\t\ttry {\n\t\t\tcontentResolver.delete(BookmarksProvider.BOOKMARKS_URI, whereClauseDelete, null);\n\t\t\tcontentResolver.update(BookmarksProvider.BOOKMARKS_URI, updateValues, whereClauseUpdate, null);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\tLog.w(\"BookmarksWrapper\", \"Unable to truncate history: \" + e.getMessage());\n\t\t}\n\t}\n\t\n\tprivate static final String UPDATE_FAVICON_WHERE_PATTERN_1 = BookmarksProvider.Columns.URL + \" = %s OR \" + BookmarksProvider.Columns.URL + \" = %s\";\n\tprivate static final String UPDATE_FAVICON_WHERE_PATTERN_2 = BookmarksProvider.Columns.URL + \" = %s\";\n\t\n\t/**\n\t * Update the favicon in history/bookmarks database.\n\t * @param contentResolver The content resolver.\n\t * @param url The url.\n\t * @param originalUrl The original url.\n\t * @param favicon The favicon.\n\t */\n\tpublic static void updateFavicon(ContentResolver contentResolver, String url, String originalUrl, Bitmap favicon) {\n\t\tif ((url != null) &&\n\t\t\t\t(favicon != null) &&\n\t\t\t\t(contentResolver != null)) {\n\t\t\tString whereClause;\n\n\t\t\tif ((originalUrl != null) &&\n\t\t\t\t\t!url.equals(originalUrl)) {\n\t\t\t\turl = DatabaseUtils.sqlEscapeString(url);\n\t\t\t\toriginalUrl = DatabaseUtils.sqlEscapeString(originalUrl);\n\t\t\t\t\n\t\t\t\twhereClause = String.format(UPDATE_FAVICON_WHERE_PATTERN_1, url, originalUrl);\n\t\t\t} else {\n\t\t\t\turl = DatabaseUtils.sqlEscapeString(url);\n\t\t\t\twhereClause = String.format(UPDATE_FAVICON_WHERE_PATTERN_2, url);\n\t\t\t}\n\n\t\t\tByteArrayOutputStream os = new ByteArrayOutputStream();\n\t\t\tfavicon.compress(Bitmap.CompressFormat.PNG, 100, os);\n\n\t\t\tContentValues values = new ContentValues();\n\t\t\tvalues.put(BookmarksProvider.Columns.FAVICON, os.toByteArray());\t\t\t\t\n\n\t\t\ttry {\n\t\t\t\tcontentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, whereClause, null);\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\tLog.w(\"BookmarksWrapper\", \"Unable to update favicon: \" + e.getMessage());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static final String BOOKMARK_BY_URL_WHERE_PATTERN_1 = \"(\" + BookmarksProvider.Columns.URL + \" = %s OR \" + BookmarksProvider.Columns.URL + \" = %s) AND \" + BookmarksProvider.Columns.BOOKMARK + \" = 1\";\n\tprivate static final String BOOKMARK_BY_URL_WHERE_PATTERN_2 = BookmarksProvider.Columns.URL + \" = %s AND \" + BookmarksProvider.Columns.BOOKMARK + \" = 1\";\n\t\n\tpublic static void updateThumbnail(ContentResolver contentResolver, String url, String originalUrl, Bitmap thumbnail) {\n\t\tif ((url != null) &&\n\t\t\t\t(thumbnail != null) &&\n\t\t\t\t(contentResolver != null)) {\n\t\t\tString whereClause;\n\n\t\t\tif ((originalUrl != null) &&\n\t\t\t\t\t!url.equals(originalUrl)) {\n\t\t\t\turl = DatabaseUtils.sqlEscapeString(url);\n\t\t\t\toriginalUrl = DatabaseUtils.sqlEscapeString(originalUrl);\n\t\t\t\t\n\t\t\t\twhereClause = String.format(BOOKMARK_BY_URL_WHERE_PATTERN_1, url, originalUrl);\n\t\t\t} else {\n\t\t\t\turl = DatabaseUtils.sqlEscapeString(url);\t\t\t\t\n\t\t\t\twhereClause = String.format(BOOKMARK_BY_URL_WHERE_PATTERN_2, url);\n\t\t\t}\n\n\t\t\tByteArrayOutputStream os = new ByteArrayOutputStream();\n\t\t\tthumbnail.compress(Bitmap.CompressFormat.PNG, 100, os);\n\n\t\t\tContentValues values = new ContentValues();\n\t\t\tvalues.put(BookmarksProvider.Columns.THUMBNAIL, os.toByteArray());\t\t\t\t\n\n\t\t\ttry {\n\t\t\t\tcontentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, whereClause, null);\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\tLog.w(\"BookmarksWrapper\", \"Unable to update thumbnail: \" + e.getMessage());\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\tpublic static boolean urlHasBookmark(ContentResolver contentResolver, String url, String originalUrl) {\n\t\tif ((url != null) &&\n\t\t\t\t(contentResolver != null)) {\n\t\t\tString whereClause;\n\n\t\t\tif ((originalUrl != null) &&\n\t\t\t\t\t!url.equals(originalUrl)) {\n\t\t\t\turl = DatabaseUtils.sqlEscapeString(url);\n\t\t\t\toriginalUrl = DatabaseUtils.sqlEscapeString(originalUrl);\n\t\t\t\t\n\t\t\t\twhereClause = String.format(BOOKMARK_BY_URL_WHERE_PATTERN_1, url, originalUrl);\n\t\t\t} else {\n\t\t\t\turl = DatabaseUtils.sqlEscapeString(url);\n\t\t\t\twhereClause = String.format(BOOKMARK_BY_URL_WHERE_PATTERN_2, url);\n\t\t\t}\n\n\t\t\tCursor c = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\n\t\t\treturn c != null && c.getCount() > 0;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate static final String TOGGLE_BOOKMARK_WHERE_PATTERN =  BookmarksProvider.Columns._ID + \" = %s\";\n\t\n\tpublic static void toggleBookmark(ContentResolver contentResolver, long id, boolean bookmark) {\n\t\tString[] colums = new String[] { BookmarksProvider.Columns._ID };\n\t\tString whereClause = String.format(TOGGLE_BOOKMARK_WHERE_PATTERN, id);\n\n\t\tCursor cursor = contentResolver.query(BookmarksProvider.BOOKMARKS_URI, colums, whereClause, null, null);\n\t\tboolean recordExists = (cursor != null) && (cursor.moveToFirst());\n\t\t\n\t\tif (recordExists) {\n\t\t\tContentValues values = new ContentValues();\n\t\t\t\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, bookmark);\n\t\t\tvalues.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, -1);\n\t\t\t\n\t\t\tif (bookmark) {\n\t\t\t\tvalues.put(BookmarksProvider.Columns.CREATION_DATE, new Date().getTime());\n\t\t\t} else {\n\t\t\t\tvalues.putNull(BookmarksProvider.Columns.CREATION_DATE);\n\t\t\t\tvalues.putNull(BookmarksProvider.Columns.THUMBNAIL);\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tcontentResolver.update(BookmarksProvider.BOOKMARKS_URI, values, whereClause, null);\n\t\t}\n\t}\n\t\n\t/**\n\t * Insert a full record in history/bookmarks database.\n\t * @param contentResolver The content resolver.\n\t * @param title The record title.\n\t * @param url The record url.\n\t * @param visits The record visit count.\n\t * @param visitedDate The record last visit date.\n\t * @param creationDate The record bookmark creation date.\n\t * @param bookmark The bookmark flag.\n\t */\n\tpublic static void insertRawRecord(ContentResolver contentResolver, String title, String url, int visits, long visitedDate, long creationDate, int bookmark) {\n\t\tContentValues values = new ContentValues();\n\t\tvalues.put(BookmarksProvider.Columns.TITLE, title);\n\t\tvalues.put(BookmarksProvider.Columns.URL, url);\n\t\tvalues.put(BookmarksProvider.Columns.VISITS, visits);\n\t\t\n\t\tif (visitedDate > 0) {\n\t\t\tvalues.put(BookmarksProvider.Columns.VISITED_DATE, visitedDate);\n\t\t} else {\n\t\t\tvalues.putNull(BookmarksProvider.Columns.VISITED_DATE);\n\t\t}\n\t\t\n\t\tif (creationDate > 0) {\n\t\t\tvalues.put(BookmarksProvider.Columns.CREATION_DATE, creationDate);\n\t\t} else {\n\t\t\tvalues.putNull(BookmarksProvider.Columns.CREATION_DATE);\n\t\t}\n\t\t\n\t\tif (bookmark > 0) {\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 1);\n\t\t} else {\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 0);\n\t\t}\n\t\t\n\t\tcontentResolver.insert(BookmarksProvider.BOOKMARKS_URI, values);\n\t}\n\t\n\tpublic static void fillDefaultBookmaks(ContentResolver contentResolver, String[] titles, String[] urls) {\n\t\tint size = Math.min(titles.length, urls.length);\n\t\tlong currentDate = new Date().getTime();\n\t\t\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tinsertRawRecord(contentResolver, titles[i], urls[i], 0, currentDate, currentDate, 1);\n\t\t}\n\t}\n\t\n\tprivate static final String SUGGESTIONS_PATTERN = \"%%%s%%\";\n\tprivate static final String SUGGESTIONS_WHERE_PATTERN = BookmarksProvider.Columns.TITLE + \" LIKE %s OR \" + BookmarksProvider.Columns.URL  + \" LIKE %s\";\n\tprivate static final String SUGGESTIONS_ORDER = BookmarksProvider.Columns.VISITED_DATE + \" DESC, \" + BookmarksProvider.Columns.BOOKMARK + \" DESC, \" + BookmarksProvider.Columns.TITLE + \" ASC\";\n\t\n\t/**\n     * Get a cursor for suggestions, given a search pattern.\n     * Search on history and bookmarks, on title and url.\n     * @param contentResolver The content resolver.\n     * @param pattern The pattern to search for.\n     * @return A cursor of suggestions.\n     */\n\tpublic static Cursor getUrlSuggestions(ContentResolver contentResolver, String pattern) {\n\t\tif ((pattern != null) &&\n    \t\t\t(pattern.length() > 0)) {\n\t\t\t\n\t\t\tString sqlPattern = DatabaseUtils.sqlEscapeString(String.format(SUGGESTIONS_PATTERN, pattern));\n\t\t\tString whereClause = String.format(SUGGESTIONS_WHERE_PATTERN, sqlPattern, sqlPattern);\n\t\t\t\n\t\t\treturn contentResolver.query(BookmarksProvider.BOOKMARKS_URI,\n    \t\t\t\tHISTORY_BOOKMARKS_PROJECTION,\n    \t\t\t\twhereClause,\n    \t\t\t\tnull,\n    \t\t\t\tSUGGESTIONS_ORDER);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static final String CHILDREN_FOLDERS_WHERE_PATTERN = BookmarksProvider.Columns.IS_FOLDER + \" > 0 AND \" + BookmarksProvider.Columns.PARENT_FOLDER_ID + \" = %S\";\n    \n    private static Cursor getChildrenFolders(ContentResolver contentResolver, long folderId) {\n\t\tString whereClause = String.format(CHILDREN_FOLDERS_WHERE_PATTERN, folderId);\n\t\treturn contentResolver.query(BookmarksProvider.BOOKMARKS_URI, HISTORY_BOOKMARKS_PROJECTION, whereClause, null, null);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/providers/SslExceptionsProvider.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.providers;\n\nimport android.content.ContentProvider;\nimport android.content.ContentUris;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.UriMatcher;\nimport android.database.Cursor;\nimport android.database.SQLException;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\nimport android.database.sqlite.SQLiteQueryBuilder;\nimport android.net.Uri;\n\npublic class SslExceptionsProvider extends ContentProvider {\n\t\n\tpublic static final String AUTHORITY = \"org.tint.providers.sslexceptionsprovider\";\n\t\n\tprivate static final String SSL_EXCEPTIONS_TABLE = \"sslexceptions\";\n\t\n\tpublic static final String CONTENT_TYPE = \"vnd.android.cursor.dir/vnd.tint.sslexceptions\";\n\tpublic static final String CONTENT_ITEM_TYPE = \"vnd.android.cursor.item/vnd.tint.sslexceptions\";\n\t\n\tpublic static final Uri SSL_EXCEPTIONS_URI = Uri.parse(\"content://\" + AUTHORITY + \"/\" + SSL_EXCEPTIONS_TABLE);\n\t\n\tpublic static class Columns {\n\t\tpublic static final String _ID = \"_id\";\n\t\tpublic static final String AUTHORITY = \"authority\";\n\t\tpublic static final String REASON = \"reason\";\n\t\tpublic static final String ALLOW = \"allow\";\n\t}\n\t\n\tprivate static final int DATABASE_VERSION = 1;\n\tprivate static final String DATABASE_NAME = \"sslexceptions.db\";\n\t\n\tprivate static final String SSL_EXCEPTION_TABLE_CREATE = \"CREATE TABLE \" + SSL_EXCEPTIONS_TABLE + \" (\" + \n\t\tColumns._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT, \" +\n\t\tColumns.AUTHORITY + \" TEXT NOT NULL, \" +\n\t\tColumns.REASON + \" INTEGER NOT NULL DEFAULT 0, \" +\n\t\tColumns.ALLOW + \" INTEGER NOT NULL DEFAULT 0);\";\n\t\n\tprivate static final int EXCEPTIONS = 1;\n\tprivate static final int EXCEPTION_BY_ID = 2;\n\t\n\tprivate static final UriMatcher sUriMatcher;\n\t\n\tprivate SQLiteDatabase mDb;\n\tprivate DatabaseHelper mDbHelper;\n\t\n\tprivate Context mContext;\n\t\n\tstatic {\n\t\tsUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);\n\t\tsUriMatcher.addURI(AUTHORITY, SSL_EXCEPTIONS_TABLE, EXCEPTIONS);\n\t\tsUriMatcher.addURI(AUTHORITY, SSL_EXCEPTIONS_TABLE + \"/#\", EXCEPTION_BY_ID);\n\t}\n\t\n\t@Override\n\tpublic int delete(Uri uri, String selection, String[] selectionArgs) {\n\t\tint count = 0;\n\t\t\n\t\tswitch (sUriMatcher.match(uri)) {\n\t\tcase EXCEPTIONS:\n\t\t\tcount = mDb.delete(SSL_EXCEPTIONS_TABLE, selection, selectionArgs);\n\t\t\tbreak;\n\t\t\t\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\n\t\t}\t\t\n\t\t\n\t\tmContext.getContentResolver().notifyChange(uri, null);\n\t\t\n\t\treturn count;\n\t}\n\n\t@Override\n\tpublic String getType(Uri uri) {\n\t\tswitch (sUriMatcher.match(uri)) {\n\t\tcase EXCEPTIONS:\n\t\t\treturn CONTENT_TYPE;\n\t\tcase EXCEPTION_BY_ID:\n\t\t\treturn CONTENT_ITEM_TYPE;\n\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Uri insert(Uri uri, ContentValues values) {\n\t\tswitch (sUriMatcher.match(uri)) {\n\t\tcase EXCEPTIONS:\n\t\t\tlong rowId = mDb.insert(SSL_EXCEPTIONS_TABLE, null, values);\n\t\t\tif (rowId > 0) {\n\t\t\t\tUri rowUri = ContentUris.withAppendedId(SSL_EXCEPTIONS_URI, rowId);\n\t\t\t\t\n\t\t\t\tmContext.getContentResolver().notifyChange(rowUri, null);\n\t\t\t\t\t\n\t\t\t\treturn rowUri;\n\t\t\t}\n\t\t\t\n\t\t\tthrow new SQLException(\"Failed to insert row into \" + uri);\n\t\t\t\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onCreate() {\n\t\tmContext = getContext();\n\t\tmDbHelper = new DatabaseHelper(mContext);\n\t\tmDb = mDbHelper.getWritableDatabase();\n\t\t\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {\n\t\tSQLiteQueryBuilder qb = new SQLiteQueryBuilder();\n\t\t\n\t\tswitch (sUriMatcher.match(uri)) {\n\t\tcase EXCEPTIONS:\n\t\t\tqb.setTables(SSL_EXCEPTIONS_TABLE);\t\t\t\n\t\t\tbreak;\n\t\tcase EXCEPTION_BY_ID:\n\t\t\tqb.setTables(SSL_EXCEPTIONS_TABLE);\n\t\t\tqb.appendWhere(Columns._ID + \" = \" + uri.getPathSegments().get(1));\n\t\t\tbreak;\t\t\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\n\t\t}\n\t\t\n\t\tCursor c = qb.query(mDb, projection, selection, selectionArgs, null, null, sortOrder);\n\t\tc.setNotificationUri(getContext().getContentResolver(), uri);\n\t\t\n\t\treturn c;\n\t}\n\n\t@Override\n\tpublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {\n\t\tint count = 0;\n\t\tswitch (sUriMatcher.match(uri)) {\n\t\tcase EXCEPTIONS:\n\t\t\tcount = mDb.update(SSL_EXCEPTIONS_TABLE, values, selection, selectionArgs);\n\t\t\tbreak;\n\t\t\t\n\t\tdefault: throw new IllegalArgumentException(\"Unknown URI \" + uri);\n\t\t}\n\t\t\t\t\t\t\n\t\tmContext.getContentResolver().notifyChange(uri, null);\n\t\t\n\t\treturn count;\n\t}\n\t\n\tprivate static class DatabaseHelper extends SQLiteOpenHelper {\n\n\t\tpublic DatabaseHelper(Context context) {\n\t\t\tsuper(context, DATABASE_NAME, null, DATABASE_VERSION);\n\t\t}\n\n\t\t@Override\n\t\tpublic void onCreate(SQLiteDatabase db) {\n\t\t\tdb.execSQL(SSL_EXCEPTION_TABLE_CREATE);\n\t\t}\n\n\t\t@Override\n\t\tpublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/providers/SslExceptionsWrapper.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.providers;\n\nimport org.tint.R;\n\nimport android.content.ContentResolver;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.CursorLoader;\nimport android.database.Cursor;\nimport android.net.http.SslError;\n\npublic class SslExceptionsWrapper {\n\t\n\tpublic static String[] SSL_EXCEPTIONS_PROJECTION = new String[] {\n\t\tSslExceptionsProvider.Columns._ID,\n\t\tSslExceptionsProvider.Columns.AUTHORITY,\n\t\tSslExceptionsProvider.Columns.REASON,\n\t\tSslExceptionsProvider.Columns.ALLOW };\n\t\n\tpublic static final int AUTHORITY_UNKNOWN = 0;\n\tpublic static final int AUTHORITY_ALLOWED = 1;\n\tpublic static final int AUTHORITY_DISALLOWED = 2;\n\t\n\t// Redefinition of SSL errors constants, because those in Android SslError cannot be used for bitmasks.\n\tprivate static final int SSL_UNTRUSTED = 1;\n\tprivate static final int SSL_IDMISMATCH = 2;\n\tprivate static final int SSL_EXPIRED = 4;\n\tprivate static final int SSL_NOTYETVALID = 8;\n\tprivate static final int SSL_INVALID = 16;\n\tprivate static final int SSL_DATE_INVALID = 32;\n\t\n\tpublic static CursorLoader getSslErrorAuthoritiesCursorLoader(Context context) {\n\t\treturn new CursorLoader(context, SslExceptionsProvider.SSL_EXCEPTIONS_URI, SSL_EXCEPTIONS_PROJECTION, null, null, null);\n\t}\n\t\n\tpublic static int getStatusForAuthority(ContentResolver contentResolver, String authority) {\n\t\tint result = AUTHORITY_UNKNOWN;\n\t\t\n\t\tString whereClause = SslExceptionsProvider.Columns.AUTHORITY + \" = \\\"\" + authority + \"\\\"\";\n\t\t\n\t\tCursor c = contentResolver.query(SslExceptionsProvider.SSL_EXCEPTIONS_URI, SSL_EXCEPTIONS_PROJECTION, whereClause, null, null);\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\n\t\t\t\tif (c.getInt(c.getColumnIndex(SslExceptionsProvider.Columns.ALLOW)) > 0) {\n\t\t\t\t\tresult = AUTHORITY_ALLOWED;\n\t\t\t\t} else {\n\t\t\t\t\tresult = AUTHORITY_DISALLOWED;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic static void setSslException(ContentResolver contentResolver, String authority, int reason, boolean allow) {\n\t\tlong id = getIdForAuthority(contentResolver, authority);\n\t\t\n\t\tif (id != -1) {\n\t\t\tString whereClause = SslExceptionsProvider.Columns._ID + \" = \" + id;\n\t\t\t\n\t\t\tContentValues values = new ContentValues();\n\t\t\tvalues.put(SslExceptionsProvider.Columns.REASON, reason);\n\t\t\tvalues.put(SslExceptionsProvider.Columns.ALLOW, allow ? 1 : 0);\n\t\t\t\n\t\t\tcontentResolver.update(SslExceptionsProvider.SSL_EXCEPTIONS_URI, values, whereClause, null);\t\t\t\n\t\t} else {\t\t\n\t\t\tContentValues values = new ContentValues();\n\t\t\tvalues.put(SslExceptionsProvider.Columns.AUTHORITY, authority);\n\t\t\tvalues.put(SslExceptionsProvider.Columns.REASON, reason);\n\t\t\tvalues.put(SslExceptionsProvider.Columns.ALLOW, allow ? 1 : 0);\n\n\t\t\tcontentResolver.insert(SslExceptionsProvider.SSL_EXCEPTIONS_URI, values);\n\t\t}\n\t}\n\t\n\tpublic static void toggleSslException(ContentResolver contentResolver, long id, boolean allow) {\n\t\tString whereClause = SslExceptionsProvider.Columns._ID + \" = \" + id;\n\t\t\n\t\tContentValues values = new ContentValues();\n\t\tvalues.put(SslExceptionsProvider.Columns.ALLOW, allow ? 1 : 0);\n\t\t\n\t\tcontentResolver.update(SslExceptionsProvider.SSL_EXCEPTIONS_URI, values, whereClause, null);\n\t}\n\t\n\tpublic static void removeSslException(ContentResolver contentResolver, long id) {\n\t\tString whereClause = SslExceptionsProvider.Columns._ID + \" = \" + id;\n\t\t\n\t\tcontentResolver.delete(SslExceptionsProvider.SSL_EXCEPTIONS_URI, whereClause, null);\n\t}\n\t\n\tpublic static String sslErrorReasonToString(Context context, int reason) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\t\n\t\tif ((reason & SSL_UNTRUSTED) == SSL_UNTRUSTED) {\n\t\t\tsb.append(context.getString(R.string.SslUntrusted));\n\t\t}\n\t\t\n\t\tif ((reason & SSL_IDMISMATCH) == SSL_IDMISMATCH) {\n\t\t\tif (sb.length() > 0) {\n\t\t\t\tsb.append(\"<br/>\");\n\t\t\t}\n\t\t\t\n\t\t\tsb.append(context.getString(R.string.SslIDMismatch));\n\t\t}\n\t\t\n\t\tif ((reason & SSL_EXPIRED) == SSL_EXPIRED) {\n\t\t\tif (sb.length() > 0) {\n\t\t\t\tsb.append(\"<br/>\");\n\t\t\t}\n\t\t\t\n\t\t\tsb.append(context.getString(R.string.SslExpired));\n\t\t}\n\t\t\n\t\tif ((reason & SSL_NOTYETVALID) == SSL_NOTYETVALID) {\n\t\t\tif (sb.length() > 0) {\n\t\t\t\tsb.append(\"<br/>\");\n\t\t\t}\n\t\t\t\n\t\t\tsb.append(context.getString(R.string.SslNotYetValid));\n\t\t}\n\t\t\n\t\tif ((reason & SSL_INVALID) == SSL_INVALID) {\n\t\t\tif (sb.length() > 0) {\n\t\t\t\tsb.append(\"<br/>\");\n\t\t\t}\n\t\t\t\n\t\t\tsb.append(context.getString(R.string.SslInvalid));\n\t\t}\n\t\t\n\t\tif ((reason & SSL_DATE_INVALID) == SSL_DATE_INVALID) {\n\t\t\tif (sb.length() > 0) {\n\t\t\t\tsb.append(\"<br/>\");\n\t\t\t}\n\t\t\t\n\t\t\tsb.append(context.getString(R.string.SslDateInvalid));\n\t\t}\n\t\t\n\t\treturn sb.toString();\n\t}\n\t\n\tpublic static int sslErrorToInt(SslError error) {\n\t\tint errorCode = 0;\n\t\t\n\t\tif (error.hasError(SslError.SSL_UNTRUSTED)) {\n\t\t\terrorCode |= SSL_UNTRUSTED;\n\t\t}\n\n\t\tif (error.hasError(SslError.SSL_IDMISMATCH)) {\n\t\t\terrorCode |= SSL_IDMISMATCH;\n\t\t}\n\n\t\tif (error.hasError(SslError.SSL_EXPIRED)) {\n\t\t\terrorCode |= SSL_EXPIRED;\n\t\t}\n\n\t\tif (error.hasError(SslError.SSL_NOTYETVALID)) {\n\t\t\terrorCode |= SSL_NOTYETVALID;\n\t\t}\n\t\t\n\t\tif (error.hasError(SslError.SSL_INVALID)) {\n\t\t\terrorCode |= SSL_INVALID;\n\t\t}\n\t\t\n\t\tif (error.hasError(SslError.SSL_DATE_INVALID)) {\n\t\t\terrorCode |= SSL_DATE_INVALID;\n\t\t}\n\t\t\n\t\treturn errorCode;\n\t}\n\t\n\tprivate static long getIdForAuthority(ContentResolver contentResolver, String authority) {\n\t\tlong result = -1;\n\t\t\n\t\tString whereClause = SslExceptionsProvider.Columns.AUTHORITY + \" = \\\"\" + authority + \"\\\"\";\t\t\n\t\tCursor c = contentResolver.query(SslExceptionsProvider.SSL_EXCEPTIONS_URI, SSL_EXCEPTIONS_PROJECTION, whereClause, null, null);\n\t\t\n\t\tif (c != null) {\n\t\t\tif (c.moveToFirst()) {\n\t\t\t\tresult = c.getLong(c.getColumnIndex(SslExceptionsProvider.Columns._ID));\n\t\t\t}\n\t\t\t\n\t\t\tc.close();\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/tasks/HistoryBookmarksExportTask.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.tasks;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.net.URLEncoder;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Locale;\n\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.json.JSONObject;\nimport org.tint.R;\nimport org.tint.providers.BookmarksProvider;\nimport org.tint.ui.preferences.IHistoryBookmaksExportListener;\nimport org.tint.utils.IOUtils;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os.AsyncTask;\nimport android.os.Environment;\n\npublic class HistoryBookmarksExportTask extends AsyncTask<Cursor, Integer, String> {\n\n\tprivate Context mContext;\n\tprivate IHistoryBookmaksExportListener mListener;\n\n\tpublic HistoryBookmarksExportTask(Context context, IHistoryBookmaksExportListener listener) {\n\t\tmContext = context;\n\t\tmListener = listener;\n\t}\n\n\t@Override\n\tprotected String doInBackground(Cursor... params) {\n\n\t\tpublishProgress(0, 0, 0);\n\n\t\tString cardState = IOUtils.checkCardState(mContext);\n\t\tif (cardState != null) {\n\t\t\treturn cardState;\n\t\t}\n\n\t\treturn writeAsJSON(params);\n\t}\n\n\t@Override\n\tprotected void onProgressUpdate(Integer... values) {\n\t\tmListener.onExportProgress(values[0], values[1], values[2]);\n\t}\n\n\t@Override\n\tprotected void onPostExecute(String result) {\n\t\tmListener.onExportDone(result);\n\t}\n\n\t/**\n\t * Get a string representation of the current date / time in a format suitable for a file name.\n\t * @return A string representation of the current date / time.\n\t */\n\tprivate String getNowForFileName() {\n\t\tCalendar c = Calendar.getInstance();\n\t\tSimpleDateFormat sdf = new SimpleDateFormat(\"yyyyMMdd-HHmmss\", Locale.US);\n\n\t\treturn sdf.format(c.getTime());\n\t}\n\t\n\tprivate String writeAsJSON(Cursor... params) {\n\t\ttry {\n\t\t\tString fileName = mContext.getString(R.string.ApplicationName) + \"-\" + getNowForFileName() + \".json\";\n\n\t\t\tFile file = new File(Environment.getExternalStorageDirectory(), fileName);\t\t\n\t\t\tFileWriter writer = new FileWriter(file);\t\t\t\n\t\t\t\n\t\t\tFoldersJSONArray foldersArray = new FoldersJSONArray();\n\t\t\tBookmarksJSONArray bookmarksArray = new BookmarksJSONArray();\n\t\t\tHistoryJSONArray historyArray = new HistoryJSONArray();\n\t\t\t\n\t\t\tCursor c = params[0];\n\t\t\tif (c.moveToFirst()) {\n\n\t\t\t\tint current = 0;\n\t\t\t\tint total = c.getCount();\n\n\t\t\t\tint idIndex = c.getColumnIndex(BookmarksProvider.Columns._ID);\n\t\t\t\tint titleIndex = c.getColumnIndex(BookmarksProvider.Columns.TITLE);\n\t\t\t\tint urlIndex = c.getColumnIndex(BookmarksProvider.Columns.URL);\n\t\t\t\tint creationDateIndex = c.getColumnIndex(BookmarksProvider.Columns.CREATION_DATE);\n\t\t\t\tint visitedDateIndex = c.getColumnIndex(BookmarksProvider.Columns.VISITED_DATE);\n\t\t\t\tint visitsIndex = c.getColumnIndex(BookmarksProvider.Columns.VISITS);\n\t\t\t\tint bookmarkIndex = c.getColumnIndex(BookmarksProvider.Columns.BOOKMARK);\n\t\t\t\tint folderIndex = c.getColumnIndex(BookmarksProvider.Columns.IS_FOLDER);\n\t\t\t\tint parentfolderIdIndex = c.getColumnIndex(BookmarksProvider.Columns.PARENT_FOLDER_ID);\n\n\t\t\t\twhile (!c.isAfterLast()) {\n\n\t\t\t\t\tpublishProgress(1, current, total);\n\n\t\t\t\t\tboolean isFolder = c.getInt(folderIndex) > 0 ? true : false;\t\t\t\t\t\n\n\t\t\t\t\tif (isFolder) {\t\t\t\t\t\t\n\t\t\t\t\t\tString title = c.getString(titleIndex);\n\t\t\t\t\t\ttitle = title != null ? URLEncoder.encode(title, \"UTF-8\") : \"\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tfoldersArray.add(\n\t\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\t\tc.getLong(idIndex),\n\t\t\t\t\t\t\t\tc.getLong(parentfolderIdIndex));\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\tboolean isBookmark = c.getInt(bookmarkIndex) > 0 ? true : false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tString title = c.getString(titleIndex);\n\t\t\t\t\t\ttitle = title != null ? URLEncoder.encode(title, \"UTF-8\") : \"\";\n\n\t\t\t\t\t\tString url = c.getString(urlIndex);\n\t\t\t\t\t\turl = url != null ? URLEncoder.encode(url, \"UTF-8\") : \"\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isBookmark) {\n\t\t\t\t\t\t\tbookmarksArray.add(\n\t\t\t\t\t\t\t\t\tc.getLong(parentfolderIdIndex),\n\t\t\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t\t\tc.getLong(creationDateIndex),\n\t\t\t\t\t\t\t\t\tc.getLong(visitedDateIndex),\n\t\t\t\t\t\t\t\t\tc.getInt(visitsIndex));\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thistoryArray.add(\n\t\t\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t\t\tc.getLong(visitedDateIndex),\n\t\t\t\t\t\t\t\t\tc.getInt(visitsIndex));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tc.moveToNext();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tJSONObject output = new JSONObject();\n\t\t\toutput.put(\"folders\", foldersArray);\n\t\t\toutput.put(\"bookmarks\", bookmarksArray);\n\t\t\toutput.put(\"history\", historyArray);\n\t\t\t\n\t\t\twriter.write(output.toString(1));\n\t\t\t\n\t\t\twriter.flush();\n\t\t\twriter.close();\n\t\t\t\n\t\t} catch (JSONException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn e.getMessage();\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn e.getMessage();\n\t\t}\n\n\t\treturn null;\n\t}\n\t\n\tprivate class FoldersJSONArray extends JSONArray {\n\t\t\n\t\tpublic void add(String title, long id, long parentId) throws JSONException {\n\t\t\tJSONObject item = new JSONObject();\n\t\t\titem.put(\"title\", title);\n\t\t\titem.put(\"id\", id);\n\t\t\titem.put(\"parentId\", parentId);\n\t\t\t\n\t\t\tthis.put(item);\n\t\t}\n\t\t\n\t}\n\t\n\tprivate class BookmarksJSONArray extends JSONArray {\n\t\t\n\t\tpublic void add(long folderId, String title, String url, long creationDate, long visitedDate, int visits) throws JSONException {\n\t\t\tJSONObject item = new JSONObject();\n\t\t\titem.put(\"folderId\", folderId);\n\t\t\titem.put(\"title\", title);\n\t\t\titem.put(\"url\", url);\n\t\t\titem.put(\"creationDate\", creationDate);\n\t\t\titem.put(\"visitedDate\", visitedDate);\n\t\t\titem.put(\"visits\", visits);\n\n\t\t\tthis.put(item);\n\t\t}\n\t\t\n\t}\n\t\n\tprivate class HistoryJSONArray extends JSONArray  {\n\n\t\tpublic void add(String title, String url, long visitedDate, int visits) throws JSONException {\n\t\t\tJSONObject item = new JSONObject();\n\t\t\titem.put(\"title\", title);\n\t\t\titem.put(\"url\", url);\n\t\t\titem.put(\"visitedDate\", visitedDate);\n\t\t\titem.put(\"visits\", visits);\n\n\t\t\tthis.put(item);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/tasks/HistoryBookmarksImportTask.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.tasks;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\n\nimport javax.xml.parsers.DocumentBuilder;\nimport javax.xml.parsers.DocumentBuilderFactory;\nimport javax.xml.parsers.ParserConfigurationException;\n\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.json.JSONObject;\nimport org.tint.R;\nimport org.tint.providers.BookmarksProvider;\nimport org.tint.ui.preferences.IHistoryBookmaksImportListener;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.Node;\nimport org.w3c.dom.NodeList;\nimport org.xml.sax.SAXException;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.os.Environment;\n\npublic class HistoryBookmarksImportTask extends AsyncTask<String, Integer, String> {\n\n\tprivate Context mContext;\n\tprivate IHistoryBookmaksImportListener mListener;\n\n\tpublic HistoryBookmarksImportTask(Context context, IHistoryBookmaksImportListener listener) {\n\t\tmContext = context;\n\t\tmListener = listener;\n\t}\n\n\t@Override\n\tprotected String doInBackground(String... params) {\n\n\t\tpublishProgress(0, 0, 0);\t\t\n\n\t\tFile file = new File(Environment.getExternalStorageDirectory(), params[0]);\n\n\t\tif ((file != null) &&\n\t\t\t\t(file.exists()) &&\n\t\t\t\t(file.canRead())) {\n\n\t\t\tif (file.getName().toLowerCase(Locale.US).endsWith(\".json\")) {\n\t\t\t\treturn readAsJSON(file);\n\t\t\t} else if (file.getName().toLowerCase(Locale.US).endsWith(\".xml\")) {\n\t\t\t\treturn readAsXml(file);\n\t\t\t} else {\n\t\t\t\treturn mContext.getString(R.string.HistoryBookmarksImportErrorInvalidFileFormat);\n\t\t\t}\n\n\t\t} else {\n\t\t\treturn mContext.getString(R.string.HistoryBookmarksImportFileUnavailable);\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onProgressUpdate(Integer... values) {\n\t\tmListener.onImportProgress(values[0], values[1], values[2]);\n\t}\n\n\t@Override\n\tprotected void onPostExecute(String result) {\n\t\tmListener.onImportDone(result);\n\t}\n\t\n\tprivate String readAsJSON(File file) {\n\t\tList<ContentValues> insertValues = null;\n\n\t\ttry {\t\t\t\n\t\t\tinsertValues = new ArrayList<ContentValues>();\n\n\t\t\tpublishProgress(1, 0, 0);\n\n\t\t\tFileInputStream fis = new FileInputStream(file);\n\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tString line;\n\n\t\t\tBufferedReader reader;\n\t\t\ttry {\n\t\t\t\treader = new BufferedReader(new InputStreamReader(fis, \"UTF-8\"));\n\n\t\t\t\twhile ((line = reader.readLine()) != null) {\t\t\t\t\t\n\t\t\t\t\tsb.append(line);\n\t\t\t\t}\n\n\t\t\t} catch (UnsupportedEncodingException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\treturn e.getMessage();\n\t\t\t} catch (IOException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\treturn e.getMessage();\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tfis.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t\treturn e.getMessage();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tJSONObject data = new JSONObject(sb.toString());\n\t\t\t \n\t\t\tMap<Long, Folder> folders = new HashMap<Long, Folder>();\n\t\t\t\n\t\t\tif (data.has(\"folders\")) {\n\t\t\t\tJSONArray foldersArray = data.getJSONArray(\"folders\");\n\t\t\t\t\n\t\t\t\tint progress = 0;\n\t\t\t\tint total = foldersArray.length();\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i < foldersArray.length(); i++) {\n\t\t\t\t\t\n\t\t\t\t\tpublishProgress(3, progress, total);\n\t\t\t\t\t\n\t\t\t\t\tJSONObject folder = foldersArray.getJSONObject(i);\n\t\t\t\t\t\n\t\t\t\t\tlong id = folder.getLong(\"id\");\n\t\t\t\t\tlong parentId = folder.getLong(\"parentId\");\n\t\t\t\t\tString title = URLDecoder.decode(folder.getString(\"title\"), \"UTF-8\");\n\t\t\t\t\t\n\t\t\t\t\tContentValues values = new ContentValues();\n\t\t\t\t\tvalues.put(BookmarksProvider.Columns.TITLE, title);\n\t\t\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 0);\n\t\t\t\t\tvalues.put(BookmarksProvider.Columns.IS_FOLDER, 1);\n\t\t\t\t\tvalues.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, -1);\n\t\t\t\t\t\n\t\t\t\t\tUri insertionUri = mContext.getContentResolver().insert(BookmarksProvider.BOOKMARKS_URI, values);\n\t\t\t\t\tString insertionString = insertionUri.toString();\n\t\t\t\t\t\n\t\t\t\t\t// Get the new id for the current folder.\n\t\t\t\t\tlong insertionId = -1;\n\t\t\t\t\ttry {\n\t\t\t\t\t\t insertionId = Long.parseLong(insertionString.substring(insertionString.lastIndexOf('/') + 1));\n\t\t\t\t\t} catch (NumberFormatException e) {\n\t\t\t\t\t\tinsertionId = -1;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Keep a relation between the id of the folder in the export file, its parent id (in the export file), and its new id.\n\t\t\t\t\tfolders.put(id, new Folder(insertionId, parentId));\n\t\t\t\t\t\n\t\t\t\t\tprogress++;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tpublishProgress(4, 0, 0);\n\t\t\t\t\n\t\t\t\t// Correct folders parent ids.\n\t\t\t\tif (!folders.isEmpty()) {\n\t\t\t\t\tfor (Folder folder : folders.values()) {\n\t\t\t\t\t\t// For each folder previously inserted, check if it had a parent folder in the export file.\n\t\t\t\t\t\tlong oldParentId = folder.getOldParentId();\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (oldParentId != -1) {\n\t\t\t\t\t\t\t// Get the parent folder by its old Id, key of folders map.\n\t\t\t\t\t\t\tFolder parentFolder = folders.get(oldParentId);\n\t\t\t\t\t\t\tif (parentFolder != null) {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tContentValues values = new ContentValues();\n\t\t\t\t\t\t\t\tvalues.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, parentFolder.getNewId());\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tString whereClause = BookmarksProvider.Columns._ID + \" = \" + folder.getNewId();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tmContext.getContentResolver().update(BookmarksProvider.BOOKMARKS_URI, values, whereClause, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (data.has(\"bookmarks\")) {\n\t\t\t\tJSONArray bookmarksArray = data.getJSONArray(\"bookmarks\");\n\t\t\t\t\n\t\t\t\tint progress = 0;\n\t\t\t\tint total = bookmarksArray.length();\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i < bookmarksArray.length(); i++) {\n\t\t\t\t\t\n\t\t\t\t\tpublishProgress(5, progress, total);\n\t\t\t\t\t\n\t\t\t\t\tJSONObject bookmark = bookmarksArray.getJSONObject(i);\n\t\t\t\t\t\n\t\t\t\t\tlong folderId = bookmark.getLong(\"folderId\");\n\t\t\t\t\tFolder parentFolder = null;\n\t\t\t\t\tif (folderId != -1) {\n\t\t\t\t\t\tparentFolder = folders.get(folderId);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tString title = URLDecoder.decode(bookmark.getString(\"title\"), \"UTF-8\");\n\t\t\t\t\tString url = URLDecoder.decode(bookmark.getString(\"url\"), \"UTF-8\");\n\t\t\t\t\t\n\t\t\t\t\tContentValues values = createContentValues(\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\tbookmark.getInt(\"visits\"),\n\t\t\t\t\t\t\tbookmark.getLong(\"visitedDate\"),\n\t\t\t\t\t\t\tbookmark.getLong(\"creationDate\"),\n\t\t\t\t\t\t\t1);\n\t\t\t\t\t\n\t\t\t\t\tif (parentFolder != null) {\n\t\t\t\t\t\tvalues.put(BookmarksProvider.Columns.PARENT_FOLDER_ID, parentFolder.getNewId());\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tinsertValues.add(values);\n\t\t\t\t\t\n\t\t\t\t\tprogress++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (data.has(\"history\")) {\n\t\t\t\tJSONArray historyArray = data.getJSONArray(\"history\");\n\t\t\t\t\n\t\t\t\tint progress = 0;\n\t\t\t\tint total = historyArray.length();\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i < historyArray.length(); i++) {\n\t\t\t\t\t\n\t\t\t\t\tpublishProgress(6, progress, total);\n\t\t\t\t\t\n\t\t\t\t\tJSONObject history = historyArray.getJSONObject(i);\n\t\t\t\t\t\n\t\t\t\t\tString title = URLDecoder.decode(history.getString(\"title\"), \"UTF-8\");\n\t\t\t\t\tString url = URLDecoder.decode(history.getString(\"url\"), \"UTF-8\");\n\t\t\t\t\t\n\t\t\t\t\tContentValues values = createContentValues(\n\t\t\t\t\t\t\ttitle,\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\thistory.getInt(\"visits\"),\n\t\t\t\t\t\t\thistory.getLong(\"visitedDate\"),\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t0);\n\t\t\t\t\t\n\t\t\t\t\tinsertValues.add(values);\n\t\t\t\t\t\n\t\t\t\t\tprogress++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} catch (FileNotFoundException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn e.getMessage();\n\t\t} catch (JSONException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn e.getMessage();\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn e.getMessage();\n\t\t}\n\n\t\tif (insertValues != null) {\n\t\t\tpublishProgress(7, 0, 0);\n\t\t\tmContext.getContentResolver().bulkInsert(BookmarksProvider.BOOKMARKS_URI, insertValues.toArray(new ContentValues[insertValues.size()]));\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate String readAsXml(File file) {\n\t\tList<ContentValues> values = null;\n\n\t\ttry {\t\t\t\t\n\n\t\t\tpublishProgress(1, 0, 0);\n\n\t\t\tvalues = new ArrayList<ContentValues>();\n\n\t\t\tDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\t\t\t\t\n\t\t\tDocumentBuilder builder;\n\n\t\t\tbuilder = factory.newDocumentBuilder();\n\t\t\tDocument document = builder.parse(file);\n\n\t\t\tElement root = document.getDocumentElement();\n\n\t\t\tif ((root != null) &&\n\t\t\t\t\t(root.getNodeName().equals(\"itemlist\"))) {\n\n\t\t\t\tNodeList itemsList = root.getElementsByTagName(\"item\");\n\n\t\t\t\tint progress = 0;\n\t\t\t\tint total = itemsList.getLength();\n\n\t\t\t\tNode item;\n\t\t\t\tNodeList record;\n\t\t\t\tNode dataItem;\n\n\t\t\t\tfor (int i = 0; i < itemsList.getLength(); i++) {\n\n\t\t\t\t\tpublishProgress(2, progress, total);\n\n\t\t\t\t\titem = itemsList.item(i);\n\n\t\t\t\t\tif (item != null) {\n\t\t\t\t\t\trecord = item.getChildNodes();\n\n\t\t\t\t\t\tString title = null;\n\t\t\t\t\t\tString url = null;\n\t\t\t\t\t\tint visits = 0;\n\t\t\t\t\t\tlong visitedDate = -1;\n\t\t\t\t\t\tlong creationDate = -1;\n\t\t\t\t\t\tint bookmark = 0;\n\n\t\t\t\t\t\tfor (int j = 0; j < record.getLength(); j++) {\n\t\t\t\t\t\t\tdataItem = record.item(j);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\tif ((dataItem != null) &&\n\t\t\t\t\t\t\t\t\t(dataItem.getNodeName() != null)) {\n\n\t\t\t\t\t\t\t\tif (dataItem.getNodeName().equals(\"title\")) {\n\t\t\t\t\t\t\t\t\ttitle = URLDecoder.decode(getNodeContent(dataItem), \"UTF-8\");\n\t\t\t\t\t\t\t\t} else if (dataItem.getNodeName().equals(\"url\")) {\n\t\t\t\t\t\t\t\t\turl = URLDecoder.decode(getNodeContent(dataItem), \"UTF-8\");\n\t\t\t\t\t\t\t\t} else if (dataItem.getNodeName().equals(\"visits\")) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tvisits = Integer.parseInt(getNodeContent(dataItem));\n\t\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\t\tvisits = 0;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (dataItem.getNodeName().equals(\"visiteddate\")) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tvisitedDate = Long.parseLong(getNodeContent(dataItem));\n\t\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\t\tvisitedDate = -1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (dataItem.getNodeName().equals(\"creationdate\")) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tcreationDate = Long.parseLong(getNodeContent(dataItem));\n\t\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\t\tcreationDate = -1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (dataItem.getNodeName().equals(\"bookmark\")) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tbookmark = Integer.parseInt(getNodeContent(dataItem));\n\t\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\t\tbookmark = 0;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalues.add(createContentValues(title, url, visits, visitedDate, creationDate, bookmark));\n\t\t\t\t\t}\n\n\t\t\t\t\tprogress++;\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t} catch (ParserConfigurationException e) {\n\t\t\treturn e.getMessage();\n\t\t} catch (SAXException e) {\n\t\t\treturn e.getMessage();\n\t\t} catch (IOException e) {\n\t\t\treturn e.getMessage();\n\t\t}\n\n\t\tif (values != null) {\n\t\t\tpublishProgress(7, 0, 0);\n\t\t\tmContext.getContentResolver().bulkInsert(BookmarksProvider.BOOKMARKS_URI, values.toArray(new ContentValues[values.size()]));\n\t\t}\n\n\t\treturn null;\n\t}\n\t\n\t/**\n\t * Get the content of a node, why Android does not include Node.getTextContent() ?\n\t * @param node The node.\n\t * @return The node content.\n\t */\n\tprivate String getNodeContent(Node node) {\n\t\tStringBuffer buffer = new StringBuffer();\n\t\tNodeList childList = node.getChildNodes();\n\t\tfor (int i = 0; i < childList.getLength(); i++) {\n\t\t\tNode child = childList.item(i);\n\t\t\tif (child.getNodeType() != Node.TEXT_NODE) {\n\t\t\t\tcontinue; // skip non-text nodes\n\t\t\t}\n\t\t\tbuffer.append(child.getNodeValue());\n\t\t}\n\n\t\treturn buffer.toString(); \n\t}\n\n\tprivate ContentValues createContentValues(String title, String url, int visits, long visitedDate, long creationDate, int bookmark) {\n\t\tContentValues values = new ContentValues();\n\t\tvalues.put(BookmarksProvider.Columns.TITLE, title);\n\t\tvalues.put(BookmarksProvider.Columns.URL, url);\n\t\tvalues.put(BookmarksProvider.Columns.VISITS, visits);\n\n\t\tif (visitedDate > 0) {\n\t\t\tvalues.put(BookmarksProvider.Columns.VISITED_DATE, visitedDate);\n\t\t} else {\n\t\t\tvalues.putNull(BookmarksProvider.Columns.VISITED_DATE);\n\t\t}\n\n\t\tif (creationDate > 0) {\n\t\t\tvalues.put(BookmarksProvider.Columns.CREATION_DATE, creationDate);\n\t\t} else {\n\t\t\tvalues.putNull(BookmarksProvider.Columns.CREATION_DATE);\n\t\t}\n\n\t\tif (bookmark > 0) {\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 1);\n\t\t} else {\n\t\t\tvalues.put(BookmarksProvider.Columns.BOOKMARK, 0);\n\t\t}\n\n\t\treturn values;\n\t}\n\t\n\t/**\n\t * Store the new id of a folder, and its\n\t * old parent id. E.g. the parent id in the export file.\n\t */\n\tprivate class Folder {\t\t\n\t\tprivate long mNewId;\n\t\tprivate long mOldParentId;\n\t\t\n\t\tpublic Folder(long newId, long oldParentId) {\t\t\t\n\t\t\tmNewId = newId;\n\t\t\tmOldParentId = oldParentId;\n\t\t}\n\t\t\n\t\tpublic long getNewId() {\n\t\t\treturn mNewId;\n\t\t}\n\t\t\n\t\tpublic long getOldParentId() {\n\t\t\treturn mOldParentId;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/tasks/SearchUrlTask.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.tasks;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.json.JSONObject;\nimport org.tint.R;\nimport org.tint.model.SearchUrlGroup;\n\nimport android.content.Context;\nimport android.os.AsyncTask;\n\npublic class SearchUrlTask extends AsyncTask<Void, Integer, String> {\n\n\tprivate Context mContext;\n\tprivate ISearchUrlTaskListener mListener;\n\t\n\tprivate Map<String, SearchUrlGroup> mResults;\n\t\n\tpublic SearchUrlTask(Context context, ISearchUrlTaskListener listener) {\n\t\tsuper();\n\t\t\n\t\tmContext = context;\n\t\tmListener = listener;\n\t\t\n\t\tmResults = new HashMap<String, SearchUrlGroup>();\n\t}\n\t\n\tpublic List<SearchUrlGroup> getResults() {\n\t\tList<SearchUrlGroup> result = new ArrayList<SearchUrlGroup>();\n\t\tfor (SearchUrlGroup group : mResults.values()) {\n\t\t\tgroup.sort();\n\t\t\tresult.add(group);\n\t\t}\n\t\t\n\t\tCollections.sort(result, new Comparator<SearchUrlGroup>() {\n\t\t\t@Override\n\t\t\tpublic int compare(SearchUrlGroup lhs, SearchUrlGroup rhs) {\t\t\t\t\t\t\n\t\t\t\treturn lhs.getName().compareTo(rhs.getName());\n\t\t\t}\t\t        \t\n        });\n\t\t\n\t\treturn result;\n\t}\n\t\n\t@Override\n\tprotected String doInBackground(Void... params) {\n\t\t\n\t\tpublishProgress(0);\n\t\t\n\t\tString message = null;\n\t\tHttpURLConnection c = null;\t\t\n\t\t\n\t\ttry {\n\t\t\tURL url = new URL(\"http://anasthase.github.com/TintBrowser/search-engines.json\");\n\t\t\tc = (HttpURLConnection) url.openConnection();\n\t\t\t\n\t\t\tc.connect();\n\t\t\t\n\t\t\tint responseCode = c.getResponseCode();\n\t\t\t\n\t\t\tif (responseCode == 200) {\n\t\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\t\t\n\t\t\t\tInputStream is = c.getInputStream();\n\t\t\t\tBufferedReader reader = new BufferedReader(new InputStreamReader(is));\n\t\t\t\t\n\t\t\t\tString line;\n\t\t        while ((line = reader.readLine()) != null) {\n\t\t        \tsb.append(line);\n\t\t        }\n\t\t        \n\t\t        publishProgress(1);\n\t\t        \n\t\t        JSONArray jsonArray = new JSONArray(sb.toString());\n\t\t        \n\t\t        for (int i = 0; i < jsonArray.length(); i++) {\n\t\t        \tJSONObject jsonObject = jsonArray.getJSONObject(i);\n\t\t        \t\n\t\t        \tString groupName = jsonObject.getString(\"group\");\n\t\t        \t\n\t\t        \tSearchUrlGroup group = mResults.get(groupName);\n\t\t        \tif (group == null) {\n\t\t        \t\tgroup = new SearchUrlGroup(groupName);\n\t\t        \t\tmResults.put(groupName, group);\n\t\t        \t}\n\t\t        \t\n\t\t        \tJSONArray items = jsonObject.getJSONArray(\"items\");\n\t\t        \tfor (int j = 0; j < items.length(); j++) {\n\t\t        \t\tJSONObject item = items.getJSONObject(j);\n\t\t        \t\t\n\t\t        \t\tgroup.addItem(\n\t\t        \t\t\t\titem.getString(\"name\"),\n\t\t        \t\t\t\titem.getString(\"url\"));\n\t\t        \t}\n\t\t        }\n\t\t        \n\t\t\t} else {\n\t\t\t\tmessage = String.format(mContext.getString(R.string.SearchUrlBadResponseCodeMessage), Integer.toString(responseCode));\n\t\t\t}\n\t\t\t\n\t\t} catch (MalformedURLException e) {\n\t\t\tmessage = e.getMessage();\n\t\t} catch (IOException e) {\n\t\t\tmessage = e.getMessage();\n\t\t} catch (JSONException e) {\n\t\t\tmessage = e.getMessage();\n\t\t} finally {\n\t\t\tif (c != null) {\n\t\t\t\tc.disconnect();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn message;\n\t}\n\t\n\t@Override\n\tprotected void onProgressUpdate(Integer... values) {\n\t\tif (mListener != null) {\n\t\t\tmListener.onProgress(values[0]);\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected void onPostExecute(String result) {\n\t\tif (mListener != null) {\n\t\t\tmListener.onDone(result);\n\t\t}\n\t}\n\t\n\tpublic interface ISearchUrlTaskListener {\n\t\t\n\t\tvoid onProgress(int step);\t\t\n\t\tvoid onDone(String result);\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/tasks/ThumbnailSaver.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.tasks;\n\nimport org.tint.providers.BookmarksWrapper;\n\nimport android.content.ContentResolver;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Picture;\nimport android.os.AsyncTask;\n\npublic class ThumbnailSaver extends AsyncTask<Void, Void, Void> {\n\n\tprivate ContentResolver mContentResolver;\n\tprivate String mUrl;\n\tprivate String mOriginalUrl;\n\t\n\tprivate Picture mPicture;\n\t\n\tprivate int mCaptureWidth;\n\tprivate int mCaptureHeight;\n\t\n\tpublic ThumbnailSaver(ContentResolver contentResolver, String url, String originalUrl, Picture picture, int[] dimensions) {\n\t\tmContentResolver = contentResolver;\n\t\tmUrl = url;\n\t\tmOriginalUrl = originalUrl;\n\t\t\n\t\tmPicture = picture;\n\t\t\n\t\tmCaptureWidth = dimensions[0];\n\t\tmCaptureHeight = dimensions[1];\n\t}\n\t\n\t@Override\n\tprotected Void doInBackground(Void... params) {\n\t\tif (mPicture != null) {\n\t\t\tBitmap bm = Bitmap.createBitmap(mCaptureWidth, mCaptureHeight, Bitmap.Config.ARGB_8888);\n\n\t\t\tCanvas canvas = new Canvas(bm);\n\n\t\t\tPaint p = new Paint(Paint.ANTI_ALIAS_FLAG);\n\t\t\tp.setColor(0xFFFFFFFF);\n\t\t\tcanvas.drawRect(0, 0, mCaptureWidth, mCaptureHeight, p);\n\n\t\t\tfloat scale = mCaptureWidth / (float) mPicture.getWidth();\n\t\t\tcanvas.scale(scale, scale);\n\n\t\t\tmPicture.draw(canvas);\n\n\t\t\tBookmarksWrapper.updateThumbnail(mContentResolver, mUrl, mOriginalUrl, bm);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/tasks/UpdateFaviconTask.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.tasks;\n\nimport org.tint.providers.BookmarksWrapper;\n\nimport android.content.ContentResolver;\nimport android.graphics.Bitmap;\nimport android.os.AsyncTask;\n\npublic class UpdateFaviconTask extends AsyncTask<Void, Void, Void> {\n\n\tprivate ContentResolver mContentResolver;\n\tprivate String mUrl;\n\tprivate String mOriginalUrl;\n\tprivate Bitmap mFavicon;\n\t\n\tpublic UpdateFaviconTask(ContentResolver contentResolver, String url, String originalUrl, Bitmap favicon) {\n\t\tmContentResolver = contentResolver;\n\t\tmUrl = url;\n\t\tmOriginalUrl = originalUrl;\n\t\tmFavicon = favicon;\n\t}\n\t\n\t@Override\n\tprotected Void doInBackground(Void... params) {\n\t\tBookmarksWrapper.updateFavicon(mContentResolver, mUrl, mOriginalUrl, mFavicon);\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/tasks/UpdateHistoryTask.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.tasks;\n\nimport java.util.Date;\n\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.utils.Constants;\n\nimport android.app.Activity;\nimport android.content.ContentResolver;\nimport android.content.SharedPreferences.Editor;\nimport android.os.AsyncTask;\nimport android.preference.PreferenceManager;\n\npublic class UpdateHistoryTask extends AsyncTask<String, Void, Void> {\n\n\tprivate static final long DAY_IN_MILLISECONDS = 24 * 3600 * 1000;\n\t\n\tprivate Activity mActivity;\n\tprivate ContentResolver mContentResolver;\n\t\n\tpublic UpdateHistoryTask(Activity activity) {\n\t\tmActivity = activity;\n\t\tmContentResolver = mActivity.getContentResolver();\n\t}\n\t\n\t@Override\n\tprotected Void doInBackground(String... params) {\n\t\tString title = params[0];\n\t\tString url = params[1];\n\t\tString originalUrl = params[2];\n\t\t\n\t\tBookmarksWrapper.updateHistory(mContentResolver, title, url, originalUrl);\n\t\t\n\t\t// Truncate history at most once a day.\n\t\tlong lastTruncation = PreferenceManager.getDefaultSharedPreferences(mActivity).getLong(Constants.TECHNICAL_PREFERENCE_LAST_HISTORY_TRUNCATION, -1);\n\t\tlong now = new Date().getTime();\n\t\t\n\t\tif ((lastTruncation < 0) ||\n\t\t\t\t(now - lastTruncation > DAY_IN_MILLISECONDS)) {\n\t\t\tBookmarksWrapper.truncateHistory(mContentResolver, PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HISTORY_SIZE, \"30\"));\n\t\t\t\n\t\t\tEditor prefEditor = PreferenceManager.getDefaultSharedPreferences(mActivity).edit();\n\t\t\tprefEditor.putLong(Constants.TECHNICAL_PREFERENCE_LAST_HISTORY_TRUNCATION, now);\n\t\t\tprefEditor.commit();\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/activities/BookmarksActivity.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.activities;\n\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicReference;\n\nimport org.tint.R;\nimport org.tint.addons.AddonMenuItem;\nimport org.tint.controllers.Controller;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.tasks.HistoryBookmarksExportTask;\nimport org.tint.tasks.HistoryBookmarksImportTask;\nimport org.tint.ui.fragments.BookmarksFragment;\nimport org.tint.ui.fragments.HistoryFragment;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.ui.preferences.IHistoryBookmaksExportListener;\nimport org.tint.ui.preferences.IHistoryBookmaksImportListener;\nimport org.tint.ui.tabs.GenericTabListener;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\nimport org.tint.utils.IOUtils;\n\nimport android.app.ActionBar;\nimport android.app.AlertDialog;\nimport android.app.ProgressDialog;\nimport android.app.ActionBar.Tab;\nimport android.app.Activity;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.DialogInterface.OnClickListener;\nimport android.content.SharedPreferences.Editor;\nimport android.database.Cursor;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.preference.PreferenceManager;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\npublic class BookmarksActivity extends Activity implements IHistoryBookmaksExportListener, IHistoryBookmaksImportListener {\n\t\n\tprivate static final String EXTRA_SELECTED_TAB_INDEX = \"EXTRA_SELECTED_TAB_INDEX\";\n\t\n\tprivate UIManager mUIManager;\n\t\n\tprivate ProgressDialog mProgress;\n\t\n\tprivate HistoryBookmarksImportTask mImportTask;\n\tprivate HistoryBookmarksExportTask mExportTask;\n\t\n\tprivate static final AtomicReference<AsyncTask<String, Integer, String>> mImportSyncThread =\n\t\t      new AtomicReference<AsyncTask<String, Integer, String>>();\n\t\n\tprivate static final AtomicReference<AsyncTask<Cursor, Integer, String>> mExportSyncThread =\n\t\t      new AtomicReference<AsyncTask<Cursor, Integer, String>>();\n\t\n\t@Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setTitle(R.string.BookmarksTitle);\n        \n        mUIManager = Controller.getInstance().getUIManager();\n        \n        ActionBar actionBar = getActionBar();\n        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        \n        actionBar.setHomeButtonEnabled(true);\n        actionBar.setDisplayHomeAsUpEnabled(true);\n        \n        Tab tab = actionBar.newTab();\n        tab.setText(R.string.BookmarksTabTitle);\n        tab.setTabListener(new GenericTabListener<BookmarksFragment>(this, \"bookmarks\", BookmarksFragment.class));\n        actionBar.addTab(tab);\n        \n        tab = actionBar.newTab();\n        tab.setText(R.string.HistoryTabTitle);\n        tab.setTabListener(new GenericTabListener<HistoryFragment>(this, \"history\", HistoryFragment.class));\n        actionBar.addTab(tab);\n        \n        if ((savedInstanceState != null) &&\n        \t\t(savedInstanceState.containsKey(EXTRA_SELECTED_TAB_INDEX))) {\n        \tint selectedIndex = savedInstanceState.getInt(EXTRA_SELECTED_TAB_INDEX);\n        \t\n        \tif ((selectedIndex == 0) ||\n        \t\t\t(selectedIndex == 1)) {\n        \t\tactionBar.setSelectedNavigationItem(selectedIndex);\n        \t}\n        }\n\t}\n\n\t@Override\n\tprotected void onSaveInstanceState(Bundle outState) {\n\t\tsuper.onSaveInstanceState(outState);\n\t\toutState.putInt(EXTRA_SELECTED_TAB_INDEX, getActionBar().getSelectedNavigationIndex());\n\t}\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(final Menu menu) {\n\t\tgetMenuInflater().inflate(R.menu.bookmarks_activity_menu, menu);\n\t\t\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean onPrepareOptionsMenu(Menu menu) {\n\t\tsuper.onPrepareOptionsMenu(menu);\n\n\t\tif (getActionBar().getSelectedNavigationIndex() == 0) {\n\t\t\tmenu.findItem(R.id.BookmarksActivityMenuSortBookmarks).setVisible(true);\n\t\t} else {\n\t\t\tmenu.findItem(R.id.BookmarksActivityMenuSortBookmarks).setVisible(false);\n\t\t}\n\t\t\n\t\tmenu.removeGroup(R.id.BookmarksActivity_AddonsMenuGroup);\n\t\t\n\t\tList<AddonMenuItem> contributedMenuItems = Controller.getInstance().getAddonManager().getContributedHistoryBookmarksMenuItems(mUIManager.getCurrentWebView());\n\t\tfor (AddonMenuItem item : contributedMenuItems) {\n\t\t\tmenu.add(R.id.BookmarksActivity_AddonsMenuGroup, item.getAddon().getMenuId(), 0, item.getMenuItem());\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\tcase android.R.id.home:\n\t\t\tsetResult(RESULT_CANCELED);\n            finish();\n\t\t\treturn true;\n\t\t\t\n\t\tcase R.id.BookmarksActivityMenuAddBookmark:\n\t\t\tIntent i = new Intent(this, EditBookmarkActivity.class);\n\t\t\ti.putExtra(Constants.EXTRA_ID, -1);\n\t\t\tstartActivity(i);\n\t\t\t\n\t\t\treturn true;\n\t\t\t\n\t\tcase R.id.BookmarksActivityMenuSortBookmarks:\n\t\t\tchangeSortMode();\n\t\t\treturn true;\n\t\t\t\n\t\tcase R.id.BookmarksActivityMenuImportHistoryBookmarks:\n\t\t\timportHistoryBookmarks();\n\t\t\treturn true;\n\t\t\t\n\t\tcase R.id.BookmarksActivityMenuExportHistoryBookmarks:\n\t\t\texportHistoryBookmarks();\n\t\t\treturn true;\n\t\t\t\n\t\tcase R.id.BookmarksActivityMenuClearHistoryBookmarks:\n\t\t\tclearHistoryBookmarks();\n\t\t\treturn true;\n\t\t\t\n\t\tdefault:\n\t\t\tif (Controller.getInstance().getAddonManager().onContributedHistoryBookmarksMenuItemSelected(\n\t\t\t\t\tthis,\n\t\t\t\t\titem.getItemId(),\n\t\t\t\t\tmUIManager.getCurrentWebView())) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn super.onContextItemSelected(item);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onExportProgress(int step, int progress, int total) {\n\t\tswitch(step) {\n\t\tcase 0:\n\t\t\tmProgress.setMessage(getString(R.string.HistoryBookmarksExportCheckCardMessage));\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tmProgress.setMessage(String.format(getString(R.string.HistoryBookmarksExportProgressMessage), progress, total));\n\t\t\tbreak;\n\t\tdefault: break;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onExportDone(String message) {\n\t\tmExportSyncThread.compareAndSet(mExportTask, null);\n\t\tmProgress.dismiss();\n\t\t\n\t\tif (message != null) {\n\t\t\tApplicationUtils.showErrorDialog(this,\n\t\t\t\t\tgetString(R.string.HistoryBookmarksExportErrorTitle),\n\t\t\t\t\tString.format(getString(R.string.HistoryBookmarksExportErrorMessage), message));\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onImportProgress(int step, int progress, int total) {\n\t\tswitch(step) {\n\t\tcase 0:\n\t\t\tmProgress.setMessage(getString(R.string.HistoryBookmarksImportReadingFile));\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tmProgress.setMessage(getString(R.string.HistoryBookmarksImportParsingFile));\n\t\t\tbreak;\n\t\tcase 2:\t\t\t\n\t\t\tmProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportProgressMessage), progress, total));\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tmProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportFoldersProgressMessage), progress, total));\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tmProgress.setMessage(getString(R.string.HistoryBookmarksImportFoldersLinkMessage));\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tmProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportBookmarksProgressMessage), progress, total));\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tmProgress.setMessage(String.format(getString(R.string.HistoryBookmarksImportHistoryProgressMessage), progress, total));\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tmProgress.setMessage(getString(R.string.HistoryBookmarksImportInsertMessage));\n\t\t\tbreak;\n\t\tdefault: break;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onImportDone(String message) {\n\t\tmImportSyncThread.compareAndSet(mImportTask, null);\n\t\tmProgress.dismiss();\n\t\t\n\t\tif (message != null) {\n\t\t\tApplicationUtils.showErrorDialog(this,\n\t\t\t\t\tgetString(R.string.HistoryBookmarksImportErrorTitle),\n\t\t\t\t\tString.format(getString(R.string.HistoryBookmarksImportErrorMessage), message));\n\t\t}\n\t}\n\t\n\tprivate void importHistoryBookmarks() {\n\t\tList<String> exportedFiles = IOUtils.getExportedBookmarksFileList();\t\t    \t\n    \tfinal String[] choices = exportedFiles.toArray(new String[exportedFiles.size()]);\n    \t\n    \tAlertDialog.Builder builder = new AlertDialog.Builder(this);\n    \tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n    \tbuilder.setTitle(getResources().getString(R.string.HistoryBookmarksImportSourceTitle));\n    \tbuilder.setSingleChoiceItems(choices, 0, new OnClickListener() {\n    \t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\n\t\t\t\tdialog.dismiss();\n\t\t\t\t\n\t\t\t\tmImportTask = new HistoryBookmarksImportTask(BookmarksActivity.this, BookmarksActivity.this);\n\t\t\t\t\n\t\t\t\tmProgress = ProgressDialog.show(BookmarksActivity.this,\n\t\t\t\t\t\tgetString(R.string.HistoryBookmarksImportTitle),\n\t\t\t\t\t\tgetString(R.string.HistoryBookmarksImportInitialMessage),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tfalse);\n\t\t\t\t\n\t\t\t\tmProgress.show();\n\t\t\t\t\n\t\t\t\tboolean retVal = mImportSyncThread.compareAndSet(null, mImportTask);\n\t\t\t\tif (retVal) {\n\t\t\t\t\tmImportTask.execute(choices[which]);\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t}    \t\t\n    \t});    \t\n    \t\n    \tbuilder.setCancelable(true);\n    \tbuilder.setNegativeButton(R.string.Cancel, null);\n    \t\n    \tAlertDialog alert = builder.create();\n    \talert.show();\n\t}\n\t\n\tprivate void exportHistoryBookmarks() {\n\t\tmExportTask = new HistoryBookmarksExportTask(this, this);\n\t\t\n\t\tmProgress = ProgressDialog.show(this,\n\t\t\t\tgetString(R.string.HistoryBookmarksExportTitle),\n\t\t\t\tgetString(R.string.HistoryBookmarksExportInitialMessage),\n\t\t\t\ttrue,\n\t\t\t\tfalse);\n\t\t\n\t\tmProgress.show();\n\t\t\n\t\tboolean retVal = mExportSyncThread.compareAndSet(null, mExportTask);\n\t\tif (retVal) {\n\t\t\tmExportTask.execute(BookmarksWrapper.getAllHistoryBookmarks(getContentResolver()));\n\t\t}\n\t}\n\t\n\tprivate void clearHistoryBookmarks() {\n\t\tAlertDialog.Builder builder = new AlertDialog.Builder(this);\n    \tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n    \tbuilder.setTitle(getResources().getString(R.string.HistoryBookmarksClearTitle));\n    \tbuilder.setSingleChoiceItems(getResources().getStringArray(R.array.ClearHistoryBookmarksChoice), 0, new OnClickListener() {\n\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tdialog.dismiss();\n\t\t\t\t\n\t\t\t\tswitch (which) {\n\t\t\t\tcase 0:\n\t\t\t\t\tBookmarksWrapper.clearHistoryAndOrBookmarks(getContentResolver(), true, false);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase 1:\n\t\t\t\t\tBookmarksWrapper.clearHistoryAndOrBookmarks(getContentResolver(), false, true);\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 2:\n\t\t\t\t\tBookmarksWrapper.clearHistoryAndOrBookmarks(getContentResolver(), true, true);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n    \t\t\n    \t});\n    \t\n    \tbuilder.setCancelable(true);\n    \tbuilder.setNegativeButton(R.string.Cancel, null);\n    \t\n    \tAlertDialog alert = builder.create();\n    \talert.show();\n\t}\n\t\n\tprivate void changeSortMode() {\n\t\tint currentSort = PreferenceManager.getDefaultSharedPreferences(this).getInt(Constants.PREFERENCE_BOOKMARKS_SORT_MODE, 0);\n    \t\n    \tAlertDialog.Builder builder = new AlertDialog.Builder(this);\n    \t\n    \tbuilder.setInverseBackgroundForced(true);\n    \tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n    \tbuilder.setTitle(getResources().getString(R.string.SortBookmarks));\n    \t\n    \tbuilder.setSingleChoiceItems(\n    \t\t\tnew String[] {\n    \t\t\t\t\tgetResources().getString(R.string.MostUsedSortMode),\n    \t\t\t\t\tgetResources().getString(R.string.AlphaSortMode),\n    \t\t\t\t\tgetResources().getString(R.string.RecentSortMode)\n    \t\t\t},\n    \t\t\tcurrentSort,\n    \t\t\tnew OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(BookmarksActivity.this).edit();\n\t\t    \teditor.putInt(Constants.PREFERENCE_BOOKMARKS_SORT_MODE, which);\n\t\t    \teditor.commit();\n\t\t\t\t\n\t\t\t\tdialog.dismiss();\t\t\t\t\n\t\t\t}    \t\t\n    \t});\n    \t\n    \tbuilder.setCancelable(true);\n    \tbuilder.setNegativeButton(android.R.string.cancel, null);\n    \t\n    \tAlertDialog alert = builder.create();\n    \talert.show();\t\t\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/ui/activities/EditBookmarkActivity.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.activities;\n\nimport java.util.List;\n\nimport org.tint.R;\nimport org.tint.model.FolderItem;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.utils.Constants;\n\nimport android.app.ActionBar;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.OnItemSelectedListener;\nimport android.widget.ArrayAdapter;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.Spinner;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\npublic class EditBookmarkActivity extends Activity {\n\n\tprivate long mId = -1;\n\t\n\tprivate EditText mLabel;\n\tprivate EditText mUrl;\n\t\n\tprivate Spinner mFoldersSpinner;\n\t\n\tprivate EditText mNewFolderName;\n\t\n\tprivate Button mOk;\n\tprivate Button mCancel;\n\t\n\tprivate List<FolderItem> mFolders;\n\t\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\t\t\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.edit_bookmark_activity);\n\t\tsetTitle(R.string.AddBookmarkTitle);\n\t\t\n\t\tActionBar actionBar = getActionBar();\n\t\tif (actionBar != null) {\n\t\t\tactionBar.setHomeButtonEnabled(true);\n\t\t\tactionBar.setDisplayHomeAsUpEnabled(true);\n\t\t}\n        \n\t\tmFolders = BookmarksWrapper.getFirstLevelFoldersList(getContentResolver());\n\t\tmFolders.add(0, new FolderItem(-1, getString(R.string.Bookmarks)));\n\t\tmFolders.add(0, new FolderItem(-2, getString(R.string.NewFolder)));\n\t\t\n        mLabel = (EditText) findViewById(R.id.EditBookmarkActivity_LabelEdit);\n        mUrl = (EditText) findViewById(R.id.EditBookmarkActivity_UrlEdit);\n        \n        mFoldersSpinner = (Spinner) findViewById(R.id.EditBookmarkActivity_FolderSpinner);\n        \n        FoldersAdapter adapter = new FoldersAdapter(this, mFolders);\n        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n        mFoldersSpinner.setAdapter(adapter);\n        \n        mFoldersSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {\n\n\t\t\t@Override\n\t\t\tpublic void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {\n\t\t\t\tif (position == 0) {\n\t\t\t\t\tmNewFolderName.setVisibility(View.VISIBLE);\n\t\t\t\t\tmNewFolderName.requestFocus();\n\t\t\t\t} else {\n\t\t\t\t\tmNewFolderName.setVisibility(View.GONE);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void onNothingSelected(AdapterView<?> arg0) { }\n\t\t});\n        \n        // Default to root folder.\n        mFoldersSpinner.setSelection(1);\n        \n        mNewFolderName = (EditText) findViewById(R.id.EditBookmarkActivity_FolderValue);\n        \n        mOk = (Button) findViewById(R.id.EditBookmarkActivity_OK);\n        mOk.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\tif (save()) {\n\t\t\t\t\tsetResult(RESULT_OK);\n\t\t\t\t\tfinish();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        \n        mCancel = (Button) findViewById(R.id.EditBookmarkActivity_Cancel);\n        mCancel.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\tsetResult(RESULT_CANCELED);\n\t            finish();\n\t\t\t}\n\t\t});\n        \n        Bundle extras = getIntent().getExtras();\n    \tif (extras != null) {\n    \t\tString label = extras.getString(Constants.EXTRA_LABEL);\n    \t\tif (!TextUtils.isEmpty(label)) {\n    \t\t\tmLabel.setText(label);\n    \t\t}\n    \t\t\n    \t\tString url = extras.getString(Constants.EXTRA_URL);\n    \t\tif (!TextUtils.isEmpty(url)) {\n    \t\t\tmUrl.setText(url);\n    \t\t}\n    \t\t\n    \t\t// This is a bit dirty...\n    \t\tlong folderId = extras.getLong(Constants.EXTRA_FOLDER_ID);\n    \t\tif (folderId != -1) {\n    \t\t\tfor (int i = 0; i < mFolders.size(); i++) {\n    \t\t\t\tif (mFolders.get(i).getId() == folderId) {\n    \t\t\t\t\tmFoldersSpinner.setSelection(i);\n    \t\t\t\t\tbreak;\n    \t\t\t\t}\n    \t\t\t}\n    \t\t}\n    \t\t\n    \t\tmId = extras.getLong(Constants.EXTRA_ID);\n    \t}\n\t}\n\t\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\tcase android.R.id.home:\n\t\t\tsetResult(RESULT_CANCELED);\n            finish();\n\t\t\treturn true;\n\t\tdefault: return super.onContextItemSelected(item);\n\t\t }\n\t}\n\t\n\tprivate boolean save() {\n\t\tString label = mLabel.getText().toString();\n\t\tString url = mUrl.getText().toString();\n\t\t\n\t\tif ((!TextUtils.isEmpty(label)) &&\n\t\t\t\t(!TextUtils.isEmpty(url))) {\n\t\t\t\n\t\t\tlong folderId = -1;\n\t\t\tint folderSpinnerSelection = mFoldersSpinner.getSelectedItemPosition();\n\t\t\t\n\t\t\tswitch (folderSpinnerSelection) {\n\t\t\tcase 0:\n\t\t\t\tif (TextUtils.isEmpty(mNewFolderName.getText().toString())) {\n\t\t\t\t\tToast.makeText(this, R.string.ProvideNewFolderName, Toast.LENGTH_SHORT).show();\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\tfolderId = BookmarksWrapper.getFolderId(getContentResolver(), mNewFolderName.getText().toString(), true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase 1:\n\t\t\t\tfolderId = -1;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfolderId = mFolders.get(folderSpinnerSelection).getId();\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tBookmarksWrapper.setAsBookmark(getContentResolver(), mId, folderId, label, url, true);\n\t\t\treturn true;\n\t\t} else {\n\t\t\tToast.makeText(this, R.string.AddBookmarkLabelOrUrlEmpty, Toast.LENGTH_SHORT).show();\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate class FoldersAdapter extends ArrayAdapter<FolderItem> {\n\t\t\n\t\tpublic FoldersAdapter(Context context, List<FolderItem> values) {\n\t\t\tsuper(context, android.R.layout.simple_spinner_item, android.R.id.text1, values);\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\tView v = super.getView(position, convertView, parent);\n\t\t\t\n\t\t\tTextView tv = (TextView) v.findViewById(android.R.id.text1);\n\t\t\ttv.setText(getItem(position).getTitle());\n\t\t\t\n\t\t\treturn v;\n\t\t}\n\n\t\t@Override\n\t\tpublic View getDropDownView(int position, View convertView,\tViewGroup parent) {\n\t\t\tView v = super.getDropDownView(position, convertView, parent);\n\t\t\t\n\t\t\tTextView tv = (TextView) v.findViewById(android.R.id.text1);\n\t\t\ttv.setText(getItem(position).getTitle());\n\t\t\t\n\t\t\treturn v;\n\t\t}\n\n\t\t\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/activities/TintBrowserActivity.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.activities;\n\nimport java.util.List;\nimport java.util.Random;\nimport java.util.Set;\n\nimport org.tint.R;\nimport org.tint.addons.AddonMenuItem;\nimport org.tint.controllers.Controller;\nimport org.tint.model.DownloadItem;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.dialogs.YesNoRememberDialog;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.managers.UIFactory;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.ui.preferences.PreferencesActivity;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\n\nimport android.app.ActionBar.OnMenuVisibilityListener;\nimport android.app.Activity;\nimport android.app.DownloadManager;\nimport android.app.DownloadManager.Query;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.Editor;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.content.res.Configuration;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.preference.PreferenceManager;\nimport android.view.ActionMode;\nimport android.view.KeyEvent;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.webkit.WebIconDatabase;\nimport android.widget.Toast;\n\npublic class TintBrowserActivity extends Activity {\n    \n\tpublic static final int ACTIVITY_BOOKMARKS = 0;\n\tpublic static final int ACTIVITY_OPEN_FILE_CHOOSER = 1;\n\t\n\tpublic static final int CONTEXT_MENU_OPEN = Menu.FIRST + 10;\n\tpublic static final int CONTEXT_MENU_OPEN_IN_NEW_TAB = Menu.FIRST + 11;\n\tpublic static final int CONTEXT_MENU_OPEN_IN_BACKGROUND = Menu.FIRST + 12;\n\tpublic static final int CONTEXT_MENU_DOWNLOAD = Menu.FIRST + 13;\n\tpublic static final int CONTEXT_MENU_COPY = Menu.FIRST + 14;\n\tpublic static final int CONTEXT_MENU_SEND_MAIL = Menu.FIRST + 15;\n\tpublic static final int CONTEXT_MENU_SHARE = Menu.FIRST + 16;\n\t\n\tprivate OnSharedPreferenceChangeListener mPreferenceChangeListener;\n\t\n\tprivate UIManager mUIManager;\n\t\n\tprivate BroadcastReceiver mDownloadsReceiver = new BroadcastReceiver() {\n\t\t@Override\n\t\tpublic void onReceive(Context context, Intent intent) {\n\t\t\tonReceivedDownloadNotification(context, intent);\n\t\t}\n\t};\n\t\n\tprivate BroadcastReceiver mPackagesReceiver = new BroadcastReceiver() {\n\t\t@Override\n\t\tpublic void onReceive(Context context, Intent intent) {\n\t\t\tController.getInstance().getAddonManager().unbindAddons();\n\t\t\tController.getInstance().getAddonManager().bindAddons();\n\t\t}\t\t\n\t};\n\t\n\tprivate IntentFilter mPackagesFilter;\n\t\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        \n        setContentView(UIFactory.getMainLayout(this));\n    \tmUIManager = UIFactory.createUIManager(this);\n        \n        getActionBar().setHomeButtonEnabled(true);\n        \n        getActionBar().addOnMenuVisibilityListener(new OnMenuVisibilityListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onMenuVisibilityChanged(boolean isVisible) {\n\t\t\t\tmUIManager.onMenuVisibilityChanged(isVisible);\n\t\t\t}\n\t\t});\n        \n        Controller.getInstance().init(mUIManager, this);        \n        Controller.getInstance().getAddonManager().bindAddons();\n        \n        initializeWebIconDatabase();\n        \n        mPreferenceChangeListener = new OnSharedPreferenceChangeListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\t\t\tmUIManager.onSharedPreferenceChanged(sharedPreferences, key);\n\t\t\t\t\n\t\t\t\t// If the user changed the history size, reset the last history truncation date.\n\t\t\t\tif (Constants.PREFERENCE_HISTORY_SIZE.equals(key)) {\n\t\t\t\t\tEditor prefEditor = sharedPreferences.edit();\n\t\t\t\t\tprefEditor.putLong(Constants.TECHNICAL_PREFERENCE_LAST_HISTORY_TRUNCATION, -1);\n\t\t\t\t\tprefEditor.commit();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t\n\t\tfinal SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\n\t\t\n\t\tprefs.registerOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t\t\n\t\tmPackagesFilter = new IntentFilter();\n\t\tmPackagesFilter.addAction( Intent.ACTION_PACKAGE_ADDED  );\n\t\tmPackagesFilter.addAction( Intent.ACTION_PACKAGE_REPLACED );\n\t\tmPackagesFilter.addAction( Intent.ACTION_PACKAGE_REMOVED );\n\t\tmPackagesFilter.addCategory( Intent.CATEGORY_DEFAULT ); \n\t\tmPackagesFilter.addDataScheme( \"package\" );\n\t\t\n\t\tregisterReceiver(mPackagesReceiver, mPackagesFilter);\n        \n\t\tIntent startIntent = getIntent();\n\t\t\n\t\tboolean firstRun = prefs.getBoolean(Constants.TECHNICAL_PREFERENCE_FIRST_RUN, true);\n\t\tif (firstRun) {\n\t\t\tEditor editor = prefs.edit();\n\t\t\teditor.putBoolean(Constants.TECHNICAL_PREFERENCE_FIRST_RUN, false);\n\t\t\teditor.putInt(Constants.TECHNICAL_PREFERENCE_LAST_RUN_VERSION_CODE, ApplicationUtils.getApplicationVersionCode(this));\n\t\t\teditor.commit();\n\t\t\t\t\t\t\n\t\t\tBookmarksWrapper.fillDefaultBookmaks(\n\t\t\t\t\tgetContentResolver(),\n\t\t\t\t\tgetResources().getStringArray(R.array.DefaultBookmarksTitles),\n\t\t\t\t\tgetResources().getStringArray(R.array.DefaultBookmarksUrls));\n\t\t\t\n\t\t\t// Show tutorial only on phones.\n\t\t\tif (!UIFactory.isTablet(this)) {\n\t\t\t\tstartIntent = new Intent(Intent.ACTION_VIEW);\n\t\t\t\tstartIntent.setData(Uri.parse(Constants.URL_ABOUT_TUTORIAL));\n\t\t\t}\n\t\t\t\n\t\t} else {\n\t\t\tint currentVersionCode = ApplicationUtils.getApplicationVersionCode(this);\n\t\t\tint savedVersionCode = prefs.getInt(Constants.TECHNICAL_PREFERENCE_LAST_RUN_VERSION_CODE, -1);\n\t\t\t\n\t\t\tif (currentVersionCode != savedVersionCode) {\n\t\t\t\tEditor editor = prefs.edit();\n\t\t\t\teditor.putInt(Constants.TECHNICAL_PREFERENCE_LAST_RUN_VERSION_CODE, currentVersionCode);\n\t\t\t\teditor.commit();\n\t\t\t\t\n\t\t\t\t// Show tutorial only on phones.\n\t\t\t\tif (!UIFactory.isTablet(this)) {\n\t\t\t\t\t// Version code 9 introduce the new phone UI.\n\t\t\t\t\tif (savedVersionCode < 9) {\n\t\t\t\t\t\tstartIntent = new Intent(Intent.ACTION_VIEW);\n\t\t\t\t\t\tstartIntent.setData(Uri.parse(Constants.URL_ABOUT_TUTORIAL));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tmUIManager.onNewIntent(startIntent);\n\t\t\n\t\tif (prefs.contains(Constants.TECHNICAL_PREFERENCE_SAVED_TABS)) {\n\t\t\tfinal Set<String> tabs = prefs.getStringSet(Constants.TECHNICAL_PREFERENCE_SAVED_TABS, null);\n\t\t\t\n\t\t\tif ((tabs != null) &&\n\t\t\t\t\t(!tabs.isEmpty())) {\n\t\t\t\t\n\t\t\t\tString tabsRestoreMode = prefs.getString(Constants.PREFERENCE_RESTORE_TABS, \"ASK\");\n\t\t\t\t\n\t\t\t\tif (\"ASK\".equals(tabsRestoreMode)) {\n\t\t\t\t\tfinal YesNoRememberDialog dialog = new YesNoRememberDialog(this);\n\t\t\t\t\t\n\t\t\t\t\tdialog.setTitle(R.string.RestoreTabsDialogTitle);\n\t\t\t\t\tdialog.setMessage(R.string.RestoreTabsDialogMessage);\n\t\t\t\t\t\n\t\t\t\t\tdialog.setPositiveButtonListener(new OnClickListener() {\n\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic void onClick(View v) {\n\t\t\t\t\t\t\tdialog.dismiss();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (dialog.isRememberChecked()) {\n\t\t\t\t\t\t\t\tEditor editor = prefs.edit();\n\t\t\t\t\t\t\t\teditor.putString(Constants.PREFERENCE_RESTORE_TABS, \"ALWAYS\");\n\t\t\t\t\t\t\t\teditor.commit();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\trestoreTabs(tabs);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tdialog.setNegativeButtonListener(new OnClickListener() {\n\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic void onClick(View v) {\n\t\t\t\t\t\t\tdialog.dismiss();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (dialog.isRememberChecked()) {\n\t\t\t\t\t\t\t\tEditor editor = prefs.edit();\n\t\t\t\t\t\t\t\teditor.putString(Constants.PREFERENCE_RESTORE_TABS, \"NEVER\");\n\t\t\t\t\t\t\t\teditor.commit();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tdialog.show();\n\t\t\t\t} else if (\"ALWAYS\".equals(tabsRestoreMode)) {\n\t\t\t\t\trestoreTabs(tabs);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tEditor editor = prefs.edit();\n\t\t\teditor.remove(Constants.TECHNICAL_PREFERENCE_SAVED_TABS);\n\t\t\teditor.commit();\n\t\t}\t\t\n    }\n    \n    private void restoreTabs(Set<String> tabs) {\n    \tboolean first = true;\n\n\t\tfor (String url : tabs) {\n\t\t\tif (first) {\n\t\t\t\tmUIManager.loadUrl(url);\n\t\t\t\tfirst = false;\n\t\t\t} else {\n\t\t\t\tmUIManager.addTab(url, !first, false);\n\t\t\t}\n\t\t}\n    }\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(final Menu menu) {\n\t\tgetMenuInflater().inflate(UIFactory.getMainMenuLayout(this), menu);\t\t\n\t\t\n\t\treturn true;\n\t} \n\t\t\t\n\t@Override\n\tpublic boolean onPrepareOptionsMenu(Menu menu) {\n\t\tsuper.onPrepareOptionsMenu(menu);\t\t\n\t\t\n\t\tBaseWebViewFragment currentFragment = mUIManager.getCurrentWebViewFragment();\n\t\t\n\t\tmenu.setGroupEnabled(\n\t\t\t\tR.id.MainActivity_DisabledOnStartPageMenuGroup,\n\t\t\t\tcurrentFragment != null && !currentFragment.isStartPageShown());\n\t\t\n\t\tCustomWebView currentWebView = mUIManager.getCurrentWebView();\n\t\t\n\t\tboolean privateBrowsing = currentWebView != null && currentWebView.isPrivateBrowsingEnabled();\n\t\t\n\t\tmenu.findItem(R.id.MainActivity_MenuIncognitoTab).setChecked(privateBrowsing);\n\t\tmenu.findItem(R.id.MainActivity_MenuFullScreen).setChecked(mUIManager.isFullScreen());\n\t\t\n\t\tmenu.removeGroup(R.id.MainActivity_AddonsMenuGroup);\n\t\t\n\t\tif (!privateBrowsing &&\n\t\t\t\t(currentWebView != null)) {\n\t\t\tList<AddonMenuItem> contributedMenuItems = Controller.getInstance().getAddonManager().getContributedMainMenuItems(currentWebView);\n\t\t\tfor (AddonMenuItem item : contributedMenuItems) {\n\t\t\t\tmenu.add(R.id.MainActivity_AddonsMenuGroup, item.getAddon().getMenuId(), 0, item.getMenuItem());\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tIntent i;\n\t\t\n\t    switch (item.getItemId()) { \n\t        case R.id.MainActivity_MenuAddTab:\n\t        \tmUIManager.addTab(true, PreferenceManager.getDefaultSharedPreferences(this).\n\t        \t\t\tgetBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuCloseTab:\n\t        \tmUIManager.closeCurrentTab();\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuAddBookmark:\n\t        \tmUIManager.addBookmarkFromCurrentPage();\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuBookmarks:\n\t        \tmUIManager.openBookmarksActivityForResult();\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuIncognitoTab:\n\t        \tmUIManager.togglePrivateBrowsing();\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuFullScreen:\n\t        \tmUIManager.toggleFullScreen();\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuSharePage:\n\t        \tmUIManager.shareCurrentPage();\n\t        \treturn true;\n\t        \n\t        case R.id.MainActivity_MenuSearch:\n\t        \tmUIManager.startSearch();\n\t        \treturn true;\n\t        \t\n\t        case R.id.MainActivity_MenuPreferences:\n\t        \ti = new Intent(this, PreferencesActivity.class);\n\t        \tstartActivity(i);\n\t        \treturn true;\n\t        \t\n\t        default:\n\t        \tif (Controller.getInstance().getAddonManager().onContributedMainMenuItemSelected(\n\t        \t\t\tthis,\n\t        \t\t\titem.getItemId(),\n\t        \t\t\tmUIManager.getCurrentWebView())) {\n\t        \t\treturn true;\n\t        \t} else {\n\t        \t\treturn super.onOptionsItemSelected(item);\n\t        \t}\n\t    }\n\t}\n\t\n\t@Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {\n        super.onActivityResult(requestCode, resultCode, intent);\n        \n        if (requestCode == ACTIVITY_BOOKMARKS) {\n        \tif (resultCode == RESULT_OK) {        \t\n        \t\tif (intent != null) {\n            \t\tBundle b = intent.getExtras();\n            \t\tif (b != null) {\n            \t\t\tif (b.getBoolean(Constants.EXTRA_NEW_TAB)) {\n            \t\t\t\tmUIManager.addTab(false, PreferenceManager.getDefaultSharedPreferences(this).\n            \t\t\t\t\t\tgetBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));\n            \t\t\t}\n            \t\t\t\n            \t\t\tmUIManager.loadUrl(b.getString(Constants.EXTRA_URL));\n            \t\t}\n        \t\t}\n        \t}\n        } else if (requestCode == ACTIVITY_OPEN_FILE_CHOOSER) {\n        \tif (mUIManager.getUploadMessage() == null) {\n        \t\treturn;\n        \t}\n        \t\n        \tUri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();\n        \tmUIManager.getUploadMessage().onReceiveValue(result);\n        \tmUIManager.setUploadMessage(null);\n        }\n        \n        mUIManager.onActivityResult(requestCode, resultCode, intent);\n\t}\n\t\n\t@Override\n\tprotected void onNewIntent(Intent intent) {\n\t\tsuper.onNewIntent(intent);\n\t\tmUIManager.onNewIntent(intent);\n\t}\n\n\t@Override\n\tpublic boolean onKeyUp(int keyCode, KeyEvent event) {\n\t\tswitch(keyCode) {\n\t\tcase KeyEvent.KEYCODE_BACK:\n\t\t\tif (mUIManager.onKeyBack()) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tmoveTaskToBack(true);\n\t\t\t\treturn true;\n\t\t\t}\n\t\tcase KeyEvent.KEYCODE_SEARCH:\n\t\t\tif (mUIManager.onKeySearch()) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn super.onKeyUp(keyCode, event);\n\t\t\t}\n\t\tdefault: return super.onKeyUp(keyCode, event);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onConfigurationChanged(Configuration newConfig) {\n\t\tsuper.onConfigurationChanged(newConfig);\n\t}\n\t\n\t@Override\n\tprotected void onPause() {\n\t\tsuper.onPause();\n\t\t\n\t\tmUIManager.onMainActivityPause();\n\t\tunregisterReceiver(mDownloadsReceiver);\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tsuper.onResume();\n\t\t\n\t\tmUIManager.onMainActivityResume();\n\t\t\n\t\tIntentFilter filter = new IntentFilter();\n        filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);\n        filter.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED);\n\t\t\n        registerReceiver(mDownloadsReceiver, filter);\n\t}\n\n\t@Override\n\tprotected void onStart() {\t\t\n\t\tsuper.onStart();\n\t}\n\n\t@Override\n\tprotected void onStop() {\n\t\tmUIManager.saveTabs();\n\t\tsuper.onStop();\n\t}\n\n\t@Override\n\tprotected void onDestroy() {\n\t\tController.getInstance().getAddonManager().unbindAddons();\n\t\tWebIconDatabase.getInstance().close();\n\t\tPreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t\tunregisterReceiver(mPackagesReceiver);\n\t\t\n\t\tsuper.onDestroy();\n\t}\t\n\n\t@Override\n\tprotected void onSaveInstanceState(Bundle outState) {\n\t\t// TODO Do nothing for now, as default implementation mess up with tabs/fragment management.\n\t\t// In the future, save and restore tabs.\n\t\t//super.onSaveInstanceState(outState);\n\t}\n\n\t@Override\n\tprotected void onRestoreInstanceState(Bundle savedInstanceState) {\n\t\t// TODO Do nothing for now, as default implementation mess up with tabs/fragment management.\n\t\t// In the future, save and restore tabs.\n\t\t//super.onRestoreInstanceState(savedInstanceState);\n\t}\n\n\t@Override\n\tpublic void onActionModeFinished(ActionMode mode) {\t\t\n\t\tsuper.onActionModeFinished(mode);\n\t\tmUIManager.onActionModeFinished(mode);\n\t}\n\n\t@Override\n\tpublic void onActionModeStarted(ActionMode mode) {\t\t\n\t\tsuper.onActionModeStarted(mode);\n\t\tmUIManager.onActionModeStarted(mode);\n\t}\n\n\tpublic UIManager getUIManager() {\n\t\treturn mUIManager;\n\t}\n\t\n\t/**\n     * Initialize the Web icons database.\n     */\n    private void initializeWebIconDatabase() {\n        \n    \tfinal WebIconDatabase db = WebIconDatabase.getInstance();\n    \tdb.open(getDir(\"icons\", 0).getPath());   \n    }\n\t\n\tprivate void showNotification(String notificationTitle, String title, String message) {\n\t\tIntent notificationIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);\n\t\tPendingIntent contentIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, notificationIntent, 0);\n\t\t\n\t\tNotification notification =  new Notification.Builder(this)\n\t\t.setSmallIcon(android.R.drawable.stat_sys_download_done)\n\t\t.setTicker(notificationTitle)\n\t\t.setContentTitle(title)\n\t\t.setContentText(message)\n\t\t.setContentIntent(contentIntent)\n\t\t.getNotification();\n\t\tnotification.flags |= Notification.FLAG_AUTO_CANCEL;\n\t\t\n\t\t((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(new Random().nextInt(), notification);\n\t}\n\t\n\tprivate void onReceivedDownloadNotification(Context context, Intent intent) {\n\t\tif (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) {\n\t\t\tlong id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);\n\t\t\tDownloadItem item = Controller.getInstance().getDownloadItemById(id);\n\t\t\t\n\t\t\tif (item != null) {\n\t\t\t\t// This is one of our downloads.\n                final DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);\n                Query query = new Query();\n                query.setFilterById(id);\n                Cursor cursor = downloadManager.query(query);\n                \n                if (cursor.moveToFirst()) {\n                \tint localUriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);\n                    int reasonIndex = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);\n                    int statusIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);\n                    \n                    int status = cursor.getInt(statusIndex);\n                    \n                    if (status == DownloadManager.STATUS_SUCCESSFUL) {\n                    \tString localUri = cursor.getString(localUriIndex);\n                    \t\n                    \tToast.makeText(context, String.format(getString(R.string.DownloadComplete), localUri), Toast.LENGTH_SHORT).show();                    \t\n                    \tController.getInstance().getDownloadsList().remove(item);\n                    \t\n                    \tshowNotification(getString(R.string.DownloadComplete), item.getFileName(), getString(R.string.DownloadComplete));\n                    \t\n                    } else if (status == DownloadManager.STATUS_FAILED) {\n                    \tint reason = cursor.getInt(reasonIndex);\n                        \n                        String message;\n                        switch (reason) {\n                        case DownloadManager.ERROR_FILE_ERROR:\n                        case DownloadManager.ERROR_DEVICE_NOT_FOUND:                                    \n                        case DownloadManager.ERROR_INSUFFICIENT_SPACE:\n                                message = getString(R.string.DownloadErrorDisk);\n                                break;\n                        case DownloadManager.ERROR_HTTP_DATA_ERROR:\n                        case DownloadManager.ERROR_UNHANDLED_HTTP_CODE:\n                                message = getString(R.string.DownloadErrorHttp);\n                                break;\n                        case DownloadManager.ERROR_TOO_MANY_REDIRECTS:\n                                message = getString(R.string.DownloadErrorRedirection);\n                                break;\n                        default:\n                                message = getString(R.string.DownloadErrorUnknown);\n                                break;\n                        }\n                        \n                        Toast.makeText(context, String.format(getString(R.string.DownloadFailedWithErrorMessage), message), Toast.LENGTH_SHORT).show();\n                        Controller.getInstance().getDownloadsList().remove(item);\n                    }\n\n                }\n\t\t\t}\n\t\t} else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(intent.getAction())) {\n\t\t\tIntent i = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);\n            startActivity(i);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/org/tint/ui/components/BadgedImageView.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.components;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.util.AttributeSet;\nimport android.widget.ImageView;\n\npublic class BadgedImageView extends ImageView {\n\n\tprivate static final float X_POSITON_RATIO = 52 / 96f;\n\tprivate static final float Y_POSITON_RATIO = 64 / 96f;\n\t\n\tprivate int mValue;\n\t\n\tprivate Paint mPaint;\n\t\n\tpublic BadgedImageView(Context context) {\n\t\tthis(context, null);\n\t}\n\t\n\tpublic BadgedImageView(Context context, AttributeSet attrs) {\n\t\tthis(context, attrs, 0);\n\t}\n\t\n\tpublic BadgedImageView(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\t\n\t\tmValue = 0;\n\t\t\n\t\tmPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n\t\tmPaint.setColor(0xFFC8C8C8);\n\t\tmPaint.setTextAlign(Paint.Align.CENTER);\n\t\tmPaint.setFakeBoldText(true);\n\t\tmPaint.setTextSize(16 * context.getResources().getDisplayMetrics().density);\n\t}\n\n\t@Override\n\tprotected void onDraw(Canvas canvas) {\n\t\tsuper.onDraw(canvas);\n\t\t\t\n\t\tString text;\n\t\tif (mValue > 9) {\n\t\t\ttext = \"*\";\n\t\t} else {\n\t\t\ttext = Integer.toString(mValue);\n\t\t}\n\t\t\n\t\tcanvas.drawText(text, X_POSITON_RATIO * getWidth(), Y_POSITON_RATIO * getHeight(), mPaint);\n\t}\n\t\n\tpublic void setValue(int value) {\n\t\tif (mValue != value) {\n\t\t\tmValue = value;\n\t\t\tinvalidate();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/components/CustomWebChromeClient.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.components;\n\nimport org.tint.R;\nimport org.tint.tasks.UpdateFaviconTask;\nimport org.tint.tasks.UpdateHistoryTask;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.utils.Constants;\n\nimport android.app.AlertDialog;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.net.Uri;\nimport android.os.Message;\nimport android.preference.PreferenceManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.webkit.ConsoleMessage;\nimport android.webkit.GeolocationPermissions.Callback;\nimport android.webkit.JsPromptResult;\nimport android.webkit.JsResult;\nimport android.webkit.ValueCallback;\nimport android.webkit.WebChromeClient;\nimport android.webkit.WebView;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\npublic class CustomWebChromeClient extends WebChromeClient {\n\n\tprivate UIManager mUIManager;\n\t\n\tprivate Bitmap mDefaultVideoPoster = null;\n\tprivate View mVideoProgressView = null;\n\tprivate SharedPreferences mPreferences = null;\n\t\n\tpublic CustomWebChromeClient(UIManager uiManager) {\n\t\tmUIManager = uiManager;\n\t\tmPreferences = PreferenceManager.getDefaultSharedPreferences(mUIManager.\n\t\t\t\tgetMainActivity().getApplicationContext());\n\t}\n\t\n\t@Override\n\tpublic void onProgressChanged(WebView view, int newProgress) {\n\t\tmUIManager.onProgressChanged(view, newProgress);\n\t}\n\t\n\t@Override\n\tpublic void onReceivedTitle(WebView view, String title) {\n\t\tmUIManager.onReceivedTitle(view, title);\n\n\t\tif (!view.isPrivateBrowsingEnabled()) {\n\t\t\tUpdateHistoryTask task = new UpdateHistoryTask(mUIManager.getMainActivity());\n\t\t\ttask.execute(view.getTitle(), view.getUrl(), view.getOriginalUrl());\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onReceivedIcon(WebView view, Bitmap icon) {\n\t\tmUIManager.onReceivedIcon(view, icon);\n\n\t\tUpdateFaviconTask task = new UpdateFaviconTask(mUIManager.getMainActivity().getContentResolver(), view.getUrl(), view.getOriginalUrl(), icon);\n\t\ttask.execute();\n\t}\n\t\n\t@Override\n\tpublic boolean onCreateWindow(WebView view, final boolean dialog, final boolean userGesture, final Message resultMsg) {\n\t\tWebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;\n\n\t\tCustomWebView curentWebView = mUIManager.getCurrentWebView();\n\n\t\tmUIManager.addTab(false, curentWebView.isPrivateBrowsingEnabled());\n\n\t\ttransport.setWebView(mUIManager.getCurrentWebView());\n\t\tresultMsg.sendToTarget();\n\n\t\treturn true;\n\t}\n\t\n\tpublic void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {\n\t\tmUIManager.setUploadMessage(uploadMsg);\n\t\tIntent i = new Intent(Intent.ACTION_GET_CONTENT);\n\t\ti.addCategory(Intent.CATEGORY_OPENABLE);\n\t\ti.setType((acceptType == null || acceptType.isEmpty()) ? \"*/*\" : acceptType);\n\t\tmUIManager.getMainActivity().startActivityForResult(\n\t\t\t\tIntent.createChooser(i,  mUIManager.getMainActivity().getString(R.string.FileChooserPrompt)),\n\t\t\t\tTintBrowserActivity.ACTIVITY_OPEN_FILE_CHOOSER);\n\t}\n\t\n\tpublic void openFileChooser(ValueCallback<Uri> uploadMsg) {\n\t\tmUIManager.setUploadMessage(uploadMsg);\n\t\tIntent i = new Intent(Intent.ACTION_GET_CONTENT);\n\t\ti.addCategory(Intent.CATEGORY_OPENABLE);\n\t\ti.setType(\"*/*\");\n\t\tmUIManager.getMainActivity().startActivityForResult(\n\t\t\t\tIntent.createChooser(i,  mUIManager.getMainActivity().getString(R.string.FileChooserPrompt)),\n\t\t\t\tTintBrowserActivity.ACTIVITY_OPEN_FILE_CHOOSER);\n\t}\n\t\n\t@Override\n\tpublic Bitmap getDefaultVideoPoster() {\n\t\tif (mDefaultVideoPoster == null) {\n\t\t\tmDefaultVideoPoster = BitmapFactory.decodeResource(mUIManager.getMainActivity().getResources(), R.drawable.default_video_poster);\n\t\t}\n\n\t\treturn mDefaultVideoPoster;\n\t}\n\t\n\t@Override\n\tpublic View getVideoLoadingProgressView() {\n\t\tif (mVideoProgressView == null) {\n\t\t\tLayoutInflater inflater = LayoutInflater.from(mUIManager.getMainActivity());\n\t\t\tmVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);\n\t\t}\n\n\t\treturn mVideoProgressView;\n\t}\n\t\n\t@Override\n\tpublic boolean onJsAlert(WebView view, String url, String message, final JsResult result) {\n\t\tnew AlertDialog.Builder(mUIManager.getMainActivity())\n\t\t.setTitle(R.string.JavaScriptAlertDialog)\n\t\t.setMessage(message)\n\t\t.setPositiveButton(android.R.string.ok,\n\t\t\t\tnew AlertDialog.OnClickListener()\n\t\t{\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tresult.confirm();\n\t\t\t}\n\t\t})\n\t\t.setCancelable(false)\n\t\t.create()\n\t\t.show();\n\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {\n\t\tnew AlertDialog.Builder(mUIManager.getMainActivity())\n\t\t.setTitle(R.string.JavaScriptConfirmDialog)\n\t\t.setMessage(message)\n\t\t.setPositiveButton(android.R.string.ok, \n\t\t\t\tnew DialogInterface.OnClickListener() \n\t\t{\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tresult.confirm();\n\t\t\t}\n\t\t})\n\t\t.setNegativeButton(android.R.string.cancel, \n\t\t\t\tnew DialogInterface.OnClickListener() \n\t\t{\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tresult.cancel();\n\t\t\t}\n\t\t})\n\t\t.create()\n\t\t.show();\n\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {\n\n\t\tfinal LayoutInflater factory = LayoutInflater.from(mUIManager.getMainActivity());\n\t\tfinal View v = factory.inflate(R.layout.javascript_prompt_dialog, null);\n\t\t((TextView) v.findViewById(R.id.JavaScriptPromptMessage)).setText(message);\n\t\t((EditText) v.findViewById(R.id.JavaScriptPromptInput)).setText(defaultValue);\n\n\t\tnew AlertDialog.Builder(mUIManager.getMainActivity())\n\t\t.setTitle(R.string.JavaScriptPromptDialog)\n\t\t.setView(v)\n\t\t.setPositiveButton(android.R.string.ok,\n\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\tpublic void onClick(DialogInterface dialog, int whichButton) {\n\t\t\t\tString value = ((EditText) v.findViewById(R.id.JavaScriptPromptInput)).getText()\n\t\t\t\t\t\t.toString();\n\t\t\t\tresult.confirm(value);\n\t\t\t}\n\t\t})\n\t\t.setNegativeButton(android.R.string.cancel,\n\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\tpublic void onClick(DialogInterface dialog, int whichButton) {\n\t\t\t\tresult.cancel();\n\t\t\t}\n\t\t})\n\t\t.setOnCancelListener(\n\t\t\t\tnew DialogInterface.OnCancelListener() {\n\t\t\t\t\tpublic void onCancel(DialogInterface dialog) {\n\t\t\t\t\t\tresult.cancel();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.show();\n\n\t\treturn true;\n\n\t}\n\t\n\t@Override\n\tpublic void onHideCustomView() {\n\t\tsuper.onHideCustomView();\n\t\tmUIManager.onHideCustomView();\n\t}\n\t\n\t@Override\n\tpublic void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {\n\t\tsuper.onShowCustomView(view, requestedOrientation, callback);\n\t\tmUIManager.onShowCustomView(view, requestedOrientation, callback);\n\t}\n\t\n\t@Override\n\tpublic void onShowCustomView(View view, CustomViewCallback callback) {\t\t\n\t\tsuper.onShowCustomView(view, callback);\n\t\tmUIManager.onShowCustomView(view, -1, callback);\n\t}\n\t\n\t@Override\n\tpublic void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {\n\t\tmUIManager.onGeolocationPermissionsShowPrompt(origin, callback);\n\t}\n\t\n\t@Override\n\tpublic void onGeolocationPermissionsHidePrompt() {\n\t\tmUIManager.onGeolocationPermissionsHidePrompt();\n\t}\n\t\n\t@Override\n\tpublic boolean onConsoleMessage(ConsoleMessage cm) {\n\t\tif(mPreferences.getBoolean(Constants.PREFERENCE_JS_LOG_ON_LOGCAT, false)) {\n\t\t\tLog.d(\"TintJS\", cm.sourceId() + \":\" + cm.lineNumber() + \" \" + cm.message());\n\t\t}\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/components/CustomWebView.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.components;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.List;\nimport java.util.UUID;\n\nimport org.apache.http.HeaderElement;\nimport org.apache.http.NameValuePair;\nimport org.apache.http.message.BasicHeader;\nimport org.tint.R;\nimport org.tint.addons.AddonMenuItem;\nimport org.tint.controllers.Controller;\nimport org.tint.model.DownloadItem;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.dialogs.DownloadConfirmDialog;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\nimport org.tint.utils.UrlUtils;\n\nimport android.annotation.SuppressLint;\nimport android.app.DownloadManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport android.preference.PreferenceManager;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.ContextMenu;\nimport android.view.ContextMenu.ContextMenuInfo;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.webkit.CookieManager;\nimport android.webkit.DownloadListener;\nimport android.webkit.WebSettings;\nimport android.webkit.WebSettings.PluginState;\nimport android.webkit.WebView;\nimport android.widget.Toast;\n\npublic class CustomWebView extends WebView implements DownloadListener, DownloadConfirmDialog.IUserActionListener {\n\t\n\tprivate UIManager mUIManager;\n\tprivate Context mContext;\n\tprivate BaseWebViewFragment mParentFragment;\n\n\tprivate boolean mIsLoading = false;\n\tprivate boolean mPrivateBrowsing = false;\t\n\t\n\tprivate static boolean sMethodsLoaded = false;\n\tprivate static Method sWebSettingsSetProperty = null;\n\t\n\tpublic CustomWebView(UIManager uiManager, boolean privateBrowsing) {\n\t\tthis(uiManager.getMainActivity(), null, privateBrowsing);\n\t\tmUIManager = uiManager;\n\t}\n\t\n\t// Used only by edit mode (UI designer)\n\tpublic CustomWebView(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs, android.R.attr.webViewStyle);\n\t\tmContext = context;\n\t}\n\t\n\tpublic CustomWebView(Context context, AttributeSet attrs, boolean privateBrowsing) {\n\t\tsuper(context, attrs, android.R.attr.webViewStyle);\n\t\tmPrivateBrowsing = privateBrowsing;\n\t\t\n\t\tmContext = context;\n\t\t\n\t\tif (!isInEditMode()) {\n\t\t\t\n\t\t\tif (!sMethodsLoaded) {\n\t\t\t\tloadMethods();\n\t\t\t}\n\t\t\t\n\t\t\tloadSettings();\n\t\t\tsetupContextMenu();\t\t\t\n\t\t}\n\t}\n\t\n\tpublic void setParentFragment(BaseWebViewFragment parentFragment) {\n\t\tmParentFragment = parentFragment;\n\t}\n\t\n\tpublic BaseWebViewFragment getParentFragment() {\n\t\treturn mParentFragment;\n\t}\n\t\n\tpublic UUID getParentFragmentUUID() {\n\t\treturn mParentFragment.getUUID();\n\t}\n\t\n\tpublic boolean isLoading() {\n\t\treturn mIsLoading;\n\t}\n\t\n\tpublic boolean isPrivateBrowsingEnabled() {\n\t\treturn mPrivateBrowsing;\n\t}\n\t\n\t@Override\n\tpublic void loadUrl(String url) {\n\t\tif ((url != null) &&\n    \t\t\t(url.length() > 0)) {\n\t\t\t\n\t\t\tif (UrlUtils.isUrl(url)) {\n    \t\t\turl = UrlUtils.checkUrl(url);\n    \t\t} else {\n    \t\t\turl = UrlUtils.getSearchUrl(mContext, url);\n    \t\t}\n\t\t\t\n\t\t\tif (Constants.URL_ABOUT_TUTORIAL.equals(url)) {\n\t\t\t\tloadDataWithBaseURL(\n\t\t\t\t\t\t\"file:///android_asset/\",\n\t\t\t\t\t\tApplicationUtils.getStringFromRawResource(mContext, R.raw.phone_tutorial_html),\n\t\t\t\t\t\t\"text/html\",\n\t\t\t\t\t\t\"UTF-8\",\n\t\t\t\t\t\tConstants.URL_ABOUT_TUTORIAL);\n\t\t\t} else {\n\t\t\t\tsuper.loadUrl(url);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic void loadRawUrl(String url) {\n\t\tsuper.loadUrl(url);\n\t}\n\n\tpublic void onClientPageStarted(String url) {\n\t\tmIsLoading = true;\n\t\t\n\t\tif (!isPrivateBrowsingEnabled()) {\n\t\t\tController.getInstance().getAddonManager().onPageStarted(mContext, this, url);\n\t\t}\n\t}\n\t\n\tpublic void onClientPageFinished(String url) {\n\t\tmIsLoading = false;\n\t\t\n\t\tif (!isPrivateBrowsingEnabled()) {\n\t\t\tController.getInstance().getAddonManager().onPageFinished(mContext, this, url);\n\t\t}\n\t\t\n\t\tmUIManager.onClientPageFinished(this, url);\n\t}\n\t\n\t@SuppressLint(\"SetJavaScriptEnabled\")\n\tpublic void loadSettings() {\n\t\tWebSettings settings = getSettings();\n\t\tSharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());\t\t\n\t\t\n\t\tsettings.setJavaScriptEnabled(prefs.getBoolean(Constants.PREFERENCE_ENABLE_JAVASCRIPT, true));\n\t\tsettings.setLoadsImagesAutomatically(prefs.getBoolean(Constants.PREFERENCE_ENABLE_IMAGES, true));\n\t\tsettings.setUseWideViewPort(prefs.getBoolean(Constants.PREFERENCE_USE_WIDE_VIEWPORT, true));\n\t\tsettings.setLoadWithOverviewMode(prefs.getBoolean(Constants.PREFERENCE_LOAD_WITH_OVERVIEW, false));\n\t\t\n\t\tsettings.setGeolocationEnabled(prefs.getBoolean(Constants.PREFERENCE_ENABLE_GEOLOCATION, true));\n\t\tsettings.setSaveFormData(prefs.getBoolean(Constants.PREFERENCE_REMEMBER_FORM_DATA, true));\n\t\tsettings.setSavePassword(prefs.getBoolean(Constants.PREFERENCE_REMEMBER_PASSWORDS, true));\n\t\t\n\t\tsettings.setTextZoom(prefs.getInt(Constants.PREFERENCE_TEXT_SCALING, 100));\n\t\t\n\t\tint minimumFontSize = prefs.getInt(Constants.PREFERENCE_MINIMUM_FONT_SIZE, 1);\n\t\tsettings.setMinimumFontSize(minimumFontSize);\n\t\tsettings.setMinimumLogicalFontSize(minimumFontSize);\n\t\t\n\t\tboolean useInvertedDisplay = prefs.getBoolean(Constants.PREFERENCE_INVERTED_DISPLAY, false);\n\t\tsetWebSettingsProperty(settings, \"inverted\", useInvertedDisplay ? \"true\" : \"false\");\n\t\t\n\t\tif (useInvertedDisplay) {\n\t\t\tsetWebSettingsProperty(settings,\n\t\t\t\t\t\"inverted_contrast\",\n\t\t\t\t\tFloat.toString(prefs.getInt(Constants.PREFERENCE_INVERTED_DISPLAY_CONTRAST, 100) / 100f));\n\t\t}\n\t\t\n\t\tsettings.setUserAgentString(prefs.getString(Constants.PREFERENCE_USER_AGENT, Constants.USER_AGENT_ANDROID));\t\t\n\t\tsettings.setPluginState(PluginState.valueOf(prefs.getString(Constants.PREFERENCE_PLUGINS, PluginState.ON_DEMAND.toString())));\n\t\t\n\t\tCookieManager.getInstance().setAcceptCookie(prefs.getBoolean(Constants.PREFERENCE_ACCEPT_COOKIES, true));\n\t\t\n\t\tsettings.setSupportZoom(true);\n\t\tsettings.setDisplayZoomControls(false);\n\t\tsettings.setBuiltInZoomControls(true);\n\t\tsettings.setSupportMultipleWindows(true);\n\t\tsettings.setEnableSmoothTransition(true);\n\t\t\n\t\tif (mPrivateBrowsing) {\n\t\t\tsettings.setGeolocationEnabled(false);\n\t\t\tsettings.setSaveFormData(false);\n\t\t\tsettings.setSavePassword(false);\n\t\t\t\n\t\t\tsettings.setAppCacheEnabled(false);\n\t\t\tsettings.setDatabaseEnabled(false);\n\t\t\tsettings.setDomStorageEnabled(false);\n\t\t} else {\n\t\t\t// HTML5 API flags\n\t\t\tsettings.setAppCacheEnabled(true);\n\t\t\tsettings.setDatabaseEnabled(true);\n\t\t\tsettings.setDomStorageEnabled(true);\n\n\t\t\t// HTML5 configuration settings.\n\t\t\tsettings.setAppCacheMaxSize(3 * 1024 * 1024);\n\t\t\tsettings.setAppCachePath(mContext.getDir(\"appcache\", 0).getPath());\n\t\t\tsettings.setDatabasePath(mContext.getDir(\"databases\", 0).getPath());\n\t\t\tsettings.setGeolocationDatabasePath(mContext.getDir(\"geolocation\", 0).getPath());\n\t\t}\n\t\t\n\t\tsetLongClickable(true);\n\t\tsetDownloadListener(this);\t\t\n\t}\n\t\n\t@Override\n\tpublic void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {\n\t\tDownloadItem item = new DownloadItem(url);\n\t\titem.addRequestHeader(\"Cookie\", CookieManager.getInstance().getCookie(url));\n\t\t\n\t\tString fileName = item.getFileName();\n\t\tBasicHeader header = new BasicHeader(\"Content-Disposition\", contentDisposition);\n\t\tHeaderElement[] helelms = header.getElements();\n\t\tif (helelms.length > 0) {\n\t\t    HeaderElement helem = helelms[0];\n\t\t    if (helem.getName().equalsIgnoreCase(\"attachment\")) {\n\t\t        NameValuePair nmv = helem.getParameterByName(\"filename\");\n\t\t        if (nmv != null) {\n\t\t        \tfileName = nmv.getValue();\n\t\t        }\n\t\t    }\n\t\t}\n\t\titem.setFilename(fileName);\n\t\titem.setIncognito(isPrivateBrowsingEnabled());\n\n\t\tDownloadConfirmDialog dialog = new DownloadConfirmDialog(getContext())\n\t\t\t.setDownloadItem(item)\n\t\t\t.setCallbackListener(this);\n\t\tdialog.show();\n\t}\n\t\n\t@Override\n\tpublic void onAcceptDownload(DownloadItem item) {\n\t\tlong id = ((DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(item);\n\t\titem.setId(id);\n\t\t\n\t\tController.getInstance().getDownloadsList().add(item);\n\t\t\n\t\tToast.makeText(mContext, String.format(mContext.getString(R.string.DownloadStart), item.getFileName()), Toast.LENGTH_SHORT).show();\n\t}\n\n\t@Override\n\tpublic void onDenyDownload() {\n\t}\n\t\n\tprivate Intent createIntent(String action, int actionId, int hitTestResult, String url) {\n\t\tIntent result = new Intent(getContext(), TintBrowserActivity.class);\n\t\tresult.setAction(action);\n\t\tresult.putExtra(Constants.EXTRA_ACTION_ID, actionId);\n\t\tresult.putExtra(Constants.EXTRA_HIT_TEST_RESULT, hitTestResult);\n\t\tresult.putExtra(Constants.EXTRA_URL, url);\n\t\tresult.putExtra(Constants.EXTRA_INCOGNITO, isPrivateBrowsingEnabled());\n\t\t\n\t\treturn result;\n\t}\n\t\n\tprivate void createContributedContextMenu(ContextMenu menu, int hitTestResult, String url) {\n\t\tif (!isPrivateBrowsingEnabled()) {\n\t\t\tMenuItem item;\n\n\t\t\tList<AddonMenuItem> contributedItems = Controller.getInstance().getAddonManager().getContributedLinkContextMenuItems(this, hitTestResult, url);\n\t\t\tfor (AddonMenuItem contribution : contributedItems) {\n\t\t\t\titem = menu.add(0, contribution.getAddon().getMenuId(), 0, contribution.getMenuItem());\n\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, contribution.getAddon().getMenuId(), hitTestResult, url));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void setupContextMenu() {\n\t\tsetOnCreateContextMenuListener(new OnCreateContextMenuListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {\n\t\t\t\tHitTestResult result = ((WebView) v).getHitTestResult();\n\t\t\t\tint resultType = result.getType();\n\t\t\t\t\n\t\t\t\tif ((resultType == HitTestResult.ANCHOR_TYPE) ||\n\t\t\t\t\t\t(resultType == HitTestResult.IMAGE_ANCHOR_TYPE) ||\n\t\t\t\t\t\t(resultType == HitTestResult.SRC_ANCHOR_TYPE) ||\n\t\t\t\t\t\t(resultType == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) {\n\t\t\t\t\t\n\t\t\t\t\tMenuItem item = menu.add(0, TintBrowserActivity.CONTEXT_MENU_OPEN, 0, R.string.ContextMenuOpen);\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_OPEN, resultType, result.getExtra()));\n\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB, 0, R.string.ContextMenuOpenNewTab);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_OPEN_IN_BACKGROUND, 0, R.string.ContextMenuOpenInBackground);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_OPEN_IN_BACKGROUND, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_COPY, 0, R.string.ContextMenuCopyLinkUrl);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_COPY, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_DOWNLOAD, 0, R.string.ContextMenuDownload);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_DOWNLOAD, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_SHARE, 0, R.string.ContextMenuShareLinkUrl);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_SHARE, resultType, result.getExtra()));\n\t\t\t\t\n\t\t\t\t\tcreateContributedContextMenu(menu, resultType, result.getExtra());\n\t\t\t\t\t\n\t\t\t\t\tmenu.setHeaderTitle(result.getExtra());\n\t\t\t\t\t\n\t\t\t\t} else if (resultType == HitTestResult.IMAGE_TYPE) {\n\t\t\t\t\t\n\t\t\t\t\tMenuItem item = menu.add(0, TintBrowserActivity.CONTEXT_MENU_OPEN, 0, R.string.ContextMenuViewImage);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_OPEN, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB, 0, R.string.ContextMenuViewImageInNewTab);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_COPY, 0, R.string.ContextMenuCopyImageUrl);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_COPY, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_DOWNLOAD, 0, R.string.ContextMenuDownloadImage);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_DOWNLOAD, resultType, result.getExtra()));\t\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_SHARE, 0, R.string.ContextMenuShareImageUrl);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_SHARE, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\tcreateContributedContextMenu(menu, resultType, result.getExtra());\n\t\t\t\t\t\n\t\t\t\t\tmenu.setHeaderTitle(result.getExtra());\n\t\t\t\t\t\n\t\t\t\t} else if (resultType == HitTestResult.EMAIL_TYPE) {\n\t\t\t\t\t\n\t\t\t\t\tIntent sendMail = new Intent(Intent.ACTION_VIEW, Uri.parse(WebView.SCHEME_MAILTO + result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\tMenuItem item = menu.add(0, TintBrowserActivity.CONTEXT_MENU_SEND_MAIL, 0, R.string.ContextMenuSendEmail);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(sendMail);\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_COPY, 0, R.string.ContextMenuCopyEmailUrl);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_COPY, resultType, result.getExtra()));\t\t\n\t\t\t\t\t\n\t\t\t\t\titem = menu.add(0, TintBrowserActivity.CONTEXT_MENU_SHARE, 0, R.string.ContextMenuShareEmailUrl);\t\t\t\t\t\n\t\t\t\t\titem.setIntent(createIntent(Constants.ACTION_BROWSER_CONTEXT_MENU, TintBrowserActivity.CONTEXT_MENU_SHARE, resultType, result.getExtra()));\n\t\t\t\t\t\n\t\t\t\t\tcreateContributedContextMenu(menu, resultType, result.getExtra());\n\t\t\t\t\t\n\t\t\t\t\tmenu.setHeaderTitle(result.getExtra());\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tprivate static void loadMethods() {\n\t\ttry {\n\t\t\t\n\t\t\t// 15 is ICS 2nd release.\n\t\t\tif (android.os.Build.VERSION.SDK_INT > 15) {\n\t\t\t\t// WebSettings became abstract in JB, and \"setProperty\" moved to the concrete class, WebSettingsClassic,\n\t\t\t\t// not present in the SDK. So we must look for the class first, then for the methods.\n\t\t\t\tClassLoader classLoader = CustomWebView.class.getClassLoader();\n\t\t\t\tClass<?> webSettingsClassicClass = classLoader.loadClass(\"android.webkit.WebSettingsClassic\");\n\t\t\t\tsWebSettingsSetProperty = webSettingsClassicClass.getMethod(\"setProperty\", new Class[] { String.class, String.class });\n\t\t\t} else {\n\t\t\t\tsWebSettingsSetProperty = WebSettings.class.getMethod(\"setProperty\", new Class[] { String.class, String.class });\n\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tLog.e(\"CustomWebView\", \"loadMethods(): \" + e.getMessage());\n\t\t\tsWebSettingsSetProperty = null;\n\t\t} catch (ClassNotFoundException e) {\n\t\t\tLog.e(\"CustomWebView\", \"loadMethods(): \" + e.getMessage());\n\t\t\tsWebSettingsSetProperty = null;\n\t\t}\n\t\t\n\t\tsMethodsLoaded = true;\n\t}\n\t\n\tprivate static void setWebSettingsProperty(WebSettings settings, String key, String value) {\n\t\tif (sWebSettingsSetProperty != null) {\n\t\t\ttry {\n\t\t\t\tsWebSettingsSetProperty.invoke(settings, key, value);\n\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\tLog.e(\"CustomWebView\", \"setWebSettingsProperty(): \" + e.getMessage());\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tLog.e(\"CustomWebView\", \"setWebSettingsProperty(): \" + e.getMessage());\n\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\tLog.e(\"CustomWebView\", \"setWebSettingsProperty(): \" + e.getMessage());\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/components/CustomWebViewClient.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.components;\n\nimport java.net.MalformedURLException;\nimport java.net.URISyntaxException;\nimport java.net.URL;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport org.tint.R;\nimport org.tint.providers.SslExceptionsWrapper;\nimport org.tint.ui.managers.UIManager;\n\nimport android.app.AlertDialog;\nimport android.content.ActivityNotFoundException;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.DialogInterface.OnCancelListener;\nimport android.content.IntentFilter;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.graphics.Bitmap;\nimport android.net.Uri;\nimport android.net.http.SslError;\nimport android.os.Message;\nimport android.text.Html;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.WindowManager;\nimport android.webkit.HttpAuthHandler;\nimport android.webkit.SslErrorHandler;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\nimport android.widget.CheckBox;\nimport android.widget.EditText;\nimport android.widget.Toast;\n\npublic class CustomWebViewClient extends WebViewClient {\n\n\tprivate static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile(\n            \"(?i)\" + // switch on case insensitive matching\n            \"(\" + // begin group for schema\n            \"(?:http|https|file):\\\\/\\\\/\" +\n            \"|(?:inline|data|about|javascript):\" +\n            \")\" +\n            \"(.*)\" );\n\t\n\tprivate UIManager mUIManager;\n\t\n\tprivate Message mDontResend;\n    private Message mResend;\n\t\n\tpublic CustomWebViewClient(UIManager uiManager) {\n\t\tmUIManager = uiManager;\n\t}\n\n\t@Override\n\tpublic void onPageStarted(WebView view, String url, Bitmap favicon) {\n\t\tmUIManager.onPageStarted(view, url, favicon);\n\t\t((CustomWebView) view).onClientPageStarted(url);\n\t}\n\n\t@Override\n\tpublic void onPageFinished(WebView view, String url) {\n\t\tmUIManager.onPageFinished(view, url);\n\t\t((CustomWebView) view).onClientPageFinished(url);\t\t\n\t}\n\n\t@Override\n\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\treturn checkUrlLoading(url);\n\t}\n\n\t@Override\n\tpublic void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) {\n\t\t\n\t\tboolean hasAuthority = false;\n\t\tString authority = view.getResources().getString(R.string.UnknownAutority);\n\t\tif (error.getUrl() != null) {\n\t\t\ttry {\n\t\t\t\tURL url = new URL(error.getUrl());\n\t\t\t\tauthority = url.getAuthority();\n\t\t\t\thasAuthority = true;\n\t\t\t} catch (MalformedURLException e) {\n\t\t\t\thasAuthority = false;\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tboolean askUser = true;\n\t\t\n\t\tif (hasAuthority) {\n\t\t\tint result = SslExceptionsWrapper.getStatusForAuthority(view.getContext().getContentResolver(), authority);\n\t\t\t\n\t\t\tswitch (result) {\n\t\t\tcase SslExceptionsWrapper.AUTHORITY_UNKNOWN:\n\t\t\t\taskUser = true;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase SslExceptionsWrapper.AUTHORITY_ALLOWED:\n\t\t\t\taskUser = false;\n\t\t\t\thandler.proceed();\n\t\t\t\tToast.makeText(view.getContext(), String.format(view.getResources().getString(R.string.SslExceptionAccessAllowedByUserToast), authority), Toast.LENGTH_SHORT).show();\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase SslExceptionsWrapper.AUTHORITY_DISALLOWED:\n\t\t\t\taskUser = false;\n\t\t\t\thandler.cancel();\n\t\t\t\tToast.makeText(view.getContext(), String.format(view.getResources().getString(R.string.SslExceptionAccessDisallowedByUserToast), authority), Toast.LENGTH_SHORT).show();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\taskUser = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (askUser) {\n\t\t\t\n\t\t\tfinal int errorCode = SslExceptionsWrapper.sslErrorToInt(error);\n\t\t\t\n\t\t\tStringBuilder sb = new StringBuilder();\n\n\t\t\tsb.append(String.format(view.getResources().getString(R.string.SslWarningsHeader), authority));\n\t\t\tsb.append(\"\\n\\n\");\n\n\t\t\tsb.append(Html.fromHtml(SslExceptionsWrapper.sslErrorReasonToString(view.getContext(), errorCode)));\n\t\t\t\n\t\t\tfinal String finalAuthority = authority;\n\t\t\t\n\t\t\tAlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());\t\t\t\n\t\t\tbuilder.setCancelable(true);\n\t\t\tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n\t\t\tbuilder.setTitle(view.getResources().getString(R.string.SslWarning));\n\t\t\tbuilder.setMessage(sb.toString());\n\n\t\t\tLayoutInflater adbInflater = LayoutInflater.from(view.getContext());\n\t\t\tView checkBoxLayout = adbInflater.inflate(R.layout.checkbox_layout, null);\n\t\t\tfinal CheckBox rememberCheckBox = (CheckBox) checkBoxLayout.findViewById(R.id.RemenberChoiceCheckBox);\n\n\t\t\tbuilder.setView(checkBoxLayout);\n\t\t\t\n\t\t\tbuilder.setInverseBackgroundForced(true);\n\t\t\tbuilder.setPositiveButton(view.getResources().getString(R.string.Continue), new DialogInterface.OnClickListener() {\n\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\tif (rememberCheckBox.isChecked()) {\n\t\t\t\t\t\tSslExceptionsWrapper.setSslException(view.getContext().getContentResolver(), finalAuthority, errorCode, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tdialog.dismiss();\n\t\t\t\t\thandler.proceed();\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\tbuilder.setNegativeButton(view.getResources().getString(R.string.Cancel), new DialogInterface.OnClickListener() {\n\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\tif (rememberCheckBox.isChecked()) {\n\t\t\t\t\t\tSslExceptionsWrapper.setSslException(view.getContext().getContentResolver(), finalAuthority, errorCode, false);\n\t\t\t\t\t}\n\n\t\t\t\t\tdialog.dismiss();\n\t\t\t\t\thandler.cancel();\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\tAlertDialog alert = builder.create();\n\t\t\talert.show();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onReceivedHttpAuthRequest(WebView view, final HttpAuthHandler handler, final String host, final String realm) {\n\t\tString username = null;\n        String password = null;\n        \n        boolean reuseHttpAuthUsernamePassword = handler.useHttpAuthUsernamePassword();\n        \n        if (reuseHttpAuthUsernamePassword && view != null) {\n            String[] credentials = view.getHttpAuthUsernamePassword(\n                    host, realm);\n            if (credentials != null && credentials.length == 2) {\n                username = credentials[0];\n                password = credentials[1];\n            }\n        }\n\n        if (username != null && password != null) {\n            handler.proceed(username, password);\n        } else {\n        \tLayoutInflater factory = LayoutInflater.from(mUIManager.getMainActivity());\n            final View v = factory.inflate(R.layout.http_authentication_dialog, null);\n            \n            if (username != null) {\n                ((EditText) v.findViewById(R.id.username_edit)).setText(username);\n            }\n            if (password != null) {\n                ((EditText) v.findViewById(R.id.password_edit)).setText(password);\n            }\n            \n            AlertDialog dialog = new AlertDialog.Builder(mUIManager.getMainActivity())\n            .setTitle(String.format(mUIManager.getMainActivity().getString(R.string.HttpAuthenticationDialogDialogTitle), host, realm))\n            .setIcon(android.R.drawable.ic_dialog_alert)\n            .setView(v)\n            .setPositiveButton(R.string.Proceed,\n                    new DialogInterface.OnClickListener() {\n                         public void onClick(DialogInterface dialog,\n                                 int whichButton) {\n                            String nm = ((EditText) v\n                                    .findViewById(R.id.username_edit))\n                                    .getText().toString();\n                            String pw = ((EditText) v\n                                    .findViewById(R.id.password_edit))\n                                    .getText().toString();\n                            mUIManager.setHttpAuthUsernamePassword(host, realm, nm, pw);\n                            handler.proceed(nm, pw);\n                        }})\n            .setNegativeButton(R.string.Cancel,\n                    new DialogInterface.OnClickListener() {\n                        public void onClick(DialogInterface dialog, int whichButton) {\n                            handler.cancel();\n                        }})\n            .setOnCancelListener(new DialogInterface.OnCancelListener() {\n                    public void onCancel(DialogInterface dialog) {\n                        handler.cancel();\n                    }})\n            .create();\n            \n            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);\n            dialog.show();\n                        \n            v.findViewById(R.id.username_edit).requestFocus();            \n        }\n\t}\n\n\t@Override\n\tpublic void onFormResubmission(WebView view, Message dontResend, Message resend) {\n\t\t\n\t\tmDontResend = dontResend;\n\t\tmResend = resend;\n\t\t\n\t\tnew AlertDialog.Builder(mUIManager.getMainActivity()).setTitle(R.string.FormResubmitTitle)\n\t\t\t.setMessage(R.string.FormResubmitMessage)\n                .setPositiveButton(R.string.OK,\n                        new DialogInterface.OnClickListener() {\n                            public void onClick(DialogInterface dialog,\n                                    int which) {\n                                if (mResend != null) {\n                                \tmResend.sendToTarget();\n                                \tmResend = null;\n                                \tmDontResend = null;\n                                }\n                            }\n                        }).setNegativeButton(R.string.Cancel,\n                        new DialogInterface.OnClickListener() {\n                            public void onClick(DialogInterface dialog,\n                                    int which) {\n                                if (mDontResend != null) {\n                                \tmDontResend.sendToTarget();\n                                \tmResend = null;\n                                \tmDontResend = null;\n                                }\n                            }\n                        }).setOnCancelListener(new OnCancelListener() {\n                    public void onCancel(DialogInterface dialog) {\n                        if (mDontResend != null) {\n                        \tmDontResend.sendToTarget();\n                        \tmResend = null;\n                        \tmDontResend = null;\n                        }\n                    }\n                }).show();\n\t}\n\t\n\t/**\n\t* Search for intent handlers that are specific to this URL\n\t* aka, specialized apps like google maps or youtube\n\t*/\n\tprivate boolean isSpecializedHandlerAvailable(Intent intent) {\n\t\tPackageManager pm = mUIManager.getMainActivity().getPackageManager();\n\t\tList<ResolveInfo> handlers = pm.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);\n\t\tif (handlers == null || handlers.size() == 0) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (ResolveInfo resolveInfo : handlers) {\n\t\t\tIntentFilter filter = resolveInfo.filter;\n\t\t\tif (filter == null) {\n\t\t\t\t// No intent filter matches this intent?\n\t\t\t\t// Error on the side of staying in the browser, ignore\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (filter.countDataAuthorities() == 0 || filter.countDataPaths() == 0) {\n\t\t\t\t// Generic handler, skip\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate boolean checkUrlLoading(String url) {\n\t\tIntent intent;\n\t\t\n\t\ttry {\n\t\t\tintent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);\n\t\t} catch (URISyntaxException e) {\n\t\t\tLog.w(\"CustomWebViewClient\", \"Bad URI \" + url + \": \" + e.getMessage());\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif (mUIManager.getMainActivity().getPackageManager().resolveActivity(intent, 0) == null) {\n\t\t\tString packagename = intent.getPackage();\n\t\t\tif (packagename != null) {\n\t\t\t\tintent = new Intent(Intent.ACTION_VIEW, Uri.parse(\"market://search?q=pname:\" + packagename));\n\t\t\t\tintent.addCategory(Intent.CATEGORY_BROWSABLE);\n\t\t\t\tmUIManager.getMainActivity().startActivity(intent);\n\t\t\t\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tintent.addCategory(Intent.CATEGORY_BROWSABLE);\n\t\tintent.setComponent(null);\n\t\t\n\t\tMatcher m = ACCEPTED_URI_SCHEMA.matcher(url);\n\t\tif (m.matches() && !isSpecializedHandlerAvailable(intent)) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tif (mUIManager.getMainActivity().startActivityIfNeeded(intent, -1)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (ActivityNotFoundException ex) {\n\t\t\t// ignore the error. If no application can handle the URL,\n\t\t\t// eg about:blank, assume the browser can handle it.\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/ui/dialogs/DownloadConfirmDialog.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.dialogs;\n\nimport org.tint.R;\nimport org.tint.model.DownloadItem;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.DialogInterface.OnClickListener;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.CheckBox;\nimport android.widget.TextView;\n\npublic class DownloadConfirmDialog {\n\tfinal Context mContext;\n\tfinal AlertDialog.Builder mBuilder;\n\tfinal View mView;\n\tIUserActionListener mCallback;\n\tDownloadItem mDownloadItem;\n\t\n\tpublic DownloadConfirmDialog(Context context) {\n\t\tmContext = context;\n\t\tmView = LayoutInflater.from(mContext).inflate(R.layout.download_confirm_dialog, null);\n\t\tmBuilder = new AlertDialog.Builder(mContext)\n\t\t\t.setView(mView)\n\t\t\t.setTitle(R.string.DownloadDialogTitle);\n\t}\n\t\n\tpublic DownloadConfirmDialog setDownloadItem(DownloadItem item) {\n\t\tmDownloadItem = item;\n\t\t((TextView) mView.findViewById(R.id.DownloadOverlayDialog_FileName)).setText(item.getFileName());\n\t\t((TextView) mView.findViewById(R.id.DownloadOverlayDialog_FileSource)).setText(item.getUrl());\n\t\t((CheckBox) mView.findViewById(R.id.DownloadOverlayDialog_Incognito)).setChecked(item.isIncognito());\n\t\treturn this;\n\t}\n\t\n\tpublic DownloadConfirmDialog setCallbackListener(IUserActionListener listener) {\n\t\tmCallback = listener;\n\t\treturn this;\n\t}\n\t\n\tpublic void show() {\n\t\tmBuilder.setPositiveButton(\n\t\t\t\tmContext.getResources().getText(R.string.Download),\n\t\t\t\tnew OnClickListener() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\tsendAcceptCallback();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t});\n\t\tmBuilder.setNegativeButton(\n\t\t\t\tmContext.getResources().getText(R.string.Cancel),\n\t\t\t\tnew OnClickListener() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\tsendDenyCallback();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t});\n\t\tmBuilder.show();\n\t}\n\t\n\tprivate void sendAcceptCallback() {\n\t\tmDownloadItem.setIncognito(((CheckBox) mView.findViewById(R.id.DownloadOverlayDialog_Incognito)).isChecked());\n\t\tmCallback.onAcceptDownload(mDownloadItem);\n\t}\n\t\n\tprivate void sendDenyCallback() {\n\t\tmCallback.onDenyDownload();\n\t}\n\t\n\tpublic static interface IUserActionListener {\n\t\tpublic void onAcceptDownload(DownloadItem item);\n\t\tpublic void onDenyDownload();\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/ui/dialogs/GeolocationPermissionsDialog.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.dialogs;\n\nimport org.tint.R;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.webkit.GeolocationPermissions.Callback;\n\npublic class GeolocationPermissionsDialog extends YesNoRememberDialog {\t\n\t\n\tprivate String mOrigin;\n\tprivate Callback mCallback;\n\t\n\tpublic GeolocationPermissionsDialog(Context context) {\n\t\tsuper(context);\n\t\t\n\t\tsetTitle(R.string.GeolocationTitle);\n\t\t\n\t\tsetPositiveButtonText(R.string.GeolocationAccept);\n\t\tsetNegativeButtonText(R.string.GeolocationDecline);\n\t\t\n\t\tsetPositiveButtonListener(new View.OnClickListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mCallback != null) {\n\t\t\t\t\tmCallback.invoke(mOrigin, true, mRemember.isChecked());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdismiss();\n\t\t\t}\n\t\t});\n\t\t\n\t\tsetNegativeButtonListener(new View.OnClickListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mCallback != null) {\n\t\t\t\t\tmCallback.invoke(mOrigin, false, mRemember.isChecked());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdismiss();\n\t\t\t}\n\t\t});\n\t}\n\t\n\tpublic void initialize(String origin, Callback callback) {\n\t\tmOrigin = origin;\n\t\tmCallback = callback;\n\t\t\n\t\tmMessageView.setText(String.format(mContext.getString(R.string.GeolocationMessage), mOrigin));\n\t\tmRemember.setChecked(false);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/dialogs/YesNoRememberDialog.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.dialogs;\n\nimport org.tint.R;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.CheckBox;\nimport android.widget.TextView;\n\npublic class YesNoRememberDialog extends Dialog {\n\n\tprotected Context mContext;\n\t\n\tprotected TextView mMessageView;\n\tprotected CheckBox mRemember;\n\t\n\tprotected Button mPositiveButton;\n\tprotected Button mNegativeButton;\n\t\n\tpublic YesNoRememberDialog(Context context) {\n\t\tsuper(context);\n\t\t\n\t\tmContext = context;\n\t\t\n\t\tsetContentView(R.layout.yes_no_remember_dialog);\n\t\t\n\t\tmMessageView = (TextView) findViewById(R.id.DialogMessage);\n\t\tmRemember = (CheckBox) findViewById(R.id.DialogRemember);\n\t\t\n\t\tmPositiveButton = (Button) findViewById(R.id.DialogPositiveButton);\n\t\tmNegativeButton = (Button) findViewById(R.id.DialogNegativeButton);\n\t}\n\t\n\tpublic void setPositiveButtonText(String text) {\n\t\tmPositiveButton.setText(text);\n\t}\n\t\n\tpublic void setPositiveButtonText(int text) {\n\t\tmPositiveButton.setText(text);\n\t}\n\t\n\tpublic void setNegativeButtonText(String text) {\n\t\tmNegativeButton.setText(text);\n\t}\n\t\n\tpublic void setNegativeButtonText(int text) {\n\t\tmNegativeButton.setText(text);\n\t}\n\t\n\tpublic void setPositiveButtonListener(View.OnClickListener listener) {\n\t\tmPositiveButton.setOnClickListener(listener);\n\t}\n\t\n\tpublic void setNegativeButtonListener(View.OnClickListener listener) {\n\t\tmNegativeButton.setOnClickListener(listener);\n\t}\n\t\n\tpublic void setMessage(String message) {\n\t\tmMessageView.setText(message);\n\t}\n\t\n\tpublic void setMessage(int message) {\n\t\tmMessageView.setText(message);\n\t}\n\t\n\tpublic boolean isRememberChecked() {\n\t\treturn mRemember.isChecked();\n\t}\n\t\n\tpublic void setRememberChecked(boolean checked) {\n\t\tmRemember.setChecked(checked);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/BaseWebViewFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport java.util.UUID;\n\nimport org.tint.ui.components.CustomWebChromeClient;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.components.CustomWebViewClient;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.utils.Constants;\n\nimport android.app.Fragment;\nimport android.os.Bundle;\nimport android.view.ViewGroup;\nimport android.view.ViewGroup.LayoutParams;\n\npublic abstract class BaseWebViewFragment extends Fragment {\n\t\n\tprotected UUID mUUID;\n\t\n\tprotected UIManager mUIManager;\n\tprotected ViewGroup mParentView;\n\tprotected CustomWebView mWebView;\n\t\n\tprotected boolean mPrivateBrowsing;\n\t\n\tprivate boolean mIsStartPageShown;\n\tprivate boolean mWebViewAddedToParent;\n\t\n\tprivate String mUrlToLoad;\n\t\n\tprotected BaseWebViewFragment() {\n\t\tmUUID = UUID.randomUUID();\n\t\tmPrivateBrowsing = false;\n\t\tmIsStartPageShown = false;\n\t}\n\t\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetRetainInstance(true);\n\t}\n\t\n\tpublic void init(UIManager uiManager, boolean privateBrowsing, String urlToLoad) {\n\t\tmUIManager = uiManager;\n\t\tmPrivateBrowsing = privateBrowsing;\n\t\t\n\t\tmUrlToLoad = urlToLoad;\n\t\t\n\t\tcreateWebView(false);\n\t}\n\t\n\tpublic void resetWebView() {\n\t\tif (mWebViewAddedToParent) {\n\t\t\tmParentView.removeView(mWebView);\n\t\t}\n\t\t\n\t\tcreateWebView(true);\n\t}\n\t\n\tpublic UUID getUUID() {\n\t\treturn mUUID;\n\t}\n\t\n\tpublic CustomWebView getWebView() {\n\t\treturn mWebView;\n\t}\n\t\n\tpublic boolean isStartPageShown() {\n\t\treturn mIsStartPageShown;\n\t}\n\t\n\tpublic void setStartPageShown(boolean value) {\n\t\tmIsStartPageShown = value;\n\t}\n\t\n\tpublic boolean isPrivateBrowsingEnabled() {\n\t\treturn mPrivateBrowsing;\n\t}\n\t\n\tpublic void setPrivateBrowsing(boolean privateBrowsing) {\n\t\tmPrivateBrowsing = privateBrowsing;\n\t}\n\t\n\tpublic boolean isWebViewOnUrl(String url) {\n\t\tif (mWebView != null) {\n\t\t\tString currentUrl = mWebView.getUrl();\n\t\t\t\n\t\t\treturn currentUrl != null && currentUrl.equals(url);\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprotected void onViewCreated() {\n\t\tif (!mWebViewAddedToParent) {\n\t\t\tmParentView.addView(mWebView);\n\t\t\tmWebViewAddedToParent = true;\n\t\t}\n\t\t\n\t\tif (mUrlToLoad != null) {\n\t\t\tmUIManager.loadUrl(this, mUrlToLoad);\n\t\t\tmUrlToLoad = null;\n\t\t}\n\t}\n\t\n\tprivate void createWebView(boolean addToParent) {\n\t\tmWebView = new CustomWebView(mUIManager, mPrivateBrowsing);\n\t\t\n\t\tLayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);\n\t\tmWebView.setLayoutParams(params);\n\t\t\n\t\tmWebView.setParentFragment(this);\n\t\t\n\t\tmWebView.setWebChromeClient(new CustomWebChromeClient(mUIManager));\n\t\tmWebView.setWebViewClient(new CustomWebViewClient(mUIManager));\n\t\t\n\t\tmWebView.setOnTouchListener(mUIManager);\t\t\n\t\t\n\t\tif ((addToParent) &&\n\t\t\t\t(mParentView != null)) {\n\t\t\tmParentView.addView(mWebView);\n\t\t\tmWebViewAddedToParent = true;\n\t\t} else {\n\t\t\tmWebViewAddedToParent = false;\n\t\t}\n\t\t\n\t\t// Little trick here. We must load the url here, in order to\n\t\t// the background loading to work. But if we show the start page\n\t\t// from here, onCreateView() from the inherited class won't be\n\t\t// called (don't know why), and the WebView will never be attached.\n\t\t// So the start page will be loaded when the view has been created,\n\t\t// through onViewCreated().\n\t\tif ((mUrlToLoad != null) &&\n\t\t\t\t(!Constants.URL_ABOUT_START.equals(mUrlToLoad))) {\n\t\t\tmUIManager.loadUrl(this, mUrlToLoad);\n\t\t\tmUrlToLoad = null;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/BookmarksFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.tint.R;\nimport org.tint.addons.AddonMenuItem;\nimport org.tint.controllers.Controller;\nimport org.tint.model.BookmarkHistoryItem;\nimport org.tint.model.BookmarksAdapter;\nimport org.tint.providers.BookmarksProvider;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.ui.activities.EditBookmarkActivity;\nimport org.tint.ui.managers.UIFactory;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.Fragment;\nimport android.app.FragmentBreadCrumbs;\nimport android.app.LoaderManager;\nimport android.app.ProgressDialog;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.Loader;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.database.Cursor;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.preference.PreferenceManager;\nimport android.view.ContextMenu;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\nimport android.view.ContextMenu.ContextMenuInfo;\nimport android.widget.AdapterView;\nimport android.widget.ImageView;\nimport android.widget.AdapterView.AdapterContextMenuInfo;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.GridView;\nimport android.widget.ProgressBar;\n\npublic class BookmarksFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {\n\n\tprivate static final String EXTRA_FOLDER_STACK = \"EXTRA_FOLDER_STACK\";\n\n\tprivate static final String STACK_SEPARATOR = \"//;//\";\n\n\tprivate static final int CONTEXT_MENU_OPEN_IN_TAB = Menu.FIRST;\n\tprivate static final int CONTEXT_MENU_EDIT_BOOKMARK = Menu.FIRST + 1;\n\tprivate static final int CONTEXT_MENU_COPY_URL = Menu.FIRST + 2;\n\tprivate static final int CONTEXT_MENU_SHARE_URL = Menu.FIRST + 3;\n\tprivate static final int CONTEXT_MENU_DELETE_BOOKMARK = Menu.FIRST + 4;\n\n\tprivate static final int CONTEXT_MENU_DELETE_FOLDER = Menu.FIRST + 5;\n\n\tprivate View mContainer = null;\n\n\tprivate UIManager mUIManager;\n\n\tprivate GridView mBookmarksGrid;\n\n\tprivate ProgressBar mProgress;\n\n\tprivate ViewGroup mBreadCrumbGroup;\n\tprivate FragmentBreadCrumbs mFoldersBreadCrumb;\n\tprivate ImageView mBackBreadCrumb;\n\n\tprivate BookmarksAdapter mAdapter;\n\n\tprivate List<NavigationItem> mNavigationList;\n\n\tprivate boolean mIsTablet;\n\tprivate boolean mIsListShown = true;\n\n\tprivate ProgressDialog mProgressDialog;\n\t\n\tprivate OnSharedPreferenceChangeListener mPreferenceChangeListener;\n\n\tpublic BookmarksFragment() {\n\t\tmUIManager = Controller.getInstance().getUIManager();\n\t}\n\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\t\t\n\t\tsuper.onCreate(savedInstanceState);\n\t\t\n\t\tmPreferenceChangeListener = new OnSharedPreferenceChangeListener() {\n\n\t\t\t@Override\n\t\t\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\t\t\tif (Constants.PREFERENCE_BOOKMARKS_SORT_MODE.equals(key)) {\n\t\t\t\t\tgetLoaderManager().restartLoader(0, null, BookmarksFragment.this);\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t};\n\t\t\n\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t}\n\t\n\t@Override\n\tpublic void onDestroy() {\t\t\n\t\tsuper.onDestroy();\n\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t}\n\n\t@Override\n\tpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tmIsTablet = UIFactory.isTablet(getActivity());\n\n\t\tif (mContainer == null) {\n\t\t\tmContainer = inflater.inflate(R.layout.bookmarks_fragment, container, false);\n\t\t\t\n\t\t\tmBreadCrumbGroup = (ViewGroup) mContainer.findViewById(R.id.BookmarksBreadCrumbGroup);\t\t\t\n\n\t\t\tmFoldersBreadCrumb = (FragmentBreadCrumbs) mContainer.findViewById(R.id.BookmarksBreadCrumb);\n\t\t\tmFoldersBreadCrumb.setMaxVisible(2);\n\t\t\tmFoldersBreadCrumb.setActivity(getActivity());\n\n\t\t\tmFoldersBreadCrumb.setParentTitle(getString(R.string.Bookmarks), null, new OnClickListener() {\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(View v) {\n\t\t\t\t\tpopNavigation();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmBackBreadCrumb = (ImageView) mContainer.findViewById(R.id.BookmarksBreadCrumbBackHierarchy);\n\t\t\tmBackBreadCrumb.setOnClickListener(new OnClickListener() {\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t\tpopNavigation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmBookmarksGrid = (GridView) mContainer.findViewById(R.id.BookmarksGridView);\n\t\t\tmProgress = (ProgressBar) mContainer.findViewById(R.id.BookmarksProgressBar);\n\n\t\t\tString[] from = new String[] { BookmarksProvider.Columns.TITLE, BookmarksProvider.Columns.URL };\n\t\t\tint[] to = new int[] { R.id.BookmarkRow_Title, R.id.BookmarkRow_Url };\n\n\t\t\tmAdapter = new BookmarksAdapter(\n\t\t\t\t\tgetActivity(),\n\t\t\t\t\tR.layout.bookmark_row,\n\t\t\t\t\tnull,\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t\t0,\n\t\t\t\t\tR.drawable.browser_thumbnail);\n\n\t\t\tmBookmarksGrid.setAdapter(mAdapter);\n\n\t\t\tmBookmarksGrid.setOnItemClickListener(new OnItemClickListener() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onItemClick(AdapterView<?> parent, View v, int position, long id) {\n\t\t\t\t\tBookmarkHistoryItem item = BookmarksWrapper.getBookmarkById(getActivity().getContentResolver(), id);\n\n\t\t\t\t\tif (item != null) {\n\t\t\t\t\t\tif (item.isFolder()) {\n\t\t\t\t\t\t\tmNavigationList.add(new NavigationItem(item.getId(), item.getTitle()));\n\t\t\t\t\t\t\tupdateFolderId();\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tIntent result = new Intent();\n\t\t\t\t\t\t\tresult.putExtra(Constants.EXTRA_URL, item.getUrl());\n\n\t\t\t\t\t\t\tgetActivity().setResult(Activity.RESULT_OK, result);\n\t\t\t\t\t\t\tgetActivity().finish();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tregisterForContextMenu(mBookmarksGrid);\n\n\t\t\tif (!mIsTablet) {\n\t\t\t\tmBreadCrumbGroup.setVisibility(View.GONE);\n\t\t\t\tmBreadCrumbGroup.setTranslationY(- mBreadCrumbGroup.getHeight());\n\t\t\t}\n\n\t\t\tmNavigationList = new ArrayList<NavigationItem>();\t\t\n\n\t\t\tif ((savedInstanceState != null) && \n\t\t\t\t\t(savedInstanceState.containsKey(EXTRA_FOLDER_STACK))) {\n\t\t\t\tString folderStack = savedInstanceState.getString(EXTRA_FOLDER_STACK);\n\n\t\t\t\tString[] stack = folderStack.split(STACK_SEPARATOR);\n\t\t\t\tfor (int i = 0; i < stack.length; i++) {\n\t\t\t\t\tmNavigationList.add(new NavigationItem(stack[i]));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmNavigationList.add(new NavigationItem(-1, null));\n\t\t\t}\n\n\t\t\tsetListShown(false);\n\n\t\t\tupdateFolderId();\n\t\t}\n\n\t\treturn mContainer;\n\t}\n\n\t@Override\n\tpublic void onSaveInstanceState(Bundle outState) {\t\t\n\t\tsuper.onSaveInstanceState(outState);\n\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (NavigationItem item : mNavigationList) {\n\t\t\tsb.append(item.toString() + STACK_SEPARATOR);\n\t\t}\n\n\t\toutState.putString(EXTRA_FOLDER_STACK, sb.toString());\n\t}\n\n\t@Override\n\tpublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {\n\t\tsuper.onCreateContextMenu(menu, v, menuInfo);\n\n\t\tlong id = ((AdapterContextMenuInfo) menuInfo).id;\n\t\tif (id != -1) {\n\t\t\tBookmarkHistoryItem selectedItem = BookmarksWrapper.getBookmarkById(getActivity().getContentResolver(), id);\n\t\t\tif (selectedItem != null) {\n\n\t\t\t\tmenu.setHeaderTitle(selectedItem.getTitle());\n\n\t\t\t\tif (!selectedItem.isFolder()) {\n\t\t\t\t\tBitmapDrawable icon = ApplicationUtils.getApplicationButtonImage(getActivity(), selectedItem.getFavicon());\n\t\t\t\t\tif (icon != null) {\n\t\t\t\t\t\tmenu.setHeaderIcon(icon);\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tmenu.add(0, CONTEXT_MENU_OPEN_IN_TAB, 0, R.string.OpenInTab);\n\t\t\t\t\tmenu.add(0, CONTEXT_MENU_EDIT_BOOKMARK, 0, R.string.EditBookmark);\n\t\t\t\t\tmenu.add(0, CONTEXT_MENU_COPY_URL, 0, R.string.CopyUrl);\n\t\t\t\t\tmenu.add(0, CONTEXT_MENU_SHARE_URL, 0, R.string.ContextMenuShareUrl);\n\t\t\t\t\tmenu.add(0, CONTEXT_MENU_DELETE_BOOKMARK, 0, R.string.DeleteBookmark);\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmenu.add(0, CONTEXT_MENU_DELETE_FOLDER, 0, R.string.DeleteFolder);\n\n\t\t\t\t}\n\n\t\t\t\tList<AddonMenuItem> addonsContributions = Controller.getInstance().getAddonManager().getContributedBookmarkContextMenuItems(mUIManager.getCurrentWebView());\n\t\t\t\tfor (AddonMenuItem item : addonsContributions) {\n\t\t\t\t\tmenu.add(0, item.getAddon().getMenuId(), 0, item.getMenuItem());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onContextItemSelected(MenuItem item) {\n\t\tfinal AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();\n\n\t\tBookmarkHistoryItem selectedItem = BookmarksWrapper.getBookmarkById(getActivity().getContentResolver(), info.id);\n\n\t\tIntent i;\n\t\tswitch (item.getItemId()) {\n\t\tcase CONTEXT_MENU_OPEN_IN_TAB:\t\t\t\n\t\t\tif (item != null) {\n\t\t\t\tIntent result = new Intent();\n\t\t\t\tresult.putExtra(Constants.EXTRA_NEW_TAB, true);\n\t\t\t\tresult.putExtra(Constants.EXTRA_URL, selectedItem.getUrl());\n\n\t\t\t\tgetActivity().setResult(Activity.RESULT_OK, result);\n\t\t\t\tgetActivity().finish();\n\t\t\t}\n\t\t\treturn true;\n\n\t\tcase CONTEXT_MENU_EDIT_BOOKMARK:\n\t\t\tif (selectedItem != null) {\n\t\t\t\ti = new Intent(getActivity(), EditBookmarkActivity.class);\n\t\t\t\ti.putExtra(Constants.EXTRA_ID, info.id);\n\t\t\t\ti.putExtra(Constants.EXTRA_FOLDER_ID, selectedItem.getFolderId());\n\t\t\t\ti.putExtra(Constants.EXTRA_LABEL, selectedItem.getTitle());\n\t\t\t\ti.putExtra(Constants.EXTRA_URL, selectedItem.getUrl());\n\n\t\t\t\tstartActivity(i);\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\tcase CONTEXT_MENU_COPY_URL:\n\t\t\tif (selectedItem != null) {\n\t\t\t\tApplicationUtils.copyTextToClipboard(getActivity(), selectedItem.getUrl(), getActivity().getResources().getString(R.string.UrlCopyToastMessage));\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\tcase CONTEXT_MENU_SHARE_URL:\n\t\t\tif (selectedItem != null) {\n\t\t\t\tApplicationUtils.sharePage(getActivity(), null, selectedItem.getUrl());\t\t\t\t\t\t\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\tcase CONTEXT_MENU_DELETE_BOOKMARK:\n\t\t\tBookmarksWrapper.deleteBookmark(getActivity().getContentResolver(), info.id);\n\t\t\treturn true;\n\n\t\tcase CONTEXT_MENU_DELETE_FOLDER:\n\t\t\tAlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\n\t\t\tbuilder.setCancelable(true);\n\t\t\tbuilder.setIcon(android.R.drawable.ic_dialog_info);\n\t\t\tbuilder.setTitle(R.string.DeleteFolder);\n\t\t\tbuilder.setMessage(R.string.ConfirmDeleteFolderMessage);\n\n\t\t\tbuilder.setPositiveButton(R.string.Yes, new DialogInterface.OnClickListener() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\tdoDeleteFolder(info.id);\t\t\t\t\t\n\t\t\t\t}\t\t\t\t\n\t\t\t});\n\n\t\t\tbuilder.setNegativeButton(R.string.No, null);\n\n\t\t\tbuilder.create().show();\n\n\t\t\treturn true;\n\n\t\tdefault:\n\t\t\tif (Controller.getInstance().getAddonManager().onContributedBookmarkContextMenuItemSelected(\n\t\t\t\t\tgetActivity(),\n\t\t\t\t\titem.getItemId(),\n\t\t\t\t\tselectedItem.getTitle(),\n\t\t\t\t\tselectedItem.getUrl(),\n\t\t\t\t\tmUIManager.getCurrentWebView())) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn super.onContextItemSelected(item);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic Loader<Cursor> onCreateLoader(int id, Bundle args) {\n\t\tsetListShown(false);\n\t\treturn BookmarksWrapper.getCursorLoaderForBookmarks(getActivity(), mNavigationList.get(mNavigationList.size() - 1).getId());\n\t}\n\n\t@Override\n\tpublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {\n\t\tmAdapter.swapCursor(data);\n\t\tsetListShown(true);\n\t}\n\n\t@Override\n\tpublic void onLoaderReset(Loader<Cursor> loader) {\n\t\tmAdapter.swapCursor(null);\n\t}\n\n\tprivate void setListShown(boolean shown) {\n\t\tif (mIsListShown == shown) {\n\t\t\treturn;\n\t\t}\n\n\t\tmIsListShown = shown;\n\n\t\tif (shown) {\n\t\t\tmProgress.setVisibility(View.GONE);\n\t\t\tmBookmarksGrid.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\tmProgress.setVisibility(View.VISIBLE);\n\t\t\tmBookmarksGrid.setVisibility(View.GONE);\n\t\t}\n\t}\n\n\tprivate void updateFolderId() {\n\t\tif (mAdapter != null) {\n\t\t\tmAdapter.swapCursor(null);\n\t\t}\n\n\t\tNavigationItem current = mNavigationList.get(mNavigationList.size() - 1);\n\t\tif (current.getId() == -1) {\n\t\t\tif (!mIsTablet) {\n\t\t\t\t// Dirty workaround for the first time the BreadCrumb is shown.\n\t\t\t\t// At this time, its size has not been computed, so its height is 0 \n\t\t\t\t// and does not show with an animation.\n\t\t\t\tint height = mBreadCrumbGroup.getHeight();\n\t\t\t\tif (height == 0) {\n\t\t\t\t\theight = 80;\n\t\t\t\t}\n\n\t\t\t\tAnimatorSet animator = new AnimatorSet();\n\t\t\t\tanimator.play(ObjectAnimator.ofFloat(mBreadCrumbGroup, \"translationY\", - height));\n\n\t\t\t\tanimator.addListener(new AnimatorListenerAdapter() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onAnimationEnd(Animator animation) {\n\t\t\t\t\t\tmBreadCrumbGroup.setVisibility(View.GONE);\n\t\t\t\t\t\tgetLoaderManager().restartLoader(0, null, BookmarksFragment.this);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t});\n\n\t\t\t\tanimator.start();\n\n\t\t\t} else {\n\t\t\t\tmBackBreadCrumb.setVisibility(View.GONE);\n\t\t\t\tgetLoaderManager().restartLoader(0, null, this);\n\t\t\t}\n\n\t\t\tmFoldersBreadCrumb.setParentTitle(getString(R.string.Bookmarks), null, new OnClickListener() {\t\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t\tpopNavigation();\n\t\t\t\t}\n\t\t\t});\n\n\t\t} else {\t\t\t\n\t\t\tif (!mIsTablet) {\n\t\t\t\tmBreadCrumbGroup.setVisibility(View.VISIBLE);\n\n\t\t\t\tAnimatorSet animator = new AnimatorSet();\n\t\t\t\tanimator.play(ObjectAnimator.ofFloat(mBreadCrumbGroup, \"translationY\", 0));\n\n\t\t\t\tanimator.addListener(new AnimatorListenerAdapter() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onAnimationEnd(Animator animation) {\n\t\t\t\t\t\tmBreadCrumbGroup.requestLayout();\n\t\t\t\t\t\tgetLoaderManager().restartLoader(0, null, BookmarksFragment.this);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t});\n\n\t\t\t\tanimator.start();\n\n\t\t\t} else {\n\t\t\t\tmBackBreadCrumb.setVisibility(View.VISIBLE);\n\t\t\t\tgetLoaderManager().restartLoader(0, null, this);\n\t\t\t}\n\n\t\t\tif (mNavigationList.size() > 2) {\n\t\t\t\tNavigationItem previous = mNavigationList.get(mNavigationList.size() - 2);\n\t\t\t\tmFoldersBreadCrumb.setParentTitle(previous.getTitle(), null, new OnClickListener() {\t\t\t\t\t\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t\t\tpopNavigation();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmFoldersBreadCrumb.setParentTitle(getString(R.string.Bookmarks), null, new OnClickListener() {\t\t\t\t\t\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t\t\tpopNavigation();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tmFoldersBreadCrumb.setTitle(current.getTitle(), current.getTitle());\n\t}\n\n\tprivate void popNavigation() {\n\t\tmNavigationList.remove(mNavigationList.size() - 1);\n\t\tupdateFolderId();\n\t}\n\n\tprivate void doDeleteFolder(long folderId) {\n\t\tmProgressDialog = ProgressDialog.show(\n\t\t\t\tgetActivity(),\n\t\t\t\tgetString(R.string.DeleteFolderTitle),\n\t\t\t\tgetString(R.string.DeleteFolderMessage));\n\n\t\tnew Thread(new DeleteFolderRunnable(folderId)).start();\n\t}\n\n\t@SuppressLint(\"HandlerLeak\")\n\tprivate class DeleteFolderRunnable implements Runnable {\n\n\t\tprivate long mFolderId;\n\n\t\tpublic DeleteFolderRunnable(long folderId) {\n\t\t\tmFolderId = folderId;\n\t\t}\n\n\t\t@Override\n\t\tpublic void run() {\t\t\t\n\t\t\tBookmarksWrapper.deleteFolder(getActivity().getContentResolver(), mFolderId);\n\t\t\tmHandler.sendEmptyMessage(0);\n\t\t}\n\n\t\tprivate Handler mHandler = new Handler() {\n\t\t\tpublic void handleMessage(Message msg) {\n\t\t\t\tmProgressDialog.dismiss();\n\t\t\t\tgetLoaderManager().restartLoader(0, null, BookmarksFragment.this);\n\t\t\t}\n\t\t};\n\n\t}\n\n\tprivate class NavigationItem {\n\t\tprivate long mId;\n\t\tprivate String mTitle;\n\n\t\tpublic NavigationItem(long id, String title) {\n\t\t\tmId = id;\n\t\t\tmTitle = title;\n\t\t}\n\n\t\tpublic NavigationItem(String builder) {\n\t\t\tif ((builder.startsWith(\"{\")) &&\n\t\t\t\t\t(builder.endsWith(\"}\"))) {\n\n\t\t\t\ttry {\n\t\t\t\t\tbuilder = builder.substring(1, builder.length() - 1);\n\t\t\t\t\tString[] parts = builder.split(\",\");\n\n\t\t\t\t\tmId = Long.parseLong(parts[0]);\n\t\t\t\t\tif (mId == -1) {\n\t\t\t\t\t\tmTitle = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmTitle = parts[1];\n\t\t\t\t\t}\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tmId = -1;\n\t\t\t\t\tmTitle = null;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tmId = -1;\n\t\t\t\tmTitle = null;\n\t\t\t}\n\t\t}\n\n\t\tpublic long getId() {\n\t\t\treturn mId;\n\t\t}\n\n\t\tpublic String getTitle() {\n\t\t\treturn mTitle;\n\t\t}\n\n\t\t@Override\n\t\tpublic String toString() {\n\t\t\treturn String.format(\"{%s,%s}\", mId, mTitle);\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/HistoryFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport java.util.List;\n\nimport org.tint.R;\nimport org.tint.addons.AddonMenuItem;\nimport org.tint.controllers.Controller;\nimport org.tint.model.HistoryAdapter;\nimport org.tint.model.BookmarkHistoryItem;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\n\nimport android.app.Activity;\nimport android.app.Fragment;\nimport android.app.FragmentBreadCrumbs;\nimport android.app.LoaderManager;\nimport android.content.Intent;\nimport android.content.Loader;\nimport android.database.Cursor;\nimport android.database.DataSetObserver;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.os.Bundle;\nimport android.view.ContextMenu;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ContextMenu.ContextMenuInfo;\nimport android.webkit.DateSorter;\nimport android.widget.AbsListView;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.AdapterContextMenuInfo;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.BaseAdapter;\nimport android.widget.CompoundButton;\nimport android.widget.ExpandableListView;\nimport android.widget.ProgressBar;\nimport android.widget.CompoundButton.OnCheckedChangeListener;\nimport android.widget.ExpandableListView.OnChildClickListener;\nimport android.widget.ExpandableListView.OnGroupCollapseListener;\nimport android.widget.ExpandableListView.OnGroupExpandListener;\nimport android.widget.ListView;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport android.widget.ExpandableListView.ExpandableListContextMenuInfo;\n\npublic class HistoryFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {\n\t\n\tprivate static final int CONTEXT_MENU_OPEN_IN_TAB = Menu.FIRST;\n\tprivate static final int CONTEXT_MENU_COPY_URL = Menu.FIRST + 1;\n\tprivate static final int CONTEXT_MENU_SHARE_URL = Menu.FIRST + 2;\n\tprivate static final int CONTEXT_MENU_DELETE_HISTORY_ITEM = Menu.FIRST + 3;\n\t\n\tprivate View mContainer = null;\n\t\n\tprivate UIManager mUIManager;\n\t\n\tprivate ExpandableListView mListView;\n\t\n\tprivate ListView mGroupList;\n\tprivate ListView mChildList;\n\t\n\tprivate ProgressBar mProgress;\n\t\n\tprivate FragmentBreadCrumbs mChildHeader;\n\t\n\tprivate HistoryAdapter mAdapter;\n\t\n\tprivate HistoryGroupWrapper mGroupAdapter;\n\tprivate HistoryChildWrapper mChildAdapter;\n\t\n\tprivate boolean mTwoPaneMode;\n\t\n\tprivate boolean mIsListShown = true;\n\t\n\tprivate int mSelectedGroup;\t\n\tprivate boolean[] mExpandedGroups = new boolean[DateSorter.DAY_COUNT];\n\t\n\tprivate boolean mAfterDelete = false;\n\t\n\tprivate OnCheckedChangeListener mBookmarkStarChangeListener;\n\t\n\tpublic HistoryFragment() {\n\t\tmUIManager = Controller.getInstance().getUIManager();\n\t\t\n\t\tfor (int i = 0; i < mExpandedGroups.length; i++) {\n\t\t\tmExpandedGroups[i] = false;\n\t\t}\n\t\t\n\t\tmExpandedGroups[0] = true;\n\t}\n\t\n\t@Override\n\tpublic void onActivityCreated(Bundle savedInstanceState) {\n\t\tsuper.onActivityCreated(savedInstanceState);\n\t\t\n\t\t\n\t}\n\t\n\t@Override\n\tpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tif (mContainer == null) {\n\t\t\tmContainer = inflater.inflate(R.layout.history_fragment, container, false);\n\t\t\t\n\t\t\tView stub = mContainer.findViewById(R.id.history_group);\n\t\t\t\n\t\t\tif (stub == null) {\n\t\t\t\tinflateSinglePane();\n\t\t\t} else {\n\t\t\t\tinflateTwoPane();\n\t\t\t}\n\t\t\t\n\t\t\tmBookmarkStarChangeListener = new OnCheckedChangeListener() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n\t\t\t\t\tlong id = (Long) buttonView.getTag();\n\t\t\t\t\tBookmarksWrapper.toggleBookmark(getActivity().getContentResolver(), id, isChecked);\n\t\t\t\t\t\n\t\t\t\t\tif (isChecked) {\n\t\t\t\t\t\tToast.makeText(getActivity(), R.string.BookmarkAdded, Toast.LENGTH_SHORT).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tToast.makeText(getActivity(), R.string.BookmarkRemoved, Toast.LENGTH_SHORT).show();\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\n\t\t\t};\n\t\t\t\n\t\t\tmAdapter = new HistoryAdapter(getActivity(),\n\t\t\t\t\tmBookmarkStarChangeListener,\n\t\t\t\t\tgetActivity().getResources().getInteger(R.integer.favicon_size));\n\t\t\t\n\t\t\tif (mTwoPaneMode) {\n\t\t\t\t\n\t\t\t\tmGroupAdapter = new HistoryGroupWrapper(mAdapter);\n\t\t\t\tmGroupList.setAdapter(mGroupAdapter);\n\t\t\t\t\n\t\t\t\tmChildAdapter = new HistoryChildWrapper(mAdapter);\n\t\t\t\tmChildList.setAdapter(mChildAdapter);\n\t\t\t\t\n\t\t\t\tregisterForContextMenu(mChildList);\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tmListView.setAdapter(mAdapter);\t\t\n\t\t\t\tregisterForContextMenu(mListView);\n\t\t\t}\n\t\t\t\n\t\t\tsetListShown(false);\n\t\t\t\n\t\t\tgetLoaderManager().initLoader(0, null, this);\n\t\t}\n\t\t\n\t\treturn mContainer;\n\t}\n\t\n\t@Override\n\tpublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {\n\t\tsuper.onCreateContextMenu(menu, v, menuInfo);\n\t\t\n\t\tBookmarkHistoryItem selectedItem = null;\n\t\t\n\t\tif (mTwoPaneMode) {\n\t\t\tAdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;\n\t\t\t\n\t\t\tint group = mChildAdapter.getSelectedGroup();\n\t\t\tint child = info.position;\n\t\t\t\n\t\t\tselectedItem = (BookmarkHistoryItem) mAdapter.getChild(group, child);\n\t\t} else {\n\t\t\tExpandableListView.ExpandableListContextMenuInfo info =\t(ExpandableListView.ExpandableListContextMenuInfo) menuInfo;\n\n\t\t\tint type = ExpandableListView.getPackedPositionType(info.packedPosition);\n\n\t\t\tif (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {\n\t\t\t\tint group = ExpandableListView.getPackedPositionGroup(info.packedPosition);\n\t\t\t\tint child =\tExpandableListView.getPackedPositionChild(info.packedPosition);\n\n\t\t\t\tselectedItem = (BookmarkHistoryItem) mAdapter.getChild(group, child);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (selectedItem != null) {\n\t\t\tBitmapDrawable icon = ApplicationUtils.getApplicationButtonImage(getActivity(), selectedItem.getFavicon());\n\t\t\tif (icon != null) {\n\t\t\t\tmenu.setHeaderIcon(icon);\n\t\t\t}\n\n\t\t\tmenu.setHeaderTitle(selectedItem.getTitle());\n\t\t\t\n\t\t\tmenu.add(0, CONTEXT_MENU_OPEN_IN_TAB, 0, R.string.OpenInTab);\t\n\t\t\tmenu.add(0, CONTEXT_MENU_COPY_URL, 0, R.string.CopyUrl);\n\t\t\tmenu.add(0, CONTEXT_MENU_SHARE_URL, 0, R.string.ContextMenuShareUrl);\n\t\t\tmenu.add(0, CONTEXT_MENU_DELETE_HISTORY_ITEM, 0, R.string.DeleteHistoryItem);\n\t\t\t\n\t\t\tList<AddonMenuItem> addonsContributions = Controller.getInstance().getAddonManager().getContributedHistoryContextMenuItems(mUIManager.getCurrentWebView());\n\t        for (AddonMenuItem item : addonsContributions) {\n\t        \tmenu.add(0, item.getAddon().getMenuId(), 0, item.getMenuItem());\n\t        }\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic boolean onContextItemSelected(MenuItem menuItem) {\n\t\t\n\t\tBookmarkHistoryItem selectedItem = null;\n\t\t\n\t\tif (mTwoPaneMode) {\n\t\t\tAdapterContextMenuInfo info = (AdapterContextMenuInfo) menuItem.getMenuInfo();\n\t\t\t\n\t\t\tint group = mChildAdapter.getSelectedGroup();\n\t\t\tint child = info.position;\n\t\t\t\n\t\t\tselectedItem = (BookmarkHistoryItem) mAdapter.getChild(group, child);\n\t\t\t\n\t\t} else {\n\t\t\tExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo();\n\n\t\t\tint type = ExpandableListView.getPackedPositionType(info.packedPosition);\n\n\t\t\tif (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {\n\t\t\t\tint group = ExpandableListView.getPackedPositionGroup(info.packedPosition);\n\t\t\t\tint child =\tExpandableListView.getPackedPositionChild(info.packedPosition);\n\n\t\t\t\tselectedItem = (BookmarkHistoryItem) mAdapter.getChild(group, child);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (selectedItem != null) {\n\t\t\tswitch (menuItem.getItemId()) {\n\t\t\tcase CONTEXT_MENU_OPEN_IN_TAB:\n\t\t\t\tIntent result = new Intent();\n\t\t\t\tresult.putExtra(Constants.EXTRA_NEW_TAB, true);\n\t\t\t\tresult.putExtra(Constants.EXTRA_URL, selectedItem.getUrl());\n\t\t\t\t\n\t\t\t\tgetActivity().setResult(Activity.RESULT_OK, result);\n\t\t\t\tgetActivity().finish();\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t\t\n\t\t\tcase CONTEXT_MENU_COPY_URL:\n\t\t\t\tif (selectedItem != null) {\n\t\t\t\t\tApplicationUtils.copyTextToClipboard(getActivity(), selectedItem.getUrl(), getActivity().getResources().getString(R.string.UrlCopyToastMessage));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t\t\n\t\t\tcase CONTEXT_MENU_SHARE_URL:\n\t\t\t\tif (selectedItem != null) {\n\t\t\t\t\tApplicationUtils.sharePage(getActivity(), null, selectedItem.getUrl());\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t\t\n\t\t\tcase CONTEXT_MENU_DELETE_HISTORY_ITEM:\n\t\t\t\tBookmarksWrapper.deleteHistoryRecord(getActivity().getContentResolver(), selectedItem.getId());\n\t\t\t\tmAfterDelete = true;\n\t\t\t\treturn true;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tif (Controller.getInstance().getAddonManager().onContributedHistoryContextMenuItemSelected(\n\t\t\t\t\t\tgetActivity(),\n\t\t\t\t\t\tmenuItem.getItemId(),\n\t\t\t\t\t\tselectedItem.getTitle(),\n\t\t\t\t\t\tselectedItem.getUrl(),\n\t\t\t\t\t\tmUIManager.getCurrentWebView())) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\treturn super.onContextItemSelected(menuItem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn super.onContextItemSelected(menuItem);\n\t}\n\n\t@Override\n\tpublic Loader<Cursor> onCreateLoader(int id, Bundle args) {\n\t\tmSelectedGroup = 0;\n\t\tsetListShown(false);\n\t\t\n\t\treturn BookmarksWrapper.getCursorLoaderForHistory(getActivity());\n\t}\n\n\t@Override\n\tpublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {\n\t\tmAdapter.changeCursor(data);\n\t\t\n\t\tif (data != null) {\n\t\t\t\n\t\t\tif (!mTwoPaneMode) {\n\t\t\t\tif (!mAfterDelete) {\n\t\t\t\t\tif (mAdapter.getGroupCount() > 0) {\n\t\t\t\t\t\tfor (int i = 0; i < mExpandedGroups.length; i++) {\n\t\t\t\t\t\t\tif (mExpandedGroups[i]) {\n\t\t\t\t\t\t\t\tmListView.expandGroup(i, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmAfterDelete = false;\n\t\t\t} else {\n\t\t\t\t// Select previously selected group.\n\t\t\t\tselectGroup(mAdapter.getGroupView(mSelectedGroup, false, null, null), mSelectedGroup);\n\t\t\t}\n\t\t}\n\t\t\n\t\tsetListShown(true);\n\t}\n\n\t@Override\n\tpublic void onLoaderReset(Loader<Cursor> loader) {\n\t\tmAdapter.changeCursor(null);\n\t}\n\t\n\tprivate void setListShown(boolean shown) {\n\t\tif (mIsListShown == shown) {\n\t\t\treturn;\n\t\t}\n\n\t\tmIsListShown = shown;\n\n\t\tif (shown) {\n\t\t\tmProgress.setVisibility(View.GONE);\n\t\t\t\n\t\t\tif (mTwoPaneMode) {\n\t\t\t\tmChildList.setVisibility(View.VISIBLE);\n\t\t\t} else {\n\t\t\t\tmListView.setVisibility(View.VISIBLE);\n\t\t\t}\n\t\t} else {\n\t\t\tmProgress.setVisibility(View.VISIBLE);\n\t\t\t\n\t\t\tif (mTwoPaneMode) {\n\t\t\t\tmChildList.setVisibility(View.VISIBLE);\n\t\t\t} else {\n\t\t\t\tmListView.setVisibility(View.VISIBLE);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void inflateSinglePane() {\n\t\tmTwoPaneMode = false;\n\t\t\n\t\tmListView = (ExpandableListView) mContainer.findViewById(R.id.HistoryExpandableList);\n\t\t\n\t\tmListView.setOnGroupExpandListener(new OnGroupExpandListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onGroupExpand(int groupPosition) {\n\t\t\t\tmExpandedGroups[groupPosition] = true;\n\t\t\t}\n\t\t});\n\t\t\n\t\tmListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onGroupCollapse(int groupPosition) {\n\t\t\t\tmExpandedGroups[groupPosition] = false;\n\t\t\t}\n\t\t});\n\t\t\n\t\tmListView.setOnChildClickListener(new OnChildClickListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {\n\t\t\t\topenItem(groupPosition, childPosition);\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t\t\n\t\tmProgress = (ProgressBar) mContainer.findViewById(R.id.HistoryProgressBar);\n\t}\n\t\n\tprivate void inflateTwoPane() {\n\t\tmTwoPaneMode = true;\n\t\t\n\t\tmChildHeader = (FragmentBreadCrumbs) mContainer.findViewById(R.id.history_child_breadcrumbs);\n\t\tmChildHeader.setMaxVisible(1);\n\t\tmChildHeader.setActivity(getActivity());\n\t\t\n\t\tmGroupList = (ListView) mContainer.findViewById(R.id.history_group_list);\n\t\tmChildList = (ListView) mContainer.findViewById(R.id.history_child_list);\n\t\t\n\t\tmGroupList.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);\n\t\t\n\t\tmGroupList.setOnItemClickListener(new OnItemClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n\t\t\t\tselectGroup(view, position);\n\t\t\t}\n\t\t});\n\t\t\n\t\tmChildList.setOnItemClickListener(new OnItemClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n\t\t\t\topenItem(mChildAdapter.getSelectedGroup(), position);\n\t\t\t}\n\t\t});\n\t\t\n\t\tmProgress = (ProgressBar) mContainer.findViewById(R.id.HistoryProgressBar);\n\t}\n\t\n\tprivate void openItem(int groupPosition, int childPosition) {\n\t\tBookmarkHistoryItem item = (BookmarkHistoryItem) mAdapter.getChild(groupPosition, childPosition);\n\t\tIntent result = new Intent();\n\t\tresult.putExtra(Constants.EXTRA_NEW_TAB, false);\n\t\tresult.putExtra(Constants.EXTRA_URL, item.getUrl());\n\t\t\n\t\tgetActivity().setResult(Activity.RESULT_OK, result);\n\t\tgetActivity().finish();\n\t}\n\t\n\tprivate void selectGroup(View view, int position) {\n\t\tCharSequence title = ((TextView) view).getText();\n\t\tmChildHeader.setTitle(title, title);\n\t\t\n\t\tmChildAdapter.setSelectedGroup(position);\n\t\tmGroupList.setItemChecked(position, true);\n\t\t\n\t\tmSelectedGroup = position;\n\t}\n\t\n\tprivate abstract class HistoryWrapper extends BaseAdapter {\n\t\t\n\t\tprotected HistoryAdapter mHistoryAdapter;\n\t\t\n\t\tprivate DataSetObserver mObserver = new DataSetObserver() {\n            @Override\n            public void onChanged() {\n                super.onChanged();\n                notifyDataSetChanged();\n            }\n\n            @Override\n            public void onInvalidated() {\n                super.onInvalidated();\n                notifyDataSetInvalidated();\n            }\n        };\n        \n        public HistoryWrapper(HistoryAdapter adapter) {\n        \tmHistoryAdapter = adapter;\n        \tmHistoryAdapter.registerDataSetObserver(mObserver);\n        }\n\t}\n\t\n\tprivate class HistoryGroupWrapper extends HistoryWrapper {\n\n\t\tpublic HistoryGroupWrapper(HistoryAdapter adapter) {\n\t\t\tsuper(adapter);\n\t\t}\n\n\t\t@Override\n\t\tpublic int getCount() {\n\t\t\treturn mAdapter.getGroupCount();\n\t\t}\n\n\t\t@Override\n\t\tpublic Object getItem(int position) {\n\t\t\treturn null;\n\t\t}\n\n\t\t@Override\n\t\tpublic long getItemId(int position) {\n\t\t\treturn position;\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n            return mAdapter.getGroupView(position, false, convertView, parent);\n\t\t}\n\t}\n\t\n\tprivate class HistoryChildWrapper extends HistoryWrapper {\n\n\t\tprivate int mSelectedGroup;\n\t\t\n\t\tpublic HistoryChildWrapper(HistoryAdapter adapter) {\n\t\t\tsuper(adapter);\n\t\t}\n\n\t\t@Override\n\t\tpublic int getCount() {\n\t\t\treturn mAdapter.getChildrenCount(mSelectedGroup);\n\t\t}\n\n\t\t@Override\n\t\tpublic Object getItem(int position) {\n\t\t\treturn null;\n\t\t}\n\n\t\t@Override\n\t\tpublic long getItemId(int position) {\n\t\t\treturn position;\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\treturn mAdapter.getChildView(mSelectedGroup, position, false, convertView, parent);\n\t\t}\n\t\t\n\t\tpublic void setSelectedGroup(int groupPosition) {\n            mSelectedGroup = groupPosition;\n            notifyDataSetChanged();\n        }\n\t\t\n\t\tpublic int getSelectedGroup() {\n\t\t\treturn mSelectedGroup;\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/LegacyPhoneStartPageFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport org.tint.R;\n\npublic class LegacyPhoneStartPageFragment extends StartPageFragment {\n\n\t@Override\n\tprotected int getStartPageFragmentLayout() {\n\t\treturn R.layout.legacy_phone_start_page_fragment;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/PhoneStartPageFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport org.tint.R;\n\npublic class PhoneStartPageFragment extends StartPageFragment {\n\t\n\t@Override\n\tprotected int getStartPageFragmentLayout() {\n\t\treturn R.layout.phone_start_page_fragment;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/PhoneWebViewFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport org.tint.R;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\npublic class PhoneWebViewFragment extends BaseWebViewFragment {\n\t\n\tpublic PhoneWebViewFragment() {\t\n\t\tsuper();\n\t}\n\t\n\t@Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tif (mParentView == null) {\n\t\t\tmParentView = (ViewGroup) inflater.inflate(R.layout.webview_container_fragment, container, false);\n\t\t}\n\t\t\n\t\tonViewCreated();\n\t\t\n\t\treturn mParentView;\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/StartPageFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport org.tint.R;\nimport org.tint.model.BookmarkHistoryItem;\nimport org.tint.model.BookmarksAdapter;\nimport org.tint.providers.BookmarksProvider;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.managers.UIManager;\nimport org.tint.utils.Constants;\n\nimport android.app.Activity;\nimport android.app.Fragment;\nimport android.app.LoaderManager;\nimport android.content.Loader;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport android.preference.PreferenceManager;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.GridView;\nimport android.widget.AdapterView.OnItemClickListener;\n\npublic abstract class StartPageFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {\n\n\tpublic interface OnStartPageItemClickedListener {\n\t\tpublic void onStartPageItemClicked(String url);\n\t}\n\t\n\tprivate View mParentView = null;\n\t\n\tprivate GridView mGrid;\t\n\tprivate BookmarksAdapter mAdapter;\n\t\n\tprivate OnStartPageItemClickedListener mListener = null;\n\t\n\tprivate OnSharedPreferenceChangeListener mPreferenceChangeListener;\n\t\n\tprotected UIManager mUIManager;\n\t\n\tprivate boolean mInitialized;\n\t\n\tprivate boolean mListShown = true;\n\t\n\tpublic StartPageFragment() {\n\t\tmInitialized = false;\n\t}\n\t\n\t@Override\n\tpublic void onAttach(Activity activity) {\n\t\tsuper.onAttach(activity);\n\t\t\n\t\tif (!mInitialized) {\n\t\t\ttry {\n\t\t\t\tmUIManager = ((TintBrowserActivity) activity).getUIManager();\n\t\t\t} catch (ClassCastException e) {\n\t\t\t\tLog.e(\"StartPageFragment.onAttach()\", e.getMessage());\n\t\t\t}\n\t\t\t\n\t\t\tmInitialized = true;\n\t\t}\t\t\n\t}\n\t\n\t@Override\n\tpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tif (mParentView == null) {\t\t\n\t\t\tmParentView = inflater.inflate(getStartPageFragmentLayout(), container, false);\n\t\t\tmGrid = (GridView) mParentView.findViewById(R.id.StartPageFragmentGrid);\n\t\t\t\n\t\t\tString[] from = new String[] { BookmarksProvider.Columns.TITLE, BookmarksProvider.Columns.URL };\n\t\t\tint[] to = new int[] { R.id.StartPageRowTitle, R.id.StartPageRowUrl };\n\t\t\t\n\t\t\tmAdapter = new BookmarksAdapter(\n\t\t\t\t\tgetActivity(),\n\t\t\t\t\tR.layout.start_page_row,\n\t\t\t\t\tnull,\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t\t0,\n\t\t\t\t\tR.drawable.browser_thumbnail);\n\t\t\t\n\t\t\tmGrid.setAdapter(mAdapter);\n\t\t\t\n\t\t\tmGrid.setOnItemClickListener(new OnItemClickListener() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onItemClick(AdapterView<?> parent, View v, int position, long id) {\n\t\t\t\t\tif (mListener != null) {\n\t\t\t\t\t\tBookmarkHistoryItem item = BookmarksWrapper.getBookmarkById(getActivity().getContentResolver(), id);\n\n\t\t\t\t\t\tif (item != null) {\n\t\t\t\t\t\t\tmListener.onStartPageItemClicked(item.getUrl());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tmGrid.setOnTouchListener(mUIManager);\t\t\n\t\t\t\n\t\t\tmPreferenceChangeListener = new OnSharedPreferenceChangeListener() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\t\t\t\tif (Constants.PREFERENCE_START_PAGE_LIMIT.equals(key)) {\n\t\t\t\t\t\tgetLoaderManager().restartLoader(0, null, StartPageFragment.this);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\n\t\t\t};\n\n\t\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t\t}\n\t\t\n\t\treturn mParentView;\n\t}\n\t\n\t@Override\n\tpublic void onActivityCreated(Bundle savedInstanceState) {\n\t\tsuper.onActivityCreated(savedInstanceState);\n\t\t\n\t\tsetListShown(false);\n\t\t\n\t\tmParentView.postDelayed(new Runnable() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tif (isAdded()) {\n\t\t\t\t\tgetLoaderManager().initLoader(0, null, StartPageFragment.this);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 100);\n\t}\t\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(mPreferenceChangeListener);\n\t\tsuper.onDestroy();\n\t}\n\n\t@Override\n\tpublic Loader<Cursor> onCreateLoader(int id, Bundle args) {\n\t\tint limit;\n\t\ttry {\n\t\t\tlimit = Integer.parseInt(\n\t\t\t\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).getString(\n\t\t\t\t\t\t\tConstants.PREFERENCE_START_PAGE_LIMIT,\n\t\t\t\t\t\t\tInteger.toString(getResources().getInteger(R.integer.default_start_page_items_number))));\n\t\t} catch (Exception e) {\n\t\t\tlimit = getResources().getInteger(R.integer.default_start_page_items_number);\n\t\t}\n\t\t\n\t\treturn BookmarksWrapper.getCursorLoaderForStartPage(getActivity(), limit);\n\t}\n\n\t@Override\n\tpublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {\n\t\tmAdapter.swapCursor(data);\n\t\tsetListShown(true);\n\t}\n\n\t@Override\n\tpublic void onLoaderReset(Loader<Cursor> loader) {\n\t\tmAdapter.swapCursor(null);\n\t}\n\t\n\tpublic void setOnStartPageItemClickedListener(OnStartPageItemClickedListener listener) {\n\t\tmListener = listener;\n\t}\n\t\n\tprotected abstract int getStartPageFragmentLayout();\n\t\n\tprivate void setListShown(boolean shown) {\n\t\t\n\t\tif (mListShown == shown) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tmListShown = shown;\n\t\t\n\t\tif (shown) {\n\t\t\tmGrid.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\tmGrid.setVisibility(View.GONE);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/TabletStartPageFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport org.tint.R;\n\npublic class TabletStartPageFragment extends StartPageFragment {\n\n\t@Override\n\tprotected int getStartPageFragmentLayout() {\n\t\treturn R.layout.tablet_start_page_fragment;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/fragments/TabletWebViewFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.fragments;\n\nimport org.tint.R;\nimport org.tint.ui.managers.UIManager;\n\nimport android.app.ActionBar.Tab;\nimport android.text.TextUtils;\nimport android.webkit.WebView;\n\npublic class TabletWebViewFragment extends PhoneWebViewFragment {\n\t\n\tprivate Tab mTab;\n\t\n\tpublic TabletWebViewFragment() {\t\n\t\tsuper();\n\t}\n\t\n\tpublic void init(UIManager uiManager, Tab tab, boolean privateBrowsing, String urlToLoad) {\n\t\tmTab = tab;\n\t\tinit(uiManager, privateBrowsing, urlToLoad);\n\t}\n\t\n\tpublic void onTabSelected(Tab tab) {\n\t\tmTab = tab;\n\t\t\n\t\tif (mWebView != null) {\n\t\t\tmWebView.requestFocus();\n\t\t}\n\t}\n\t\n\tpublic Tab getTab() {\n\t\treturn mTab;\n\t}\n\t\n\tpublic void onReceivedTitle(WebView view, String title) {\n\t\tif (view == mWebView) {\n\t\t\tif (!TextUtils.isEmpty(title)) {\n\t\t\t\tmTab.setText(stripTitle(title));\n\t\t\t} else {\n\t\t\t\tmTab.setText(R.string.NewTab);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate String stripTitle(String title) {\t\t\n\t\tint length = mUIManager.getMainActivity().getResources().getInteger(R.integer.tab_title_length);\n\t\t\n\t\tif (title.length() > length) {\n\t\t\ttitle = title.substring(0, length) + '\\u2026';\n\t\t}\n\t\t\n\t\treturn title;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/BasePhoneUIManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.UUID;\n\nimport org.tint.R;\nimport org.tint.controllers.Controller;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.fragments.PhoneWebViewFragment;\nimport org.tint.ui.views.PhoneUrlBar;\nimport org.tint.utils.Constants;\n\nimport android.app.Fragment;\nimport android.app.FragmentTransaction;\nimport android.content.SharedPreferences;\nimport android.view.ActionMode;\nimport android.webkit.WebView;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\n\npublic abstract class BasePhoneUIManager extends BaseUIManager {\n\n\tprotected enum AnimationType {\n\t\tNONE,\n\t\tFADE\n\t}\n\t\n\tprotected static AnimationType sAnimationType;\n\t\n\tprotected List<PhoneWebViewFragment> mFragmentsList;\n\tprotected Map<UUID, PhoneWebViewFragment> mFragmentsMap;\n\t\n\tprotected PhoneUrlBar mUrlBar;\n\t\n\tprotected ProgressBar mProgressBar;\n\t\n\tprotected RelativeLayout mTopBar;\n\t\n\tprotected ImageView mBack;\n\tprotected ImageView mForward;\n\t\n\tprotected int mCurrentTabIndex = -1;\n\tprotected Fragment mCurrentFragment = null;\n\t\n\tprotected ActionMode mActionMode;\n\t\n\tpublic BasePhoneUIManager(TintBrowserActivity activity) {\n\t\tsuper(activity);\n\t\t\n\t\tmFragmentsList = new ArrayList<PhoneWebViewFragment>();\n\t\tmFragmentsMap = new HashMap<UUID, PhoneWebViewFragment>();\n\t}\n\t\n\t@Override\n\tpublic void addTab(String url, boolean openInBackground, boolean privateBrowsing) {\n\t\tboolean startPage = false;\n\t\tif (Constants.URL_ABOUT_START.equals(url)) {\n\t\t\turl = null;\n\t\t\tstartPage = true;\n\t\t}\n\t\t\n\t\tPhoneWebViewFragment fragment = new PhoneWebViewFragment();\n\t\tfragment.init(this, privateBrowsing, url);\t\t\n\t\t\n\t\tmFragmentsList.add(mCurrentTabIndex + 1, fragment);\n\t\tmFragmentsMap.put(fragment.getUUID(), fragment);\t\t\n\t\t\n\t\tif (!openInBackground) {\n\t\t\tmCurrentTabIndex++;\n\t\t\t\n\t\t\tif (startPage) {\n\t\t\t\tfragment.setStartPageShown(true);\n\t\t\t\t\n\t\t\t\tif (mStartPageFragment == null) {\n\t\t\t\t\tcreateStartPageFragment();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsetCurrentFragment(mStartPageFragment, sAnimationType);\n\t\t\t\tonShowStartPage();\n\t\t\t} else {\n\t\t\t\tfragment.setStartPageShown(false);\n\t\t\t\tsetCurrentFragment(fragment, sAnimationType);\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tCustomWebView webView = getCurrentWebView();\n\n\t\t\tif (!webView.isPrivateBrowsingEnabled()) {\n\t\t\t\tController.getInstance().getAddonManager().onTabSwitched(mActivity, webView);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void closeCurrentTab() {\n\t\tif (mFragmentsList.size() > 1) {\n\t\t\tcloseTabByIndex(mCurrentTabIndex);\n\t\t} else {\n\t\t\tcloseLastTab();\t\t\t\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void closeTab(UUID tabId) {\n\t\tint index = mFragmentsList.indexOf(getWebViewFragmentByUUID(tabId));\n\t\t\n\t\tif (mFragmentsList.size() > 1) {\t\t\t\n\t\t\tif ((index >= 0) &&\n\t\t\t\t\t(index < mFragmentsList.size())) {\n\t\t\t\tcloseTabByIndex(index);\n\t\t\t}\n\t\t} else if (index == mCurrentTabIndex) {\n\t\t\tcloseLastTab();\n\t\t}\n\t}\n\t\n\tprotected void closeLastTab() {\n\t\tPhoneWebViewFragment fragment = mFragmentsList.get(mCurrentTabIndex);\n\t\t\n\t\tCustomWebView webView = fragment.getWebView();\n\t\t\n\t\tif (!webView.isPrivateBrowsingEnabled()) {\n\t\t\tController.getInstance().getAddonManager().onTabClosed(mActivity, webView);\n\t\t}\n\t\t\n\t\twebView.onPause();\n\t\t\n\t\tloadHomePage();\n\t\tupdateUrlBar();\n\t}\n\t\n\tprotected void closeTabByIndex(int index) {\n\t\tif ((index >= 0) &&\n\t\t\t\t(index < mFragmentsList.size())) {\n\t\t\tboolean currentTab = index == mCurrentTabIndex;\t\t\n\n\t\t\tPhoneWebViewFragment fragment = mFragmentsList.get(index);\n\n\t\t\tCustomWebView webView = fragment.getWebView();\n\n\t\t\tif (!webView.isPrivateBrowsingEnabled()) {\n\t\t\t\tController.getInstance().getAddonManager().onTabClosed(mActivity, webView);\n\t\t\t}\n\n\t\t\twebView.onPause();\n\n\t\t\tmFragmentsList.remove(index);\n\t\t\tmFragmentsMap.remove(fragment.getUUID());\n\n\t\t\tif (currentTab) {\n\t\t\t\tif (mCurrentTabIndex > 0) {\n\t\t\t\t\tmCurrentTabIndex--;\n\t\t\t\t}\n\n\t\t\t\tshowCurrentTab(true);\n\t\t\t} else {\n\t\t\t\tif (index < mCurrentTabIndex) {\n\t\t\t\t\tmCurrentTabIndex--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprotected void showCurrentTab(boolean notifyTabSwitched) {\n\t\tPhoneWebViewFragment newFragment = mFragmentsList.get(mCurrentTabIndex);\n\t\t\n\t\tif (newFragment.isStartPageShown()) {\n\t\t\tsetCurrentFragment(mStartPageFragment, sAnimationType);\n\t\t\tmUrlBar.hideGoStopReloadButton();\n\t\t} else {\n\t\t\tsetCurrentFragment(newFragment, sAnimationType);\n\t\t\tmUrlBar.showGoStopReloadButton();\n\t\t\tnewFragment.getWebView().onResume();\t\t\t\t\t\t\n\t\t}\n\t\t\n\t\tif (notifyTabSwitched) {\n\t\t\tCustomWebView webView = getCurrentWebView();\n\t\t\t\n\t\t\tif (!webView.isPrivateBrowsingEnabled()) {\n\t\t\t\tController.getInstance().getAddonManager().onTabSwitched(mActivity, webView);\n\t\t\t}\n\t\t}\n\t\t\n\t\tupdateUrlBar();\n\t}\n\t\n\t@Override\n\tpublic void onProgressChanged(WebView view, int newProgress) {\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmProgressBar.setProgress(newProgress);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onReceivedTitle(WebView view, String title) {\n\t\tif (view == getCurrentWebView()) {\n\t\t\tif ((title != null) &&\n\t\t\t\t\t(!title.isEmpty())) {\n\t\t\t\tmUrlBar.setTitle(title);\n\t\t\t\tmUrlBar.setSubtitle(view.getUrl());\n\t\t\t} else {\n\t\t\t\tmUrlBar.setTitle(R.string.ApplicationName);\n\t\t\t\tmUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onShowStartPage() {\n\t\tmUrlBar.setTitle(mActivity.getString(R.string.ApplicationName));\n\t\tmUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_go);\n\t\tmUrlBar.hideGoStopReloadButton();\n\t\t\t\t\t\n\t\tmUrlBar.setUrl(null);\n\t\tmBack.setEnabled(false);\n\t\tmForward.setEnabled(false);\n\t}\n\t\n\t@Override\n\tpublic void onHideStartPage() {\n\t\tmUrlBar.showGoStopReloadButton();\n\t}\n\n\t@Override\n\tpublic void loadUrl(String url) {\n\t\tmUrlBar.hideUrl();\n\t\tsuper.loadUrl(url);\n\t}\n\t\n\t@Override\n\tpublic CustomWebView getCurrentWebView() {\n\t\tif (mCurrentTabIndex != -1) {\n\t\t\treturn mFragmentsList.get(mCurrentTabIndex).getWebView();\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic BaseWebViewFragment getCurrentWebViewFragment() {\n\t\tif (mCurrentTabIndex != -1) {\n\t\t\treturn mFragmentsList.get(mCurrentTabIndex);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected BaseWebViewFragment getWebViewFragmentByUUID(UUID fragmentId) {\n\t\treturn mFragmentsMap.get(fragmentId);\n\t}\n\t\n\t@Override\n\tprotected String getCurrentUrl() {\n\t\treturn mUrlBar.getUrl();\n\t}\n\n\t@Override\n\tprotected int getTabCount() {\n\t\treturn mFragmentsList.size();\n\t}\n\t\n\t@Override\n\tprotected void showStartPage(BaseWebViewFragment webViewFragment) {\n\t\tif ((webViewFragment != null) &&\n\t\t\t\t(!webViewFragment.isStartPageShown())) {\n\t\t\n\t\t\twebViewFragment.getWebView().onPause();\n\t\t\twebViewFragment.setStartPageShown(true);\n\t\t\t\n\t\t\tif (webViewFragment == getCurrentWebViewFragment()) {\n\n\t\t\t\tif (mStartPageFragment == null) {\n\t\t\t\t\tcreateStartPageFragment();\n\t\t\t\t}\n\n\t\t\t\tsetCurrentFragment(mStartPageFragment, sAnimationType);\n\t\t\t\t\n\t\t\t\tonShowStartPage();\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tprotected void hideStartPage(BaseWebViewFragment webViewFragment) {\n\t\tif ((webViewFragment != null) &&\n\t\t\t\t(webViewFragment.isStartPageShown())) {\n\t\t\n\t\t\twebViewFragment.setStartPageShown(false);\n\t\t\t\n\t\t\tif (webViewFragment == getCurrentWebViewFragment()) {\n\t\t\t\tsetCurrentFragment(webViewFragment, sAnimationType);\n\n\t\t\t\tonHideStartPage();\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tprotected void resetUI() {\n\t\tupdateUrlBar();\n\t}\n\t\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\tfor (PhoneWebViewFragment fragment : mFragmentsList) {\n\t\t\tfragment.getWebView().loadSettings();\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected Collection<BaseWebViewFragment> getTabsFragments() {\t\t\n\t\treturn new ArrayList<BaseWebViewFragment>(mFragmentsList);\n\t}\n\t\n\tprotected void setCurrentFragment(Fragment fragment, AnimationType animationType) {\n\t\tif (fragment != mCurrentFragment) {\n\t\t\tmCurrentFragment = fragment;\n\t\t\t\n\t\t\tFragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();\t\t\t\n\t\t\t\n\t\t\tswitch (animationType) {\n\t\t\tcase NONE: break;\n\t\t\tcase FADE: fragmentTransaction.setCustomAnimations(R.animator.fade_in, R.animator.fade_out); break;\n\t\t\tdefault: break;\n\t\t\t}\n\t\t\t\n\t\t\tfragmentTransaction.replace(R.id.WebViewContainer, mCurrentFragment);\t\t\t\t\n\t\t\tfragmentTransaction.commit();\n\t\t}\n\t}\n\t\n\tprotected void updateBackForwardEnabled() {\n\t\tCustomWebView currentWebView = getCurrentWebView();\n\t\t\n\t\tmBack.setEnabled(currentWebView.canGoBack());\n\t\tmForward.setEnabled(currentWebView.canGoForward());\n\t}\n\t\n\tprotected abstract void createStartPageFragment();\n\t\n\tprotected abstract void updateUrlBar();\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/BaseUIManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.UUID;\n\nimport org.tint.R;\nimport org.tint.controllers.Controller;\nimport org.tint.model.DownloadItem;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.tasks.ThumbnailSaver;\nimport org.tint.ui.activities.BookmarksActivity;\nimport org.tint.ui.activities.EditBookmarkActivity;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.dialogs.GeolocationPermissionsDialog;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.fragments.StartPageFragment;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\nimport android.annotation.SuppressLint;\nimport android.app.ActionBar;\nimport android.app.DownloadManager;\nimport android.app.FragmentManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences.Editor;\nimport android.graphics.Bitmap;\nimport android.graphics.Picture;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.net.Uri;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.preference.PreferenceManager;\nimport android.text.TextUtils;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.GeolocationPermissions.Callback;\nimport android.webkit.ValueCallback;\nimport android.webkit.WebChromeClient;\nimport android.webkit.WebView;\nimport android.webkit.WebViewDatabase;\nimport android.webkit.WebChromeClient.CustomViewCallback;\nimport android.webkit.WebView.HitTestResult;\nimport android.widget.FrameLayout;\nimport android.widget.Toast;\n\n@SuppressLint(\"HandlerLeak\")\npublic abstract class BaseUIManager implements UIManager {//, WebViewFragmentListener {\n\t\n\tprotected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =\n\t        new FrameLayout.LayoutParams(\n\t        ViewGroup.LayoutParams.MATCH_PARENT,\n\t        ViewGroup.LayoutParams.MATCH_PARENT);\n\t\n\tprivate static final int FOCUS_NODE_HREF = 102;\n\t\n\tprivate FrameLayout mFullscreenContainer;\n    private View mCustomView;\n    private WebChromeClient.CustomViewCallback mCustomViewCallback;\n    private int mOriginalOrientation;\n    \n    private GeolocationPermissionsDialog mGeolocationPermissionsDialog;\n\t\n\tprotected TintBrowserActivity mActivity;\t\n\tprotected ActionBar mActionBar;\n\tprotected FragmentManager mFragmentManager;\n\t\n\tprotected boolean mHomePageLoading = false;\n\t\n\tprotected boolean mMenuVisible = false;\n\t\n\tprivate ValueCallback<Uri> mUploadMessage = null;\n\t\n\tprotected StartPageFragment mStartPageFragment = null;\n\t\n\tprivate Handler mHandler;\n\t\n\tpublic BaseUIManager(TintBrowserActivity activity) {\n\t\tmActivity = activity;\n\t\t\n\t\tmActionBar = mActivity.getActionBar();\n\t\tmFragmentManager = mActivity.getFragmentManager();\n\t\t\n\t\tmGeolocationPermissionsDialog = null;\n\t\t\n\t\tsetupUI();\n\t\t\n\t\tstartHandler();\n\t}\t\n\t\n\tprotected abstract String getCurrentUrl();\n\t\n\tprotected abstract int getTabCount();\n\t\n\tprotected abstract BaseWebViewFragment getWebViewFragmentByUUID(UUID fragmentId);\n\t\n\tprotected abstract void showStartPage(BaseWebViewFragment webViewFragment);\n\t\n\tprotected abstract void hideStartPage(BaseWebViewFragment webViewFragment);\n\t\n\tprotected abstract void resetUI();\n\t\n\tprotected void setApplicationButtonImage(Bitmap icon) {\n\t\tBitmapDrawable image = ApplicationUtils.getApplicationButtonImage(mActivity, icon);\n\t\t\n\t\tif (image != null) {\t\t\t\n\t\t\tmActionBar.setIcon(image);\n\t\t} else {\n\t\t\tmActionBar.setIcon(R.drawable.ic_launcher);\n\t\t}\n\t}\n\t\n\tprotected void setupUI() {\n\t\tsetFullScreenFromPreferences();\n\t}\n\t\n\t@Override\n\tpublic TintBrowserActivity getMainActivity() {\n\t\treturn mActivity;\n\t}\n\t\n\t@Override\n\tpublic void addTab(boolean loadHomePage, boolean privateBrowsing) {\n\t\tif (loadHomePage) {\n\t\t\taddTab(\n\t\t\t\t\tPreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START),\n\t\t\t\t\tfalse,\n\t\t\t\t\tprivateBrowsing);\n\t\t} else {\n\t\t\taddTab(null, false, privateBrowsing);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void togglePrivateBrowsing() {\n\t\tBaseWebViewFragment fragment = getCurrentWebViewFragment();\n\t\tif (fragment != null) {\n\t\t\tCustomWebView webView = fragment.getWebView();\n\t\t\tString currentUrl = webView.getUrl();\n\t\t\t\n\t\t\tfragment.setPrivateBrowsing(!fragment.isPrivateBrowsingEnabled());\t\t\t\n\t\t\tfragment.resetWebView();\n\t\t\t\n\t\t\tresetUI();\n\t\t\tloadUrl(currentUrl);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void loadUrl(String url) {\n\t\tloadUrl(getCurrentWebViewFragment(), url);\n\t}\n\t\n\t@Override\n\tpublic void loadUrl(UUID tabId, String url, boolean loadInCurrentTabIfNotFound) {\n\t\tBaseWebViewFragment fragment = getWebViewFragmentByUUID(tabId);\n\t\tif (fragment != null) {\n\t\t\tloadUrl(fragment, url);\n\t\t} else {\n\t\t\tif (loadInCurrentTabIfNotFound) {\n\t\t\t\tloadUrl(url);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic void loadRawUrl(UUID tabId, String url,\tboolean loadInCurrentTabIfNotFound) {\n\t\tBaseWebViewFragment fragment = getWebViewFragmentByUUID(tabId);\n\t\tif (fragment != null) {\n\t\t\tfragment.getWebView().loadRawUrl(url);\n\t\t} else {\n\t\t\tif (loadInCurrentTabIfNotFound) {\n\t\t\t\tgetCurrentWebView().loadRawUrl(url);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic void loadHomePage() {\n\t\tmHomePageLoading = true;\n\t\tloadUrl(PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START));\n\t}\n\t\n\t@Override\n\tpublic void loadHomePage(UUID tabId, boolean loadInCurrentTabIfNotFound) {\n\t\tmHomePageLoading = true;\n\t\tloadUrl(\n\t\t\t\ttabId,\n\t\t\t\tPreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START),\n\t\t\t\tloadInCurrentTabIfNotFound);\n\t}\n\n\t@Override\n\tpublic void loadCurrentUrl() {\n\t\tloadUrl(getCurrentUrl());\n\t}\n\t\n\t@Override\n\tpublic void openBookmarksActivityForResult() {\n\t\tIntent i = new Intent(mActivity, BookmarksActivity.class);\n    \tmActivity.startActivityForResult(i, TintBrowserActivity.ACTIVITY_BOOKMARKS);\n\t}\n\t\n\t@Override\n\tpublic void addBookmarkFromCurrentPage() {\n\t\tIntent i = new Intent(mActivity, EditBookmarkActivity.class);\n\t\t\n\t\ti.putExtra(Constants.EXTRA_ID, (long) -1);\n    \ti.putExtra(Constants.EXTRA_LABEL, getCurrentWebView().getTitle());\n    \ti.putExtra(Constants.EXTRA_URL, getCurrentWebView().getUrl());\n    \t\n    \tmActivity.startActivity(i);\n\t}\n\t\n\t@Override\n\tpublic void shareCurrentPage() {\n\t\tWebView webView = getCurrentWebView();\n\t\t\n\t\tif (webView != null) {\n\t\t\tApplicationUtils.sharePage(mActivity, webView.getTitle(), webView.getUrl());\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void startSearch() {\n\t\tWebView webView = getCurrentWebView();\n\t\t\n\t\tif (webView != null) {\n\t\t\twebView.showFindDialog(null, true);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void clearFormData() {\n\t\tWebViewDatabase.getInstance(mActivity).clearFormData();\n\t\tgetCurrentWebView().clearFormData();\n\t}\n\t\n\t@Override\n\tpublic void clearCache() {\n\t\tgetCurrentWebView().clearCache(true);\n\t}\n\t\n\t@Override\n\tpublic void setHttpAuthUsernamePassword(String host, String realm, String username, String password) {\n\t\tgetCurrentWebView().setHttpAuthUsernamePassword(host, realm, username, password);\n\t}\n\t\n\t@Override\n\tpublic CustomWebView getWebViewByTabId(UUID tabId) {\n\t\tBaseWebViewFragment fragment = getWebViewFragmentByUUID(tabId);\n\t\tif (fragment != null) {\n\t\t\treturn fragment.getWebView();\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void setUploadMessage(ValueCallback<Uri> uploadMsg) {\n\t\tmUploadMessage = uploadMsg;\n\t}\n\t\n\t@Override\n\tpublic ValueCallback<Uri> getUploadMessage() {\n\t\treturn mUploadMessage;\n\t}\n\t\n\t@Override\n\tpublic void onNewIntent(Intent intent) {\n\t\tif (intent != null) {\n\t\t\tif (Intent.ACTION_VIEW.equals(intent.getAction()) ||\n\t\t\t\t\tIntent.ACTION_MAIN.equals(intent.getAction())) {\n\t\t\t\t// ACTION_VIEW and ACTION_MAIN can specify an url to load.\n\t\t\t\tString url = intent.getDataString();\n\t\t\t\t\n\t\t\t\tif (!TextUtils.isEmpty(url)) {\n\t\t\t\t\tif (!isCurrentTabReusable()) {\n\t\t\t\t\t\taddTab(url,\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\tPreferenceManager.getDefaultSharedPreferences(this.getMainActivity()).\n\t\t\t\t\t\t\t\t\tgetBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tloadUrl(url);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// We do not have an url. Open a new tab if there is no tab currently opened,\n\t\t\t\t\t// else do nothing.\n\t\t\t\t\tif (getTabCount() <= 0) {\n\t\t\t\t\t\taddTab(true, PreferenceManager.getDefaultSharedPreferences(this.getMainActivity()).\n\t\t\t\t\t\t\t\tgetBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (Constants.ACTION_BROWSER_CONTEXT_MENU.equals(intent.getAction())) {\n\t\t\t\tif (intent.hasExtra(Constants.EXTRA_ACTION_ID)) {\n\t\t\t\t\tint actionId = intent.getIntExtra(Constants.EXTRA_ACTION_ID, -1);\n\t\t\t\t\t\n\t\t\t\t\tswitch(actionId) {\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_OPEN:\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(TintBrowserActivity.CONTEXT_MENU_OPEN);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tloadUrl(intent.getStringExtra(Constants.EXTRA_URL));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB:\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB, intent.getBooleanExtra(Constants.EXTRA_INCOGNITO, false));\n\t\t\t\t\t\t} else {\t\t\t\t\t\t\n\t\t\t\t\t\t\taddTab(intent.getStringExtra(Constants.EXTRA_URL), false, intent.getBooleanExtra(Constants.EXTRA_INCOGNITO, false));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_OPEN_IN_BACKGROUND:\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(TintBrowserActivity.CONTEXT_MENU_OPEN_IN_BACKGROUND, intent.getBooleanExtra(Constants.EXTRA_INCOGNITO, false));\n\t\t\t\t\t\t} else {\t\t\t\t\t\t\n\t\t\t\t\t\t\taddTab(intent.getStringExtra(Constants.EXTRA_URL), true, intent.getBooleanExtra(Constants.EXTRA_INCOGNITO, false));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_COPY:\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(TintBrowserActivity.CONTEXT_MENU_COPY);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tApplicationUtils.copyTextToClipboard(mActivity, intent.getStringExtra(Constants.EXTRA_URL), mActivity.getResources().getString(R.string.UrlCopyToastMessage));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_DOWNLOAD:\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(TintBrowserActivity.CONTEXT_MENU_DOWNLOAD);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDownloadItem item = new DownloadItem(intent.getStringExtra(Constants.EXTRA_URL));\n\n\t\t\t\t\t\t\tlong id = ((DownloadManager) mActivity.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(item);\n\t\t\t\t\t\t\titem.setId(id);\n\n\t\t\t\t\t\t\tController.getInstance().getDownloadsList().add(item);\n\n\t\t\t\t\t\t\tToast.makeText(mActivity, String.format(mActivity.getString(R.string.DownloadStart), item.getFileName()), Toast.LENGTH_SHORT).show();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_SHARE:\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(TintBrowserActivity.CONTEXT_MENU_SHARE);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tApplicationUtils.sharePage(mActivity, null, intent.getStringExtra(Constants.EXTRA_URL));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (HitTestResult.SRC_IMAGE_ANCHOR_TYPE == intent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1)) {\n\t\t\t\t\t\t\trequestHrefNode(actionId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tController.getInstance().getAddonManager().onContributedContextLinkMenuItemSelected(\n\t\t\t\t\t\t\t\t\tmActivity,\n\t\t\t\t\t\t\t\t\tactionId,\n\t\t\t\t\t\t\t\t\tintent.getIntExtra(Constants.EXTRA_HIT_TEST_RESULT, -1),\n\t\t\t\t\t\t\t\t\tintent.getStringExtra(Constants.EXTRA_URL),\n\t\t\t\t\t\t\t\t\tgetCurrentWebView());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\taddTab(true, false);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic boolean onKeyBack() {\n\t\tif (mCustomView != null) {\n\t\t\tonHideCustomView();\n\t\t\treturn true;\n\t\t}\t\t\n\t\t\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic void onPageFinished(final WebView view, final String url) {\n\t\t\n\t\tif (mHomePageLoading) {\n\t\t\tmHomePageLoading = false;\n\t\t\t\n\t\t\tif (PreferenceManager.getDefaultSharedPreferences(mActivity).getBoolean(Constants.TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED, false)) {\n\t\t\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(mActivity).edit();\n\t\t\t\teditor.putBoolean(Constants.TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED, false);\n\t\t\t\teditor.putString(Constants.PREFERENCE_HOME_PAGE, url);\n\t\t\t\teditor.commit();\n\t\t\t}\n\t\t}\n\t\t\n\t\tview.postDelayed(new Runnable() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tif (BookmarksWrapper.urlHasBookmark(mActivity.getContentResolver(), url, view.getOriginalUrl())) {\n\t\t\t\t\tPicture p = view.capturePicture();\n\t\t\t\t\t\n\t\t\t\t\tnew ThumbnailSaver(mActivity.getContentResolver(),\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\tview.getOriginalUrl(),\n\t\t\t\t\t\t\tp,\n\t\t\t\t\t\t\tApplicationUtils.getBookmarksThumbnailsDimensions(mActivity)).execute();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}, 2000);\n\t}\n\t\n\t@Override\n\tpublic void onClientPageFinished(CustomWebView view, String url) { }\n\n\t@Override\n\tpublic void onReceivedIcon(WebView view, Bitmap icon) {\n\t\tif (view == getCurrentWebView()) {\n\t\t\tsetApplicationButtonImage(icon);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onMainActivityPause() {\n\t\tCustomWebView webView = getCurrentWebView();\n\t\tif (webView != null) {\n\t\t\twebView.pauseTimers();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onMainActivityResume() {\n\t\tCustomWebView webView = getCurrentWebView();\n\t\tif (webView != null) {\n\t\t\twebView.resumeTimers();\n\t\t}\n\t}\t\n\t\n\t@Override\n\tpublic void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {\n\t\tif (mCustomView != null) {\n            callback.onCustomViewHidden();\n            return;\n        }\n\t\t\n\t\tif (requestedOrientation == -1) {\n\t\t\trequestedOrientation = mActivity.getRequestedOrientation();\n\t\t}\n\t\t\n\t\tmOriginalOrientation = mActivity.getRequestedOrientation();\n        FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();\n        mFullscreenContainer = new FullscreenHolder(mActivity);\n        mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS);\n        decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);\n        mCustomView = view;\n\n        mCustomViewCallback = callback;\n        mActivity.setRequestedOrientation(requestedOrientation);\n\t}\n\t\n\t@Override\n\tpublic void onHideCustomView() {\n\t\tif (mCustomView == null)\n            return;\n\t\t\n        FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();\n        decor.removeView(mFullscreenContainer);\n        mFullscreenContainer = null;\n        mCustomView = null;\n        mCustomViewCallback.onCustomViewHidden();\n        // Show the content view.\n        mActivity.setRequestedOrientation(mOriginalOrientation);\n\t}\n\t\n\t@Override\n\tpublic void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {\n\t\tif (mGeolocationPermissionsDialog == null) {\n\t\t\tmGeolocationPermissionsDialog = new GeolocationPermissionsDialog(mActivity);\n\t\t}\n\t\t\n\t\tmGeolocationPermissionsDialog.initialize(origin, callback);\t\t\n\t\tmGeolocationPermissionsDialog.show();\n\t\t\n\t}\n\n\t@Override\n\tpublic void onGeolocationPermissionsHidePrompt() {\n\t\tif (mGeolocationPermissionsDialog != null) {\n\t\t\tmGeolocationPermissionsDialog.hide();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void loadUrl(BaseWebViewFragment webViewFragment, String url) {\n\t\tCustomWebView webView = webViewFragment.getWebView();\n\n\t\tif (Constants.URL_ABOUT_START.equals(url)) {\n\t\t\tshowStartPage(webViewFragment);\n\n\t\t\t// Check if there is no pb with this.\n\t\t\t// This recreate a new WebView, because i cannot found a way\n\t\t\t// to reset completely (history and display) a WebView.\n\t\t\twebViewFragment.resetWebView();\n\t\t} else {\n\t\t\thideStartPage(webViewFragment);\t\t\t\t\n\t\t\twebView.loadUrl(url);\n\t\t}\n\n\t\twebView.requestFocus();\n\t}\n\t\n\t@Override\n\tpublic boolean isFullScreen() {\t\t\n\t\treturn PreferenceManager.getDefaultSharedPreferences(mActivity).getBoolean(Constants.PREFERENCE_FULL_SCREEN, false);\n\t}\n\n\t@Override\n\tpublic void toggleFullScreen() {\n\t\tboolean newValue = !isFullScreen();\n\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(mActivity).edit();\n\t\teditor.putBoolean(Constants.PREFERENCE_FULL_SCREEN, newValue);\n\t\teditor.commit();\n\t\t\n\t\tsetFullScreenFromPreferences();\n\t}\n\t\n\t\n\t\n\t@Override\n\tpublic void saveTabs() {\n\t\tString userStartPage = PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START);\n\t\t\n\t\tSet<String> tabs = new HashSet<String>();\t\t\n\t\t\n\t\tfor (BaseWebViewFragment f : getTabsFragments()) {\n\t\t\tif (!f.isStartPageShown() &&\n\t\t\t\t\t!f.isWebViewOnUrl(userStartPage) &&\n\t\t\t\t\t!f.isPrivateBrowsingEnabled()) {\n\t\t\t\ttabs.add(f.getWebView().getUrl());\n\t\t\t}\n\t\t}\n\t\t\n\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(mActivity).edit();\n\t\teditor.putStringSet(Constants.TECHNICAL_PREFERENCE_SAVED_TABS, tabs);\n\t\teditor.commit();\n\t}\n\t\n\tprotected abstract Collection<BaseWebViewFragment> getTabsFragments();\n\n\tprotected abstract void setFullScreenFromPreferences();\n\n\tprotected boolean isStartPageShownOnCurrentTab() {\n\t\tBaseWebViewFragment currentWebViewFragment = getCurrentWebViewFragment();\n\t\treturn currentWebViewFragment != null && currentWebViewFragment.isStartPageShown();\n\t}\n\t\n\tprotected boolean isHomePageStartPage() {\n\t\treturn Constants.URL_ABOUT_START.equals(PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START));\n\t}\n\t\n\tprivate void startHandler() {\n\t\tmHandler = new Handler() {\n\n\t\t\t@Override\n\t\t\tpublic void handleMessage(Message msg) {\n\t\t\t\tswitch (msg.what) {\n\t\t\t\tcase FOCUS_NODE_HREF:\n\t\t\t\t\tString url = (String) msg.getData().get(\"url\");\n                    String src = (String) msg.getData().get(\"src\");\n                    \n                    if (url == \"\") {\n                    \turl = src;\n                    }\n                    \n                    if (TextUtils.isEmpty(url)) {\n                        break;\n                    }\n                    \n                    switch (msg.arg1) {\n                    case TintBrowserActivity.CONTEXT_MENU_OPEN:\n                    \tloadUrl(url);\n                    \tbreak;\n                    \n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_OPEN_IN_NEW_TAB:\n\t\t\t\t\t\taddTab(url, false, msg.arg2 > 0 ? true : false);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_OPEN_IN_BACKGROUND:\n\t\t\t\t\t\taddTab(url, true, msg.arg2 > 0 ? true : false);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_COPY:\n\t\t\t\t\t\tApplicationUtils.copyTextToClipboard(mActivity, url, mActivity.getResources().getString(R.string.UrlCopyToastMessage));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_DOWNLOAD:\n\t\t\t\t\t\tDownloadItem item = new DownloadItem(url);\n\n\t\t\t\t\t\tlong id = ((DownloadManager) mActivity.getSystemService(Context.DOWNLOAD_SERVICE)).enqueue(item);\n\t\t\t\t\t\titem.setId(id);\n\n\t\t\t\t\t\tController.getInstance().getDownloadsList().add(item);\n\n\t\t\t\t\t\tToast.makeText(mActivity, String.format(mActivity.getString(R.string.DownloadStart), item.getFileName()), Toast.LENGTH_SHORT).show();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase TintBrowserActivity.CONTEXT_MENU_SHARE:\n\t\t\t\t\t\tApplicationUtils.sharePage(mActivity, null, url);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tController.getInstance().getAddonManager().onContributedContextLinkMenuItemSelected(\n\t\t\t\t\t\t\t\tmActivity,\n\t\t\t\t\t\t\t\tmsg.arg1,\n\t\t\t\t\t\t\t\tHitTestResult.SRC_IMAGE_ANCHOR_TYPE,\n\t\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t\tgetCurrentWebView());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n                    \t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: super.handleMessage(msg);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t};\n\t}\n\t\n\tprivate void requestHrefNode(int action) {\n\t\trequestHrefNode(action, false);\n\t}\n\t\n\tprivate void requestHrefNode(int action, boolean incognito) {\n\t\tWebView webView = getCurrentWebView();\n\t\t\n\t\tif (webView != null) {\n\t\t\tfinal HashMap<String, WebView> hrefMap = new HashMap<String, WebView>();\t\t\n\t\t\threfMap.put(\"webview\", webView);\n\n\t\t\tfinal Message msg = mHandler.obtainMessage(\n\t\t\t\t\tFOCUS_NODE_HREF,\n\t\t\t\t\taction,\n\t\t\t\t\tincognito ? 1 : 0,\n\t\t\t\t\t\t\threfMap);\n\n\t\t\twebView.requestFocusNodeHref(msg);\n\t\t}\n\t}\n\t\n\t/**\n\t * Check if the current tab can be reused to display an intent request.\n\t * A tab is reusable if it is on the user-defined start page.\n\t * @return True if the current tab can be reused.\n\t */\n\tprivate boolean isCurrentTabReusable() {\n\t\tString homePageUrl = PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START);\n\t\tBaseWebViewFragment currentWebViewFragment = getCurrentWebViewFragment();\n\t\tCustomWebView currentWebView = getCurrentWebView();\n\t\t\n\t\treturn (currentWebViewFragment != null && currentWebViewFragment.isStartPageShown()) ||\n\t\t\t\t(currentWebView != null && homePageUrl != null && homePageUrl.equals(currentWebView.getUrl()));\n\t}\n\t\n\tstatic class FullscreenHolder extends FrameLayout {\n\n        public FullscreenHolder(Context ctx) {\n            super(ctx);\n            setBackgroundColor(ctx.getResources().getColor(android.R.color.black));\n        }\n\n        @Override\n        public boolean onTouchEvent(MotionEvent evt) {\n            return true;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/LegacyPhoneUIManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport org.tint.R;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.fragments.LegacyPhoneStartPageFragment;\nimport org.tint.ui.fragments.PhoneWebViewFragment;\nimport org.tint.ui.fragments.StartPageFragment.OnStartPageItemClickedListener;\nimport org.tint.ui.runnables.HideToolbarsRunnable;\nimport org.tint.ui.views.PhoneUrlBar;\nimport org.tint.ui.views.PhoneUrlBar.OnPhoneUrlBarEventListener;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.preference.PreferenceManager;\nimport android.view.ActionMode;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.view.View.OnClickListener;\nimport android.view.inputmethod.InputMethodManager;\nimport android.webkit.WebView;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\n\npublic class LegacyPhoneUIManager extends BasePhoneUIManager {\n\t\n\tprivate enum SwitchTabsMethod {\n\t\tBUTTONS,\n\t\tFLING,\n\t\tBOTH\n\t}\n\t\n\tprivate static final int FLIP_PIXEL_THRESHOLD = 200;\n\tprivate static final int FLIP_TIME_THRESHOLD = 400;\t\n\t\n\tprivate ImageView mBubbleLeft;\n\tprivate ImageView mBubbleRight;\n\t\n\tprivate ImageView mFaviconView;\n\t\n\tprivate ImageView mBookmarks;\n\t\n\tprivate ImageView mAddTab;\n\tprivate ImageView mCloseTab;\n\t\n\tprivate ImageView mShowPreviousTab;\n\tprivate ImageView mShowNextTab;\n\t\n\tprivate LinearLayout mBottomBar;\t\n\t\n\tprivate BitmapDrawable mDefaultFavicon;\n\t\n\tprivate int mToolbarsDisplayDuration;\n\t\n\tprivate ToolbarsAnimator mToolbarsAnimator;\n\t\n\tprivate GestureDetector mGestureDetector;\n\t\n\tprivate HideToolbarsRunnable mHideToolbarsRunnable = null;\n\t\n\tprivate SwitchTabsMethod mSwitchTabsMethod = SwitchTabsMethod.BOTH;\n\n\tstatic {\n\t\tsAnimationType = AnimationType.FADE;\n\t}\n\t\n\tpublic LegacyPhoneUIManager(TintBrowserActivity activity) {\n\t\tsuper(activity);\n\t\t\n\t\tupdateSwitchTabsMethod();\n\t}\n\t\n\t@Override\n\tprotected void setupUI() {\t\n\t\tsuper.setupUI();\n\t\t\n\t\tmActionBar.hide();\n\t\t\n\t\tmGestureDetector = new GestureDetector(mActivity, new GestureListener());\n\t\t\n\t\tupdateToolbarsDisplayDuration();\t\t\n\t\t\n\t\tint buttonSize = mActivity.getResources().getInteger(R.integer.application_button_size);\n\t\tDrawable d = mActivity.getResources().getDrawable(R.drawable.ic_launcher);\n\t\t\n\t\tBitmap bm = Bitmap.createBitmap(buttonSize, buttonSize, Bitmap.Config.ARGB_8888);\n\t\tCanvas canvas = new Canvas(bm);\n\t\td.setBounds(0, 0, buttonSize, buttonSize);\n\t\td.draw(canvas);\n\t\t\n\t\tmDefaultFavicon = new BitmapDrawable(mActivity.getResources(), bm);\n\t\t\n\t\tmProgressBar = (ProgressBar) mActivity.findViewById(R.id.WebViewProgress);\n\t\t\n\t\tmUrlBar = (PhoneUrlBar) mActivity.findViewById(R.id.UrlBar);\n\t\t\n\t\tmUrlBar.setEventListener(new OnPhoneUrlBarEventListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onVisibilityChanged(boolean urlBarVisible) {\n\t\t\t\tif (urlBarVisible) {\n\t\t\t\t\tmUrlBar.showGoStopReloadButton();\n\t\t\t\t} else {\n\t\t\t\t\tBaseWebViewFragment currentFragment = getCurrentWebViewFragment();\n\t\t\t\t\t\n\t\t\t\t\tif ((currentFragment != null) &&\n\t\t\t\t\t\t\t(currentFragment.isStartPageShown())){\n\t\t\t\t\t\tmUrlBar.hideGoStopReloadButton();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onUrlValidated() {\n\t\t\t\tloadCurrentUrl();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onGoStopReloadClicked() {\n\t\t\t\tif (mUrlBar.isUrlChangedByUser()) {\n\t\t\t\t\t// Use the UIManager to load urls, as it perform check on them.\n\t\t\t\t\tloadCurrentUrl();\n\t\t\t\t} else if (getCurrentWebView().isLoading()) {\n\t\t\t\t\tgetCurrentWebView().stopLoading();\n\t\t\t\t} else {\n\t\t\t\t\tgetCurrentWebView().reload();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void onMenuVisibilityChanged(boolean isVisible) {\n\t\t\t\tmMenuVisible = isVisible;\t\n\t\t\t\t\n\t\t\t\tif (!mMenuVisible) {\n\t\t\t\t\tstartHideToolbarsThread();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        \n        mUrlBar.setTitle(R.string.ApplicationName);\n        mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\t\n        mFaviconView = (ImageView) mActivity.findViewById(R.id.FaviconView);\n        mFaviconView.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mUrlBar.isUrlBarVisible()) {\n\t\t\t\t\tmUrlBar.hideUrl();\n\t\t\t\t\tstartHideToolbarsThread();\n\t\t\t\t} else {\n\t\t\t\t\tloadHomePage();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        \n        mFaviconView.setImageDrawable(mDefaultFavicon);\n        \n\t\tmTopBar = (RelativeLayout) mActivity.findViewById(R.id.TopBar);\n\t\tmTopBar.setOnClickListener(new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t// Steal event from WebView.\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t\n\t\tmBottomBar = (LinearLayout) mActivity.findViewById(R.id.BottomBar);\n        mBottomBar.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t// Steal event from WebView.\t\t\t\t\n\t\t\t}\n\t\t});\n        \n        mBack = (ImageView) mActivity.findViewById(R.id.BtnBack);\n        mBack.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t    (getCurrentWebView().canGoBack())) {\n\t\t\t\t\tgetCurrentWebView().goBack();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        mBack.setEnabled(false);\n        \n        mForward = (ImageView) mActivity.findViewById(R.id.BtnForward);\n        mForward.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t    (getCurrentWebView().canGoForward())) {\n\t\t\t\t\tgetCurrentWebView().goForward();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        mForward.setEnabled(false);\n        \n        mBookmarks = (ImageView) mActivity.findViewById(R.id.BtnBookmarks);\n        mBookmarks.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\topenBookmarksActivityForResult();\n\t\t\t}\n\t\t});\n        \n        mAddTab = (ImageView) mActivity.findViewById(R.id.BtnAddTab);\n        mAddTab.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View view) {\n\t\t\t\taddTab(true, PreferenceManager.getDefaultSharedPreferences(view.getContext()).\n\t\t\t\t\t\tgetBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));\n\t\t\t}\n\t\t});\n        \n        mCloseTab = (ImageView) mActivity.findViewById(R.id.BtnCloseTab);\n        mCloseTab.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\tcloseCurrentTab();\n\t\t\t}\n\t\t});\n        \n        mShowPreviousTab = (ImageView) mActivity.findViewById(R.id.PreviousTabView);\n        mShowPreviousTab.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\t\t\t\t\n\t\t\t\tshowPreviousTab();\n\t\t\t}\n\t\t});\n        \n        mShowNextTab = (ImageView) mActivity.findViewById(R.id.NextTabView);\n        mShowNextTab.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tshowNextTab();\t\t\t\t\n\t\t\t}\n\t\t});\n        \n        mBubbleLeft = (ImageView) mActivity.findViewById(R.id.BubbleLeftView);\n        mBubbleLeft.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tsetToolbarsVisibility(true);\n\t\t\t\tstartHideToolbarsThread();\n\t\t\t}\n\t\t});\n        \n        mBubbleRight = (ImageView) mActivity.findViewById(R.id.BubbleRightView);\n        mBubbleRight.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tsetToolbarsVisibility(true);\n\t\t\t\tstartHideToolbarsThread();\n\t\t\t}\n\t\t});\n        \n        updateBubblesVisibility();\n        \n        mToolbarsAnimator = new ToolbarsAnimator(mTopBar, mBottomBar, mShowPreviousTab, mShowNextTab);\t\t\n        \n        startHideToolbarsThread();\n\t}\n\n\t@Override\n\tpublic void addTab(String url, boolean openInBackground, boolean privateBrowsing) {\n\t\tsuper.addTab(url, openInBackground, privateBrowsing);\n\t\t\n\t\tupdateShowPreviousNextTabButtons();\n\t\tupdateUrlBar();\n\t}\n\n\t@Override\n\tprotected void showCurrentTab(boolean notifyTabSwitched) {\n\t\tsuper.showCurrentTab(notifyTabSwitched);\t\t\n\n\t\tupdateShowPreviousNextTabButtons();\n\t}\n\t\n\t@Override\n\tpublic void onPageStarted(WebView view, String url, Bitmap favicon) {\n\t\tif (view == getCurrentWebView()) {\t\t\t\n\t\t\tsetToolbarsVisibility(true);\n\t\t\tmProgressBar.setVisibility(View.VISIBLE);\n\t\t\tmFaviconView.setVisibility(View.INVISIBLE);\n\t\t\t\n\t\t\tmUrlBar.setUrl(url);\n\t\t\t\n\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_stop);\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onPageFinished(WebView view, String url) {\n\t\tsuper.onPageFinished(view, url);\n\t\t\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmFaviconView.setVisibility(View.VISIBLE);\n\t\t\tmProgressBar.setVisibility(View.INVISIBLE);\t\t\t\n\t\t\t\t\t\t\n\t\t\tmUrlBar.setUrl(url);\n\t\t\t\n\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t\tstartHideToolbarsThread();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic boolean onKeyBack() {\n\t\tif (!super.onKeyBack()) {\n\t\t\tif (mUrlBar.isUrlBarVisible()) {\n\t\t\t\tmUrlBar.hideUrl();\n\t\t\t\tstartHideToolbarsThread();\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tCustomWebView currentWebView = getCurrentWebView();\n\t\t\t\t\n\t\t\t\tif ((currentWebView != null) &&\n\t\t\t\t\t\t(currentWebView.canGoBack())) {\n\t\t\t\t\tcurrentWebView.goBack();\n\t\t\t\t\treturn true;\n\t\t\t\t} else if (isHomePageStartPage() &&\n\t\t\t\t\t\t!isStartPageShownOnCurrentTab()) {\n\t\t\t\t\tloadHomePage();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic boolean onKeySearch() {\n\t\tsetToolbarsVisibility(true);\n\t\tstartHideToolbarsThread();\n\t\t\n\t\tif (!mUrlBar.isUrlBarVisible()) {\n\t\t\tmUrlBar.showUrl();\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic void onMenuVisibilityChanged(boolean isVisible) {\n\t\tmMenuVisible = isVisible;\t\n\t\t\n\t\tif (!mMenuVisible) {\n\t\t\tstartHideToolbarsThread();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onShowStartPage() {\n\t\tsuper.onShowStartPage();\n\t\t\n\t\tmFaviconView.setImageDrawable(mDefaultFavicon);\n\t}\n\t\n\t@Override\n\tpublic void onActionModeStarted(ActionMode mode) {\n\t\tmActionMode = mode;\n\t\t\n\t\tif (mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\tmTopBar.animate().translationY(mTopBar.getHeight());\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onActionModeFinished(ActionMode mode) {\n\t\tif (mActionMode != null) {\n\t\t\tmActionMode = null;\n\t\t\t\n\t\t\tif (mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\t\tmTopBar.animate().translationY(0);\n\t\t\t}\n\t\t\t\n\t\t\tInputMethodManager mgr = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\t\tmgr.hideSoftInputFromWindow(null, 0);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onActivityResult(int requestCode, int resultCode, Intent intent) { }\n\t\n\t@Override\n\tpublic boolean onTouch(View view, MotionEvent event) {\n\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t(event.getActionMasked() == MotionEvent.ACTION_DOWN)) {\n\t\t\tsetToolbarsVisibility(false);\n\t\t}\n\t\t\n\t\treturn mGestureDetector.onTouchEvent(event);\n\t}\n\t\n\t@Override\n\tprotected void setFullScreenFromPreferences() {\n\t\tWindow win = mActivity.getWindow();\n        WindowManager.LayoutParams winParams = win.getAttributes();\n\t\tfinal int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;\n\t\t\n\t\tif (PreferenceManager.getDefaultSharedPreferences(mActivity).getBoolean(Constants.PREFERENCE_FULL_SCREEN, false)) {\n\t\t\twinParams.flags |=  bits;\n\t\t} else {\n\t\t\twinParams.flags &= ~bits;\n\t\t}\n\t\t\n\t\twin.setAttributes(winParams);\n\t}\n\t\n\t@Override\n\tprotected void updateUrlBar() {\n\t\tCustomWebView currentWebView;\n\t\tBaseWebViewFragment currentFragment = getCurrentWebViewFragment();\n\t\t\n\t\tif ((currentFragment != null) &&\n\t\t\t\t(currentFragment.isStartPageShown())) {\n\t\t\tcurrentWebView = null;\n\t\t\t\n\t\t\tif (!mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\t\tsetToolbarsVisibility(true);\n\t\t\t}\n\t\t} else {\n\t\t\tcurrentWebView = getCurrentWebView();\n\t\t}\n\t\t\n\t\tif (currentWebView != null) {\n\t\t\tString title = currentWebView.getTitle();\n\t\t\tString url = currentWebView.getUrl();\n\t\t\tBitmap icon = currentWebView.getFavicon();\n\n\t\t\tif ((title != null) &&\n\t\t\t\t\t(!title.isEmpty())) {\n\t\t\t\tmUrlBar.setTitle(title);\n\t\t\t} else {\n\t\t\t\tmUrlBar.setTitle(R.string.ApplicationName);\n\t\t\t}\n\n\t\t\tif ((url != null) &&\n\t\t\t\t\t(!url.isEmpty())) {\t\t\t\t\n\t\t\t\tmUrlBar.setSubtitle(url);\n\t\t\t\tmUrlBar.setUrl(url);\n\t\t\t} else {\n\t\t\t\tmUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\t\t\tmUrlBar.setUrl(null);\n\t\t\t}\n\t\t\t\n\t\t\tsetApplicationButtonImage(icon);\n\t\t\t\n\t\t\tif (currentWebView.isLoading()) {\n\t\t\t\tmProgressBar.setVisibility(View.VISIBLE);\n\t\t\t\tmFaviconView.setVisibility(View.INVISIBLE);\n\t\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_stop);\n\t\t\t} else {\n\t\t\t\tmFaviconView.setVisibility(View.VISIBLE);\n\t\t\t\tmProgressBar.setVisibility(View.INVISIBLE);\n\t\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);\n\t\t\t}\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t} else {\n\t\t\tmUrlBar.setTitle(R.string.ApplicationName);\n\t\t\tmUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\t\tmFaviconView.setImageDrawable(mDefaultFavicon);\n\t\t\t\n\t\t\tmFaviconView.setVisibility(View.VISIBLE);\n\t\t\tmProgressBar.setVisibility(View.INVISIBLE);\n\t\t\t\t\t\t\n\t\t\tmUrlBar.setUrl(null);\n\t\t\tmBack.setEnabled(false);\n\t\t\tmForward.setEnabled(false);\n\t\t}\n\t\t\n\t\tmUrlBar.setPrivateBrowsingIndicator(currentFragment != null ? currentFragment.isPrivateBrowsingEnabled() : false);\n\t}\n\t\n\t@Override\n\tprotected void createStartPageFragment() {\n\t\tmStartPageFragment = new LegacyPhoneStartPageFragment();\n\t\tmStartPageFragment.setOnStartPageItemClickedListener(new OnStartPageItemClickedListener() {\t\t\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onStartPageItemClicked(String url) {\n\t\t\t\tloadUrl(url);\n\t\t\t}\n\t\t});\n\t}\n\t\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\tsuper.onSharedPreferenceChanged(sharedPreferences, key);\n\t\t\n\t\tif (Constants.PREFERENCE_BUBBLE_POSITION.equals(key)) {\n\t\t\tupdateBubblesVisibility();\n\t\t} else if (Constants.PREFERENCE_TOOLBARS_AUTOHIDE_DURATION.equals(key)) {\n\t\t\tupdateToolbarsDisplayDuration();\n\t\t} else if (Constants.PREFERENCES_SWITCH_TABS_METHOD.equals(key)) {\n\t\t\tupdateSwitchTabsMethod();\t\t\t\n\t\t\tupdateShowPreviousNextTabButtons();\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected void setApplicationButtonImage(Bitmap icon) {\n\t\tBitmapDrawable image = ApplicationUtils.getApplicationButtonImage(mActivity, icon);\n\t\t\n\t\tif (image != null) {\t\t\t\n\t\t\tmFaviconView.setImageDrawable(image);\n\t\t} else {\n\t\t\tmFaviconView.setImageDrawable(mDefaultFavicon);\n\t\t}\n\t}\n\t\n\tpublic void hideToolbars() {\n    \tif ((!mUrlBar.isUrlBarVisible()) &&\n    \t\t\t(!getCurrentWebViewFragment().isStartPageShown()) &&\n    \t\t\t(!mMenuVisible) &&\n    \t\t\t(!getCurrentWebView().isLoading())) {\n    \t\tsetToolbarsVisibility(false);\n    \t}\n    \t\n    \tmHideToolbarsRunnable = null;\n    }\n\t\n\tprivate void updateShowPreviousNextTabButtons() {\n\t\tif (isSwitchTabsByButtonsEnabled()) {\n\t\t\tif (mCurrentTabIndex == 0) {\n\t\t\t\tmShowPreviousTab.setVisibility(View.GONE);\n\t\t\t} else if (mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\t\tmShowPreviousTab.setTranslationX(0);\n\t\t\t\tmShowPreviousTab.setVisibility(View.VISIBLE);\n\t\t\t}\n\n\t\t\tif (mCurrentTabIndex == mFragmentsList.size() - 1) {\n\t\t\t\tmShowNextTab.setVisibility(View.GONE);\n\t\t\t} else if (mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\t\tmShowNextTab.setTranslationX(0);\n\t\t\t\tmShowNextTab.setVisibility(View.VISIBLE);\n\t\t\t}\n\t\t} else {\n\t\t\tmShowPreviousTab.setVisibility(View.GONE);\n\t\t\tmShowNextTab.setVisibility(View.GONE);\n\t\t}\n\t}\t\n\t\n\tprivate void showPreviousTab() {\n\t\tif (mCurrentTabIndex > 0) {\n\t\t\tmUrlBar.hideUrl();\n\t\t\t\n\t\t\tPhoneWebViewFragment oldFragment = mFragmentsList.get(mCurrentTabIndex);\n\t\t\toldFragment.getWebView().onPause();\n\t\t\t\n\t\t\tmCurrentTabIndex--;\n\t\t\t\n\t\t\tshowCurrentTab(true);\n\t\t\tstartHideToolbarsThread();\n\t\t}\n\t}\n\t\n\tprivate void showNextTab() {\n\t\tif (mCurrentTabIndex < mFragmentsList.size() - 1) {\n\t\t\tmUrlBar.hideUrl();\n\t\t\t\n\t\t\tPhoneWebViewFragment oldFragment = mFragmentsList.get(mCurrentTabIndex);\n\t\t\toldFragment.getWebView().onPause();\n\t\t\t\n\t\t\tmCurrentTabIndex++;\n\t\t\t\n\t\t\tshowCurrentTab(true);\n\t\t\tstartHideToolbarsThread();\n\t\t}\n\t}\n\t\n\t/**\n     * Change the tool bars visibility.\n     * @param setVisible If True, the tool bars will be shown.\n     */\n    private void setToolbarsVisibility(boolean setVisible) {\n\t\tif (setVisible) {\n\t\t\tif (!mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\t\tmUrlBar.hideUrl();\n\n\t\t\t\tboolean showTabsButtons = isSwitchTabsByButtonsEnabled();\n\t\t\t\t\n\t\t\t\tmToolbarsAnimator.startShowAnimation(\n\t\t\t\t\t\tshowTabsButtons && mCurrentTabIndex > 0,\n\t\t\t\t\t\tshowTabsButtons && mCurrentTabIndex < mFragmentsList.size() - 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (mToolbarsAnimator.isToolbarsVisible()) {\n\t\t\t\tif (mHideToolbarsRunnable != null) {\n\t\t\t\t\tmHideToolbarsRunnable.disable();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmUrlBar.hideUrl(mActionMode == null);\n\t\t\t\t\n\t\t\t\tmToolbarsAnimator.startHideAnimation();\n\t\t\t}\n\t\t}\n    }\n\t\n\tprivate void startHideToolbarsThread() {\n    \tif (mHideToolbarsRunnable != null) {\n    \t\tmHideToolbarsRunnable.disable();\n    \t}\n    \t\n    \tmHideToolbarsRunnable = new HideToolbarsRunnable(this, mToolbarsDisplayDuration * 1000);    \t\n    \tnew Thread(mHideToolbarsRunnable).start();\n    }\n\t\n\tprivate void updateBubblesVisibility() {\n\t\tString position = PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_BUBBLE_POSITION, \"RIGHT\");\n\t\t\n\t\tif (\"RIGHT\".equals(position)) {\n\t\t\tmBubbleLeft.setVisibility(View.INVISIBLE);\n\t\t\tmBubbleRight.setVisibility(View.VISIBLE);\n\t\t} else if (\"LEFT\".equals(position)) {\n\t\t\tmBubbleLeft.setVisibility(View.VISIBLE);\n\t\t\tmBubbleRight.setVisibility(View.INVISIBLE);\n\t\t} else if (\"BOTH\".equals(position)) {\n\t\t\tmBubbleLeft.setVisibility(View.VISIBLE);\n\t\t\tmBubbleRight.setVisibility(View.VISIBLE);\n\t\t}\n\t}\n\t\n\tprivate void updateToolbarsDisplayDuration() {\n\t\tString duration = PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCE_TOOLBARS_AUTOHIDE_DURATION, \"3\");\n\t\t\n\t\ttry {\n\t\t\tmToolbarsDisplayDuration = Integer.parseInt(duration);\n\t\t} catch (NumberFormatException e) {\n\t\t\tmToolbarsDisplayDuration = 3;\n\t\t}\n\t\t\n\t\tif (mToolbarsDisplayDuration <= 0) {\n\t\t\tmToolbarsDisplayDuration = 3;\n\t\t}\n\t}\n\t\n\tprivate void updateSwitchTabsMethod() {\n    \tString method = PreferenceManager.getDefaultSharedPreferences(mActivity).getString(Constants.PREFERENCES_SWITCH_TABS_METHOD, \"BUTTONS\");\n    \t\n    \tif (method.equals(\"BUTTONS\")) {\n    \t\tmSwitchTabsMethod = SwitchTabsMethod.BUTTONS;\n    \t} else if (method.equals(\"FLING\")) {\n    \t\tmSwitchTabsMethod = SwitchTabsMethod.FLING;\n    \t} else if (method.equals(\"BOTH\")) {\n    \t\tmSwitchTabsMethod = SwitchTabsMethod.BOTH;\n    \t} else {\n    \t\tmSwitchTabsMethod = SwitchTabsMethod.BUTTONS;\n    \t}\n    }\n\t\n\tprivate boolean isSwitchTabsByFlingEnabled() {\n\t\treturn (mSwitchTabsMethod == SwitchTabsMethod.FLING) || (mSwitchTabsMethod == SwitchTabsMethod.BOTH);\n\t}\n\t\n\tprivate boolean isSwitchTabsByButtonsEnabled() {\n\t\treturn (mSwitchTabsMethod == SwitchTabsMethod.BUTTONS) || (mSwitchTabsMethod == SwitchTabsMethod.BOTH);\n\t}\n\t\n\tprivate class GestureListener extends GestureDetector.SimpleOnGestureListener {\n\n\t\t@Override\n\t\tpublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,\tfloat velocityY) {\n\t\t\tif (isSwitchTabsByFlingEnabled()) {\n\t\t\t\tif (e2.getEventTime() - e1.getEventTime() <= FLIP_TIME_THRESHOLD) {\n\t\t\t\t\tif (e2.getX() > (e1.getX() + FLIP_PIXEL_THRESHOLD)) {\t\t\t\t\t\t\n\n\t\t\t\t\t\tshowPreviousTab();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// going forwards: pushing stuff to the left\n\t\t\t\t\tif (e2.getX() < (e1.getX() - FLIP_PIXEL_THRESHOLD)) {\t\t\t\t\t\n\n\t\t\t\t\t\tshowNextTab();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn super.onFling(e1, e2, velocityX, velocityY);\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/PhoneUIManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport org.tint.R;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.components.BadgedImageView;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.fragments.PhoneStartPageFragment;\nimport org.tint.ui.fragments.PhoneWebViewFragment;\nimport org.tint.ui.fragments.StartPageFragment.OnStartPageItemClickedListener;\nimport org.tint.ui.views.PanelLayout;\nimport org.tint.ui.views.PanelLayout.PanelEventsListener;\nimport org.tint.ui.views.PhoneUrlBar;\nimport org.tint.ui.views.PhoneUrlBar.OnPhoneUrlBarEventListener;\nimport org.tint.ui.views.TabView;\nimport org.tint.ui.views.TabsScroller.OnRemoveListener;\nimport org.tint.utils.Constants;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.preference.PreferenceManager;\nimport android.util.SparseArray;\nimport android.view.ActionMode;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.view.View.OnClickListener;\nimport android.view.inputmethod.InputMethodManager;\nimport android.view.ViewGroup;\nimport android.webkit.WebView;\nimport android.widget.BaseAdapter;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\n\npublic class PhoneUIManager extends BasePhoneUIManager {\n\n\tprivate PanelLayout mPanel;\n\t\n\tprivate BadgedImageView mFaviconView;\n\t\n\tprivate ImageView mHome;\n\t\n\tprivate ImageView mExitFullScreen;\t\n\t\n\tprivate TabAdapter mAdapter;\n\t\n\tprivate SharedPreferences mPreferences;\n\n\tstatic {\n\t\tsAnimationType = AnimationType.NONE;\n\t}\n\t\n\tpublic PhoneUIManager(TintBrowserActivity activity) {\n\t\tsuper(activity);\t\t\n\t\t\n\t\tmPreferences = PreferenceManager.getDefaultSharedPreferences(activity);\n\t\t\n\t\tmAdapter = new TabAdapter();\n        mPanel.getTabsScroller().setAdapter(mAdapter);\n\t}\n\t\n\t@Override\n\tprotected void setupUI() {\n\t\tmActionBar.hide();\t\t\n\t\t\n\t\tmPanel = (PanelLayout) mActivity.findViewById(R.id.panel_layout);\n\t\t\n\t\tmPanel.setPanelEventsListener(new PanelEventsListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onPanelShown() {\n\t\t\t\tmPanel.getTabsScroller().snapToSelected(mCurrentTabIndex, true);\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onPanelHidden() { }\n\t\t});\n\t\t\n\t\tmExitFullScreen = (ImageView) mActivity.findViewById(R.id.ExitFullScreen);\n\t\tmExitFullScreen.setOnClickListener(new OnClickListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\ttoggleFullScreen();\n\t\t\t}\n\t\t});\n\t\t\n\t\tImageView openTabView = (ImageView) mActivity.findViewById(R.id.BtnAddTab);\n\t\topenTabView.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\taddTab(true, PreferenceManager.getDefaultSharedPreferences(v.getContext()).\n\t\t\t\t\t\tgetBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));\n\t\t\t\t\n\t\t\t\tif (mPreferences.getBoolean(Constants.PREFERENCE_CLOSE_PANEL_ON_NEW_TAB, true)) {\n\t\t\t\t\tmPanel.hidePanel();\n\t\t\t\t} else {\n\t\t\t\t\t// Wait for the adapter/scoller to updated before scrolling to the new tab.\n\t\t\t\t\t// Maybe find a better way to do this.\n\t\t\t\t\tmPanel.postDelayed(new Runnable() {\n\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\t\tmPanel.getTabsScroller().snapToSelected(mCurrentTabIndex, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 50);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tImageView openBookmarksView = (ImageView) mActivity.findViewById(R.id.BtnBookmarks);\n\t\topenBookmarksView.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\topenBookmarksActivityForResult();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmProgressBar = (ProgressBar) mActivity.findViewById(R.id.WebViewProgress);\n\t\tmProgressBar.setIndeterminate(false);\n\t\tmProgressBar.setMax(100);\n\t\tmProgressBar.setVisibility(View.GONE);\n\t\t\n\t\tmUrlBar = (PhoneUrlBar) mActivity.findViewById(R.id.UrlBar);\t\t\n\t\t\n\t\tmUrlBar.setEventListener(new OnPhoneUrlBarEventListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onVisibilityChanged(boolean urlBarVisible) {\n\t\t\t\tif (urlBarVisible) {\n\t\t\t\t\tmUrlBar.showGoStopReloadButton();\n\t\t\t\t} else {\n\t\t\t\t\tBaseWebViewFragment currentFragment = getCurrentWebViewFragment();\n\t\t\t\t\t\n\t\t\t\t\tif ((currentFragment != null) &&\n\t\t\t\t\t\t\t(currentFragment.isStartPageShown())){\n\t\t\t\t\t\tmUrlBar.hideGoStopReloadButton();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onUrlValidated() {\n\t\t\t\tloadCurrentUrl();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onGoStopReloadClicked() {\n\t\t\t\tif (mUrlBar.isUrlChangedByUser()) {\n\t\t\t\t\t// Use the UIManager to load urls, as it perform check on them.\n\t\t\t\t\tloadCurrentUrl();\n\t\t\t\t} else if (getCurrentWebView().isLoading()) {\n\t\t\t\t\tgetCurrentWebView().stopLoading();\n\t\t\t\t} else {\n\t\t\t\t\tgetCurrentWebView().reload();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void onMenuVisibilityChanged(boolean isVisible) {\n\t\t\t\tmMenuVisible = isVisible;\t\t\t\t\n\t\t\t}\n\t\t});\n        \n        mUrlBar.setTitle(R.string.ApplicationName);\n        mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\t\n        mFaviconView = (BadgedImageView) mActivity.findViewById(R.id.FaviconView);\n        mFaviconView.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mUrlBar.isUrlBarVisible()) {\n\t\t\t\t\tmUrlBar.hideUrl();\n\t\t\t\t} else {\n\t\t\t\t\tmPanel.togglePanel();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        \n\t\tmTopBar = (RelativeLayout) mActivity.findViewById(R.id.TopBar);\n\t\tmTopBar.setOnClickListener(new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\t// Steal event from WebView.\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t\n\t\tmBack = (ImageView) mActivity.findViewById(R.id.BtnBack);\n        mBack.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t    (getCurrentWebView().canGoBack())) {\n\t\t\t\t\tgetCurrentWebView().goBack();\n\t\t\t\t\tmPanel.hidePanel();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        mBack.setEnabled(false);\n        \n        mForward = (ImageView) mActivity.findViewById(R.id.BtnForward);\n        mForward.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t    (getCurrentWebView().canGoForward())) {\n\t\t\t\t\tgetCurrentWebView().goForward();\n\t\t\t\t\tmPanel.hidePanel();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        mForward.setEnabled(false);\n        \n        mHome = (ImageView) mActivity.findViewById(R.id.BtnHome);\n        mHome.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tmProgressBar.setProgress(0);\n\t\t\t\tmProgressBar.setVisibility(View.GONE);\n\t\t\t\tloadHomePage();\n\t\t\t\tmPanel.hidePanel();\n\t\t\t}\n\t\t});\n        \n        mPanel.getTabsScroller().setOnRemoveListener(new OnRemoveListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onRemovePosition(int position) {\n\t\t\t\tif (mFragmentsList.size() > 1) {\n\t\t\t\t\tcloseTabByIndex(position);\n\t\t\t\t} else {\n\t\t\t\t\tloadHomePage();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        \n        super.setupUI();\n\t}\n\n\t@Override\n\tpublic void addTab(String url, boolean openInBackground, boolean privateBrowsing) {\n\t\tsuper.addTab(url, openInBackground, privateBrowsing);\n\n\t\tupdateUrlBar();\t\t\n\t\tmAdapter.notifyDataSetChanged();\n\t}\n\t\n\t@Override\n\tprotected void closeLastTab() {\n\t\tsuper.closeLastTab();\n\t\t\t\t\n\t\tmAdapter.notifyDataSetChanged();\n\t}\n\t\n\t@Override\n\tprotected void closeTabByIndex(int index) {\n\t\tsuper.closeTabByIndex(index);\n\n\t\tupdateUrlBar();\n\t\tmAdapter.notifyDataSetChanged();\n\t}\n\t\n\t@Override\n\tprotected void showCurrentTab(boolean notifyTabSwitched) {\n\t\tsuper.showCurrentTab(notifyTabSwitched);\n\t\t\n\t\tTabView currentTabView = mAdapter.getViewAt(mCurrentTabIndex);\n\t\tif (currentTabView != null) {\n\t\t\tcurrentTabView.setSelected(true);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onPageStarted(WebView view, String url, Bitmap favicon) {\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmProgressBar.setProgress(0);\n\t\t\tmProgressBar.setVisibility(View.VISIBLE);\t\t\t\n\t\t\t\n\t\t\tmUrlBar.setUrl(url);\n\t\t\t\n\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_stop);\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t}\n\t\t\n\t\tCustomWebView webview = (CustomWebView) view;\n\t\tPhoneWebViewFragment parent = (PhoneWebViewFragment) webview.getParentFragment();\n\t\t\n\t\tif (parent != null) {\n\t\t\tint index = mFragmentsList.indexOf(parent);\n\t\t\tif (index != -1) {\n\t\t\t\tTabView tabview = mAdapter.getViewAt(index);\n\t\t\t\ttabview.setFavicon(null);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onPageFinished(WebView view, String url) {\n\t\tsuper.onPageFinished(view, url);\n\t\t\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmProgressBar.setProgress(100);\n\t\t\tmProgressBar.setVisibility(View.GONE);\t\t\t\n\t\t\t\t\t\t\n\t\t\tmUrlBar.setUrl(url);\n\t\t\t\n\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onClientPageFinished(final CustomWebView view, String url) {\n\t\tsuper.onClientPageFinished(view, url);\n\t\n\t\tPhoneWebViewFragment parent = (PhoneWebViewFragment) view.getParentFragment();\n\t\t\n\t\tif ((parent != null) &&\n\t\t\t\t(!parent.isStartPageShown()) &&\n\t\t\t\t(!view.isLoading())) {\n\t\t\tint index = mFragmentsList.indexOf(parent);\n\t\t\tif (index != -1) {\n\t\t\t\tfinal TabView tabview = mAdapter.getViewAt(index);\n\t\t\t\t\n\t\t\t\tmPanel.postDelayed(new Runnable() {\t\t\t\t\t\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\ttabview.setImage(view.capturePicture());\n\t\t\t\t\t}\n\t\t\t\t}, 50);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onReceivedTitle(WebView view, String title) {\n\t\tsuper.onReceivedTitle(view, title);\n\t\t\n\t\tmAdapter.notifyDataSetChanged();\n\t}\n\n\t@Override\n\tpublic void onReceivedIcon(WebView view, Bitmap icon) {\n\t\t// Don't call parent here, we don't need the parent behavior.\n\t\tCustomWebView webview = (CustomWebView) view;\n\t\tPhoneWebViewFragment parent = (PhoneWebViewFragment) webview.getParentFragment();\n\t\t\n\t\tif ((parent != null) &&\n\t\t\t\t(!parent.isStartPageShown())) {\n\t\t\tint index = mFragmentsList.indexOf(parent);\n\t\t\tif (index != -1) {\n\t\t\t\tTabView tabview = mAdapter.getViewAt(index);\n\t\t\t\ttabview.setFavicon(icon);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onKeyBack() {\n\t\tif (!super.onKeyBack()) {\n\t\t\tif (mUrlBar.isUrlBarVisible()) {\n\t\t\t\tmUrlBar.hideUrl();\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t} else if (mPanel.isPanelShown()) {\n\t\t\t\tmPanel.hidePanel();\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tCustomWebView currentWebView = getCurrentWebView();\n\t\t\t\t\n\t\t\t\tif ((currentWebView != null) &&\n\t\t\t\t\t\t(currentWebView.canGoBack())) {\n\t\t\t\t\tcurrentWebView.goBack();\n\t\t\t\t\treturn true;\n\t\t\t\t} else if (isHomePageStartPage() &&\n\t\t\t\t\t\t!isStartPageShownOnCurrentTab()) {\n\t\t\t\t\tloadHomePage();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic boolean onKeySearch() {\n\t\tmUrlBar.showUrl();\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic void onMenuVisibilityChanged(boolean isVisible) { }\n\n\t@Override\n\tpublic void onShowStartPage() {\n\t\tsuper.onShowStartPage();\n\t\t\n\t\tmAdapter.notifyDataSetChanged();\n\t}\n\n\t@Override\n\tpublic void onActionModeStarted(ActionMode mode) {\n\t\tmActionMode = mode;\n\t}\n\n\t@Override\n\tpublic void onActionModeFinished(ActionMode mode) {\n\t\tif (mActionMode != null) {\n\t\t\tmActionMode = null;\n\t\t\n\t\t\tInputMethodManager mgr = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\t\tmgr.hideSoftInputFromWindow(null, 0);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onActivityResult(int requestCode, int resultCode, Intent intent) {\n\t\tif ((requestCode == TintBrowserActivity.ACTIVITY_BOOKMARKS) &&\n\t\t\t\t(resultCode == Activity.RESULT_OK)) {\n\t\t\tif (mPanel.isPanelShown()) {\n\t\t\t\tmPanel.hidePanel();\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onTouch(View v, MotionEvent event) {\n\t\treturn false;\n\t}\n\n\t@Override\n\tprotected void setFullScreenFromPreferences() {\n\t\tboolean fullScreen = isFullScreen();\n\t\t\n\t\tWindow win = mActivity.getWindow();\n        WindowManager.LayoutParams winParams = win.getAttributes();\n\t\tfinal int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;\n\t\t\n\t\tif (fullScreen) {\n\t\t\twinParams.flags |=  bits;\n\t\t\tmTopBar.setVisibility(View.GONE);\n\t\t\tmExitFullScreen.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\twinParams.flags &= ~bits;\n\t\t\tmTopBar.setVisibility(View.VISIBLE);\n\t\t\tmExitFullScreen.setVisibility(View.GONE);\n\t\t}\n\t\t\n\t\twin.setAttributes(winParams);\n\t}\n\n\t@Override\n\tprotected void updateUrlBar() {\n\t\tCustomWebView currentWebView;\n\t\tBaseWebViewFragment currentFragment = getCurrentWebViewFragment();\n\t\t\n\t\tif ((currentFragment != null) &&\n\t\t\t\t(currentFragment.isStartPageShown())) {\n\t\t\tcurrentWebView = null;\n\t\t} else {\n\t\t\tcurrentWebView = getCurrentWebView();\n\t\t}\n\t\t\n\t\tif (currentWebView != null) {\n\t\t\tString title = currentWebView.getTitle();\n\t\t\tString url = currentWebView.getUrl();\n\t\t\tBitmap icon = currentWebView.getFavicon();\n\n\t\t\tif ((title != null) &&\n\t\t\t\t\t(!title.isEmpty())) {\n\t\t\t\tmUrlBar.setTitle(title);\n\t\t\t} else {\n\t\t\t\tmUrlBar.setTitle(R.string.ApplicationName);\n\t\t\t}\n\n\t\t\tif ((url != null) &&\n\t\t\t\t\t(!url.isEmpty())) {\t\t\t\t\n\t\t\t\tmUrlBar.setSubtitle(url);\n\t\t\t\tmUrlBar.setUrl(url);\n\t\t\t} else {\n\t\t\t\tmUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\t\t\t\tmUrlBar.setUrl(null);\n\t\t\t}\n\t\t\t\n\t\t\tsetApplicationButtonImage(icon);\n\t\t\t\n\t\t\tif (currentWebView.isLoading()) {\n\t\t\t\tmProgressBar.setProgress(currentWebView.getProgress());\n\t\t\t\tmProgressBar.setVisibility(View.VISIBLE);\n\t\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_stop);\n\t\t\t} else {\n\t\t\t\tmProgressBar.setVisibility(View.GONE);\n\t\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);\n\t\t\t}\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t} else {\n\t\t\tmUrlBar.setTitle(R.string.ApplicationName);\n\t\t\tmUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);\n\n\t\t\tmProgressBar.setVisibility(View.GONE);\n\t\t\t\t\t\t\n\t\t\tmUrlBar.setUrl(null);\n\t\t\tmBack.setEnabled(false);\n\t\t\tmForward.setEnabled(false);\n\t\t}\n\t\t\n\t\tmFaviconView.setValue(mFragmentsList.size());\n\t\t\n\t\tmUrlBar.setPrivateBrowsingIndicator(currentFragment != null ? currentFragment.isPrivateBrowsingEnabled() : false);\n\t}\n\n\t@Override\n\tprotected void createStartPageFragment() {\n\t\tmStartPageFragment = new PhoneStartPageFragment();\n\t\tmStartPageFragment.setOnStartPageItemClickedListener(new OnStartPageItemClickedListener() {\t\t\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onStartPageItemClicked(String url) {\n\t\t\t\tloadUrl(url);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tprivate void showTabByIndex(int index, boolean notifyTabSwitched) {\n\t\tPhoneWebViewFragment oldFragment = mFragmentsList.get(mCurrentTabIndex);\n\t\toldFragment.getWebView().onPause();\n\t\t\n\t\tTabView oldTabView = mAdapter.getViewAt(mCurrentTabIndex);\n\t\tif (oldTabView != null) {\n\t\t\toldTabView.setSelected(false);\n\t\t}\n\t\t\n\t\tmCurrentTabIndex = index;\n\t\tshowCurrentTab(notifyTabSwitched);\n\t}\n\t\n\tprivate class TabAdapter extends BaseAdapter {\n\t\t\n\t\tprivate SparseArray<TabView> mViews;\n\t\t\n\t\tpublic TabAdapter() {\n\t\t\tsuper();\n\t\t\tmViews = new SparseArray<TabView>();\n\t\t}\n\n\t\t@Override\n\t\tpublic int getCount() {\n\t\t\treturn mFragmentsList.size();\n\t\t}\n\n\t\t@Override\n\t\tpublic PhoneWebViewFragment getItem(int position) {\n\t\t\treturn mFragmentsList.get(position);\n\t\t}\n\n\t\t@Override\n\t\tpublic long getItemId(int position) {\t\t\t\n\t\t\treturn position;\n\t\t}\n\n\t\t@Override\n\t\tpublic void notifyDataSetChanged() {\n\t\t\tmViews.clear();\n\t\t\tsuper.notifyDataSetChanged();\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(final int position, View convertView, ViewGroup parent) {\n\t\t\tfinal TabView tabview = new TabView(mActivity);\n\t\t\t\n\t\t\tPhoneWebViewFragment fragment = getItem(position);\n\t\t\t\n\t\t\tif (fragment.isStartPageShown()) {\n\t\t\t\ttabview.setTitle(R.string.StartPageLabel);\n\t\t\t\ttabview.setFavicon(null);\n\t\t\t} else {\n\t\t\t\tCustomWebView webView = fragment.getWebView();\n\t\t\t\t\n\t\t\t\ttabview.setTitle(webView.getTitle());\n\t\t\t\t\n\t\t\t\ttabview.setFavicon(webView.getFavicon());\n\t\t\t\ttabview.setImage(webView.isLoading() ? null : webView.capturePicture());\n\t\t\t}\n\t\t\t\n\t\t\ttabview.setSelected(position == mCurrentTabIndex);\n\t\t\t\n\t\t\ttabview.setOnClickListener(new OnClickListener() {\n\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(View v) {\n\t\t\t\t\tif (tabview.isClose(v)) {\n\t\t\t\t\t\tmPanel.getTabsScroller().animateOut(tabview);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshowTabByIndex(position, true);\n\t\t\t\t\t\tmPanel.hidePanel();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tmViews.put(position, tabview);\n\t\t\t\n\t\t\treturn tabview;\n\t\t}\n\t\t\n\t\tpublic TabView getViewAt(int position) {\n\t\t\treturn mViews.get(position);\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/TabletUIManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Hashtable;\nimport java.util.Map;\nimport java.util.UUID;\n\nimport org.tint.R;\nimport org.tint.controllers.Controller;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.fragments.BaseWebViewFragment;\nimport org.tint.ui.fragments.StartPageFragment;\nimport org.tint.ui.fragments.TabletStartPageFragment;\nimport org.tint.ui.fragments.TabletWebViewFragment;\nimport org.tint.ui.fragments.StartPageFragment.OnStartPageItemClickedListener;\nimport org.tint.ui.tabs.WebViewFragmentTabListener;\nimport org.tint.ui.views.TabletUrlBar;\nimport org.tint.ui.views.TabletUrlBar.OnTabletUrlBarEventListener;\nimport android.app.ActionBar;\nimport android.app.FragmentTransaction;\nimport android.app.ActionBar.Tab;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.view.ActionMode;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.webkit.WebView;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\n\npublic class TabletUIManager extends BaseUIManager {\n\n\tprivate Map<Tab, TabletWebViewFragment> mTabs;\n\tprivate Map<UUID, TabletWebViewFragment> mFragmentsMap;\n\t\n\tprivate TabletUrlBar mUrlBar;\n\tprivate ProgressBar mProgressBar;\n\tprivate ImageView mExitFullScreen;\n\t\n\tpublic TabletUIManager(TintBrowserActivity activity) {\n\t\tsuper(activity);\n\t\t\n\t\tmTabs = new Hashtable<Tab, TabletWebViewFragment>();\n\t\tmFragmentsMap = new Hashtable<UUID, TabletWebViewFragment>();\t\t\n\n\t\tif (mStartPageFragment == null) {\n\t\t\tFragmentTransaction ft = mFragmentManager.beginTransaction();\n\t\t\t\n\t\t\tmStartPageFragment = new TabletStartPageFragment();\n\t\t\tmStartPageFragment.setOnStartPageItemClickedListener(new OnStartPageItemClickedListener() {\t\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onStartPageItemClicked(String url) {\n\t\t\t\t\tloadUrl(url);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tft.add(R.id.WebViewContainer, mStartPageFragment);\n\t\t\tft.hide(mStartPageFragment);\n\t\t\t\n\t\t\tft.commit();\n\t\t}\n\t}\n\t\n\tpublic void onTabSelected(Tab tab) {\n\t\tupdateUrlBar();\n\t\t\n\t\tCustomWebView webView = getCurrentWebView();\n\t\tif ((webView != null) &&\n\t\t\t\t(!webView.isPrivateBrowsingEnabled())) {\n\t\t\tController.getInstance().getAddonManager().onTabSwitched(mActivity, webView);\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected void setupUI() {\t\t\n\t\tmActionBar.setDisplayShowTitleEnabled(false);\n\t\tmActionBar.setHomeButtonEnabled(false);\n\t\tmActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);\n\t\t\n\t\tmProgressBar = (ProgressBar) mActivity.findViewById(R.id.WebViewProgress);\n\t\t\n\t\tmExitFullScreen = (ImageView) mActivity.findViewById(R.id.ExitFullScreen);\n\t\tmExitFullScreen.setOnClickListener(new OnClickListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\ttoggleFullScreen();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmUrlBar = (TabletUrlBar) mActivity.findViewById(R.id.UrlBar);\n\t\tmUrlBar.setEventListener(new OnTabletUrlBarEventListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onUrlValidated() {\n\t\t\t\tloadCurrentUrl();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onHomeClicked() {\n\t\t\t\tloadHomePage();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onGoStopReloadClicked() {\n\t\t\t\tif (mUrlBar.isUrlChangedByUser()) {\n\t\t\t\t\t// Use the UIManager to load urls, as it perform check on them.\n\t\t\t\t\tloadCurrentUrl();\n\t\t\t\t} else if (getCurrentWebView().isLoading()) {\n\t\t\t\t\tgetCurrentWebView().stopLoading();\n\t\t\t\t} else {\n\t\t\t\t\tgetCurrentWebView().reload();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onForwardClicked() {\n\t\t\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t\t\t(getCurrentWebView().canGoForward())) {\n\t\t\t\t\tgetCurrentWebView().goForward();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onBookmarksClicked() {\n\t\t\t\topenBookmarksActivityForResult();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onBackClicked() {\n\t\t\t\tif ((!getCurrentWebViewFragment().isStartPageShown()) &&\n\t\t\t\t\t\t(getCurrentWebView().canGoBack())) {\n\t\t\t\t\tgetCurrentWebView().goBack();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tsuper.setupUI();\n\t}\n\n\t@Override\n\tpublic CustomWebView getCurrentWebView() {\n\t\tif (mActionBar.getSelectedTab() != null) {\t\t\t\n\t\t\treturn mTabs.get(mActionBar.getSelectedTab()).getWebView();\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic String getCurrentUrl() {\n\t\treturn mUrlBar.getUrl();\n\t}\n\t\n\t@Override\n\tpublic BaseWebViewFragment getCurrentWebViewFragment() {\n\t\tif (mActionBar.getSelectedTab() != null) {\n\t\t\treturn mTabs.get(mActionBar.getSelectedTab());\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void addTab(String url, boolean openInBackground, boolean privateBrowsing) {\n\t\tTab tab = mActionBar.newTab();\n\t\ttab.setText(R.string.NewTab);\n\t\t\n\t\tTabletWebViewFragment fragment = new TabletWebViewFragment();\n\t\t\n\t\tfragment.init(this, tab, privateBrowsing, url);\n\t\t\n\t\ttab.setTabListener(new WebViewFragmentTabListener(this, fragment));\n\t\t\n\t\tmTabs.put(tab, fragment);\n\t\tmFragmentsMap.put(fragment.getUUID(), fragment);\n\t\t\n\t\tmActionBar.addTab(tab, mActionBar.getSelectedNavigationIndex() + 1);\n\t\t\n\t\tif (!openInBackground) {\n\t\t\tmActionBar.selectTab(tab);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void closeCurrentTab() {\n\t\tif (mActionBar.getTabCount() > 1) {\n\t\t\tcloseTabByTab(mActionBar.getSelectedTab());\n\t\t} else {\n\t\t\tloadHomePage();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void closeTab(UUID tabId) {\n\t\tif (mActionBar.getTabCount() > 1) {\n\t\t\tTabletWebViewFragment fragment = (TabletWebViewFragment) getWebViewFragmentByUUID(tabId);\n\t\t\tif (fragment != null) {\n\t\t\t\tTab tab = fragment.getTab();\n\t\t\t\tif (tab != null) {\n\t\t\t\t\tcloseTabByTab(tab);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\tfor (TabletWebViewFragment fragment : mTabs.values()) {\n\t\t\tfragment.getWebView().loadSettings();\n\t\t}\t\t\n\t}\n\t\n\t@Override\n\tpublic void onMenuVisibilityChanged(boolean isVisible) { }\n\t\n\t@Override\n\tpublic boolean onKeyBack() {\n\t\tif (!super.onKeyBack()) {\n\t\t\tCustomWebView currentWebView = getCurrentWebView();\n\t\t\t\n\t\t\tif ((currentWebView != null) &&\n\t\t\t\t\t(currentWebView.canGoBack())) {\n\t\t\t\tcurrentWebView.goBack();\n\t\t\t\treturn true;\n\t\t\t} else if (isHomePageStartPage() &&\n\t\t\t\t\t!isStartPageShownOnCurrentTab()) {\n\t\t\t\tloadHomePage();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t@Override\n\tpublic boolean onKeySearch() {\n\t\tmUrlBar.setFocusOnUrl();\n\t\t\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic void onPageStarted(WebView view, String url, Bitmap favicon) {\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmProgressBar.setProgress(0);\n\t\t\tmProgressBar.setVisibility(View.VISIBLE);\n\t\t\t\n\t\t\tmUrlBar.setUrl(url);\n\t\t\t\n\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_stop);\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onPageFinished(WebView view, String url) {\n\t\tsuper.onPageFinished(view, url);\n\t\t\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmProgressBar.setProgress(100);\n\t\t\tmProgressBar.setVisibility(View.INVISIBLE);\t\t\t\n\t\t\t\t\t\t\n\t\t\tmUrlBar.setUrl(url);\n\t\t\t\n\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);\n\t\t\t\n\t\t\tupdateBackForwardEnabled();\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onProgressChanged(WebView view, int newProgress) {\n\t\tif (view == getCurrentWebView()) {\n\t\t\tmProgressBar.setProgress(newProgress);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onReceivedTitle(WebView view, String title) {\n\t\tfor (TabletWebViewFragment fragment : mTabs.values()) {\n\t\t\tfragment.onReceivedTitle(view, title);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void onShowStartPage() {\n\t\tmUrlBar.setUrl(null);\n\t\tmUrlBar.setBackEnabled(false);\n\t\tmUrlBar.setForwardEnabled(false);\n\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_go);\n\t\t\n\t\tmActionBar.setIcon(R.drawable.ic_launcher);\n\t\t\n\t\tTab tab = mActionBar.getSelectedTab();\n\t\ttab.setText(R.string.NewTab);\n\t}\n\t\n\t@Override\n\tpublic void onHideStartPage() { }\n\n\t@Override\n\tpublic boolean onTouch(View v, MotionEvent event) {\n\t\treturn false;\n\t}\n\n\t@Override\n\tprotected int getTabCount() {\t\t\n\t\treturn mTabs.size();\n\t}\n\t\n\t@Override\n\tprotected BaseWebViewFragment getWebViewFragmentByUUID(UUID fragmentId) {\n\t\treturn mFragmentsMap.get(fragmentId);\n\t}\n\t\n\t@Override\n\tpublic void onActionModeStarted(ActionMode mode) { }\n\n\t@Override\n\tpublic void onActionModeFinished(ActionMode mode) { }\n\t\n\t@Override\n\tpublic void onActivityResult(int requestCode, int resultCode, Intent intent) { }\n\t\n\tpublic StartPageFragment getStartPageFragment() {\n\t\treturn mStartPageFragment;\n\t}\n\n\t@Override\n\tprotected void setFullScreenFromPreferences() {\n\t\tboolean fullScreen = isFullScreen();\n\t\t\n\t\tif (fullScreen) {\n\t\t\tmActionBar.hide();\n\t\t} else {\n\t\t\tmActionBar.show();\n\t\t}\n\t\t\n\t\tif (mExitFullScreen != null) {\n\t\t\tmExitFullScreen.setVisibility(fullScreen ? View.VISIBLE : View.GONE);\n\t\t}\n\t}\n\n\t@Override\n\tprotected void showStartPage(BaseWebViewFragment webViewFragment) {\n\t\t\n\t\tif ((webViewFragment != null) &&\n\t\t\t\t(!webViewFragment.isStartPageShown())) {\n\t\t\n\t\t\twebViewFragment.getWebView().onPause();\n\t\t\twebViewFragment.setStartPageShown(true);\n\t\t\t\n\t\t\tif (webViewFragment == getCurrentWebViewFragment()) {\n\n\t\t\t\tFragmentTransaction ft = mFragmentManager.beginTransaction();\n\t\t\t\t\n\t\t\t\tft.hide(webViewFragment);\n\t\t\t\tft.show(mStartPageFragment);\n\n\t\t\t\tft.commit();\n\n\t\t\t\tonShowStartPage();\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tprotected void hideStartPage(BaseWebViewFragment webViewFragment) {\n\t\t\n\t\tif ((webViewFragment != null) &&\n\t\t\t\t(webViewFragment.isStartPageShown())) {\n\n\t\t\twebViewFragment.setStartPageShown(false);\n\n\t\t\tif (webViewFragment == getCurrentWebViewFragment()) {\t\t\t\t\n\n\t\t\t\tFragmentTransaction ft = mFragmentManager.beginTransaction();\n\n\t\t\t\tft.hide(mStartPageFragment);\n\t\t\t\tft.show(webViewFragment);\n\n\t\t\t\tft.commit();\n\n\t\t\t\tonHideStartPage();\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected void resetUI() {\n\t\tupdateUrlBar();\t\t\n\t}\n\n\t@Override\n\tprotected Collection<BaseWebViewFragment> getTabsFragments() {\t\t\n\t\treturn new ArrayList<BaseWebViewFragment>(mTabs.values());\n\t}\n\n\tprivate void closeTabByTab(Tab tab) {\n\t\tTabletWebViewFragment oldFragment = mTabs.get(tab);\n\t\t\n\t\tif (oldFragment != null) {\n\t\t\tCustomWebView webView = oldFragment.getWebView();\n\t\t\t\n\t\t\tif (!webView.isPrivateBrowsingEnabled()) {\n\t\t\t\tController.getInstance().getAddonManager().onTabClosed(mActivity, webView);\n\t\t\t}\n\n\t\t\twebView.onPause();\n\t\t\t\n\t\t\tmTabs.remove(tab);\n\t\t\tmFragmentsMap.remove(oldFragment.getUUID());\n\n\t\t\tmActionBar.removeTab(tab);\n\t\t}\n\t}\n\t\n\tprivate void updateUrlBar() {\n\t\tCustomWebView currentWebView;\n\t\tBaseWebViewFragment currentFragment = getCurrentWebViewFragment();\n\n\t\tif ((currentFragment != null) &&\n\t\t\t\t(currentFragment.isStartPageShown())) {\n\t\t\tcurrentWebView = null;\n\t\t} else {\n\t\t\tcurrentWebView = getCurrentWebView();\n\t\t}\n\n\t\tif (currentWebView != null) {\n\t\t\tString url = currentWebView.getUrl();\n\n\t\t\tif ((url != null) &&\n\t\t\t\t\t(!url.isEmpty())) {\n\t\t\t\tmUrlBar.setUrl(url);\n\t\t\t} else {\n\t\t\t\tmUrlBar.setUrl(null);\n\t\t\t}\n\n\t\t\tsetApplicationButtonImage(currentWebView.getFavicon());\n\n\t\t\tif (currentWebView.isLoading()) {\n\t\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_stop);\n\t\t\t\tmProgressBar.setVisibility(View.VISIBLE);\n\t\t\t} else {\n\t\t\t\tmUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);\n\t\t\t\tmProgressBar.setVisibility(View.GONE);\n\t\t\t}\n\n\t\t\tupdateBackForwardEnabled();\n\t\t} else {\n\t\t\tmUrlBar.setUrl(null);\n\t\t\tmUrlBar.setBackEnabled(false);\n\t\t\tmUrlBar.setForwardEnabled(false);\n\n\t\t\tmActionBar.setIcon(R.drawable.ic_launcher);\n\t\t}\n\t\t\n\t\tmUrlBar.setPrivateBrowsingIndicator(currentFragment != null ? currentFragment.isPrivateBrowsingEnabled() : false);\n\t}\n\t\n\tprivate void updateBackForwardEnabled() {\n\t\tCustomWebView currentWebView = getCurrentWebView();\n\t\t\n\t\tmUrlBar.setBackEnabled(currentWebView.canGoBack());\n\t\tmUrlBar.setForwardEnabled(currentWebView.canGoForward());\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/ToolbarsAnimator.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\nimport android.animation.Animator.AnimatorListener;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\n\npublic class ToolbarsAnimator {\n\t\n\tprivate ViewGroup mTopBar;\n\tprivate ViewGroup mBottomBar;\n\tprivate ImageView mShowPreviousTab;\n\tprivate ImageView mShowNextTab;\n\t\n\tprivate Animator mAnimator;\t\n\t\n\tprivate AnimatorListener mShowListener;\n\tprivate AnimatorListener mHideListener;\n\t\n\tprivate boolean mToolbarsVisible;\n\t\n\tpublic ToolbarsAnimator(ViewGroup topBar, ViewGroup bottomBar, ImageView showPreviousTab, ImageView showNextTab) {\n\t\tmTopBar = topBar;\n\t\tmBottomBar = bottomBar;\n\t\tmShowPreviousTab = showPreviousTab;\n\t\tmShowNextTab = showNextTab;\n\t\t\n\t\tmShowListener = new AnimatorListenerAdapter() {\n\t\t\t@Override\n\t\t\tpublic void onAnimationEnd(Animator animation) {\n\t\t\t\tmAnimator = null;\n\t\t\t\tmTopBar.requestLayout();\n\t\t\t\tmBottomBar.requestLayout();\t\t\t\t\n\t\t\t\tmShowPreviousTab.requestLayout();\n\t\t\t\tmShowNextTab.requestLayout();\n\t\t\t}\t\t\n\t\t};\n\t\t\n\t\tmHideListener = new AnimatorListenerAdapter() {\n\t\t\t@Override\n\t\t\tpublic void onAnimationEnd(Animator animation) {\n\t\t\t\tmAnimator = null;\n\t\t\t\tmTopBar.setVisibility(View.GONE);\n\t\t\t\tmBottomBar.setVisibility(View.GONE);\n\t\t\t\tmShowPreviousTab.setVisibility(View.GONE);\n\t\t\t\tmShowNextTab.setVisibility(View.GONE);\n\t\t\t}\n\t\t};\n\t\t\n\t\tmToolbarsVisible = true;\n\t\tmAnimator = null;\n\t}\t\n\t\n\tpublic void startShowAnimation(boolean showPreviousTabButton, boolean showNextTabButton) {\n\t\tif (mAnimator != null) {\n\t\t\tmAnimator.end();\n\t\t}\n\t\t\t\t\n\t\tmTopBar.setVisibility(View.VISIBLE);\n\t\tmBottomBar.setVisibility(View.VISIBLE);\n\t\t\n\t\tif (showPreviousTabButton) {\n\t\t\tmShowPreviousTab.setVisibility(View.VISIBLE);\n\t\t}\n\t\t\n\t\tif (showNextTabButton) {\n\t\t\tmShowNextTab.setVisibility(View.VISIBLE);\n\t\t}\n\t\t\n\t\tmTopBar.setAlpha(1);\n\t\tmBottomBar.setAlpha(1);\n\t\t\n\t\tAnimatorSet animator = new AnimatorSet();\n\t\tAnimatorSet.Builder b = animator.play(ObjectAnimator.ofFloat(mBottomBar, \"alpha\", 1));\n\t\tb.with(ObjectAnimator.ofFloat(mTopBar, \"alpha\", 1));\n\t\t\n\t\t//mTopBar.setTranslationY(- mTopBar.getHeight());\n\t\tmBottomBar.setTranslationY(mBottomBar.getHeight());\n\t\t\n\t\tb.with(ObjectAnimator.ofFloat(mTopBar, \"translationY\", 0));\n\t\tb.with(ObjectAnimator.ofFloat(mBottomBar, \"translationY\", 0));\t\t\n\t\t\n\t\tif (showPreviousTabButton) {\n\t\t\tb.with(ObjectAnimator.ofFloat(mShowPreviousTab, \"translationX\", 0));\n\t\t}\n\t\t\n\t\tif (showNextTabButton) {\n\t\t\tb.with(ObjectAnimator.ofFloat(mShowNextTab, \"translationX\", mShowNextTab.getWidth(), 0));\n\t\t}\n\t\t\n\t\tanimator.addListener(mShowListener);\n\t\t\n\t\tmAnimator = animator;\n\t\t\n\t\tanimator.start();\n\t\t\n\t\tmToolbarsVisible = true;\n\t}\n\t\n\tpublic void startHideAnimation() {\n\t\tif (mAnimator != null) {\n\t\t\tmAnimator.end();\n\t\t}\n\t\t\n\t\tmTopBar.setAlpha(1);\n\t\tmBottomBar.setAlpha(1);\n\t\t\n\t\tAnimatorSet animator = new AnimatorSet();\n\t\tAnimatorSet.Builder b = animator.play(ObjectAnimator.ofFloat(mBottomBar, \"alpha\", 1));\n\t\tb.with(ObjectAnimator.ofFloat(mBottomBar, \"translationY\", 0, mBottomBar.getHeight()));\n\t\t\n\t\tb.with(ObjectAnimator.ofFloat(mTopBar, \"alpha\", 1));\n\t\tb.with(ObjectAnimator.ofFloat(mTopBar, \"translationY\", 0, - mTopBar.getHeight()));\n\t\t\n\t\tb.with(ObjectAnimator.ofFloat(mShowPreviousTab, \"translationX\", - mShowPreviousTab.getWidth()));\n\t\tb.with(ObjectAnimator.ofFloat(mShowNextTab, \"translationX\", 0, mShowNextTab.getWidth()));\n\t\t\n\t\tanimator.addListener(mHideListener);\n\t\t\n\t\tmAnimator = animator;\n\t\t\n\t\tanimator.start();\n\t\t\n\t\tmToolbarsVisible = false;\n\t}\n\t\n\tpublic boolean isToolbarsVisible() {\n\t\treturn mToolbarsVisible;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/UIFactory.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport org.tint.R;\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.preference.PreferenceManager;\n\npublic class UIFactory {\n\t\n\tpublic enum UIType {\n\t\tTABLET,\n\t\tPHONE,\n\t\tLEGACY_PHONE\n\t}\n\t\n\tprivate static boolean isInitialized = false;\n\t\n\tprivate static UIType sUIType;\n\t\n\tpublic static UIType getUIType(Context context) {\n\t\tcheckInit(context);\n\t\treturn sUIType;\n\t}\n\t\n\tpublic static boolean isTablet(Context context) {\n\t\tcheckInit(context);\n\t\treturn sUIType == UIType.TABLET;\n\t}\n\t\n\tpublic static int getMainLayout(Context context) {\n\t\tcheckInit(context);\n\t\t\n\t\tswitch (sUIType) {\n\t\tcase TABLET:\n\t\t\treturn R.layout.tablet_main_activity;\n\t\t\t\n\t\tcase PHONE:\n\t\t\treturn R.layout.phone_main_activity;\n\t\t\n\t\tcase LEGACY_PHONE:\n\t\t\treturn R.layout.legacy_phone_main_activity;\n\t\t\t\n\t\tdefault:\n\t\t\treturn R.layout.phone_main_activity;\n\t\t}\n\t}\n\t\n\tpublic static int getMainMenuLayout(Context context) {\n\t\tcheckInit(context);\n\t\t\n\t\tswitch (sUIType) {\n\t\tcase TABLET:\n\t\t\treturn R.menu.main_activity_menu_tablet;\n\t\t\t\n\t\tcase PHONE:\n\t\tcase LEGACY_PHONE:\n\t\t\treturn R.menu.main_activity_menu;\n\n\t\tdefault:\n\t\t\treturn R.menu.main_activity_menu;\n\t\t}\n\t}\n\t\n\tpublic static UIManager createUIManager(TintBrowserActivity activity) {\n\t\tcheckInit(activity);\n\t\t\n\t\tswitch (sUIType) {\n\t\tcase TABLET:\n\t\t\treturn new TabletUIManager(activity);\n\n\t\tcase PHONE:\n\t\t\treturn new PhoneUIManager(activity);\n\t\t\t\n\t\tcase LEGACY_PHONE:\n\t\t\treturn new LegacyPhoneUIManager(activity);\n\t\t\t\n\t\tdefault:\n\t\t\treturn new PhoneUIManager(activity);\n\t\t}\n\t}\n\t\n\tprivate static void init(Context context) {\n\t\tString uiTypePref = PreferenceManager.getDefaultSharedPreferences(context).getString(Constants.PREFERENCE_UI_TYPE, \"AUTO\");\n\t\t\n\t\tif (\"AUTO\".equals(uiTypePref)) {\n\t\t\tif (context.getResources().getBoolean(R.bool.isTablet)) {\n\t\t\t\tsUIType = UIType.TABLET;\n\t\t\t} else {\n\t\t\t\tsUIType = UIType.PHONE;\n\t\t\t}\n\t\t} else if (\"TABLET\".equals(uiTypePref)) {\n\t\t\tsUIType = UIType.TABLET;\n\t\t} else if (\"LEGACY_PHONE\".equals(uiTypePref)) {\n\t\t\tsUIType = UIType.LEGACY_PHONE;\n\t\t} else {\n\t\t\tsUIType = UIType.PHONE;\n\t\t}\n\t\t\n\t\tisInitialized = true;\n\t}\n\t\n\tprivate static void checkInit(Context context) {\n\t\tif (!isInitialized) {\n\t\t\tinit(context);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/managers/UIManager.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.managers;\n\nimport java.util.UUID;\n\nimport org.tint.ui.activities.TintBrowserActivity;\nimport org.tint.ui.components.CustomWebView;\nimport org.tint.ui.fragments.BaseWebViewFragment;\n\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.net.Uri;\nimport android.view.ActionMode;\nimport android.view.View;\nimport android.view.View.OnTouchListener;\nimport android.webkit.ValueCallback;\nimport android.webkit.WebView;\nimport android.webkit.GeolocationPermissions.Callback;\nimport android.webkit.WebChromeClient.CustomViewCallback;\n\npublic interface UIManager extends OnTouchListener {\n\t\n\tTintBrowserActivity getMainActivity();\n\t\n\t/**\n\t * Browser management.\t\n\t */\n\tvoid addTab(String url, boolean openInBackground, boolean privateBrowsing);\n\t\n\tvoid addTab(boolean loadHomePage, boolean privateBrowsing);\n\t\n\tvoid closeCurrentTab();\n\t\n\tvoid closeTab(UUID tabId);\n\t\n\tvoid togglePrivateBrowsing();\n\n\tvoid loadUrl(String url);\n\t\n\tvoid loadUrl(UUID tabId, String url, boolean loadInCurrentTabIfNotFound);\n\t\n\tvoid loadRawUrl(UUID tabId, String url, boolean loadInCurrentTabIfNotFound);\n\t\n\tvoid loadUrl(BaseWebViewFragment webViewFragment, String url);\n\t\n\tvoid loadCurrentUrl();\n\t\n\tvoid loadHomePage();\n\t\n\tvoid loadHomePage(UUID tabId, boolean loadInCurrentTabIfNotFound);\n\t\n\tvoid openBookmarksActivityForResult();\n\t\n\tvoid addBookmarkFromCurrentPage();\n\t\n\tvoid shareCurrentPage();\n\t\n\tvoid startSearch();\n\t\n\tvoid clearFormData();\n\t\n\tvoid clearCache();\n\t\n\tvoid setHttpAuthUsernamePassword(String host, String realm, String username, String password);\n\t\n\tCustomWebView getCurrentWebView();\n\t\n\tCustomWebView getWebViewByTabId(UUID tabId);\n\t\n\tBaseWebViewFragment getCurrentWebViewFragment();\n\t\n\tvoid setUploadMessage(ValueCallback<Uri> uploadMsg);\n\t\n\tValueCallback<Uri> getUploadMessage();\n\t\n\tvoid onNewIntent(Intent intent);\n\t\n\tboolean isFullScreen();\n\t\n\tvoid toggleFullScreen();\n\t\n\tvoid saveTabs();\n\t\t\n\t/**\n\t * Events.\n\t */\t\n\tboolean onKeyBack();\n\t\n\tboolean onKeySearch();\n\t\n\tvoid onActivityResult(int requestCode, int resultCode, Intent intent);\n\t\n\tvoid onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);\n\t\n\tvoid onMenuVisibilityChanged(boolean isVisible);\n\t\n\tvoid onPageStarted(WebView view, String url, Bitmap favicon);\n\t\n\tvoid onPageFinished(WebView view, String url);\n\t\n\tvoid onClientPageFinished(CustomWebView view, String url);\n\t\n\tvoid onProgressChanged(WebView view, int newProgress);\n\t\n\tvoid onReceivedTitle(WebView view, String title);\n\t\n\tvoid onReceivedIcon(WebView view, Bitmap icon);\n\t\n\tvoid onMainActivityPause();\n\t\n\tvoid onMainActivityResume();\n\t\n\tvoid onShowStartPage();\n\t\n\tvoid onHideStartPage();\n\t\n\tvoid onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback);\n\t\n\tvoid onHideCustomView();\n\t\n\tvoid onGeolocationPermissionsShowPrompt(String origin, Callback callback);\n\t\n\tvoid onGeolocationPermissionsHidePrompt();\n\t\n\tvoid onActionModeStarted(ActionMode mode);\n\t\n\tvoid onActionModeFinished(ActionMode mode);\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/AboutFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\n\nimport android.os.Bundle;\nimport android.preference.PreferenceFragment;\n\npublic class AboutFragment extends PreferenceFragment {\n\t\n\t@Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        \n        addPreferencesFromResource(R.xml.preferences_about);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/AboutPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\n\nimport android.content.Context;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.preference.Preference;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\npublic class AboutPreference extends Preference {\n\n\tpublic AboutPreference(Context context) {\n\t\tsuper(context);\n\t\tinit();\n\t}\n\t\n\tpublic AboutPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tinit();\n\t}\n\t\n\tpublic AboutPreference(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\tinit();\n\t}\n\t\n\tprivate void init() {\n\t\tsetLayoutResource(R.layout.about_preference);\n\t}\n\t\n\t@Override\n    protected View onCreateView(ViewGroup parent) {\n        View root = super.onCreateView(parent);\n        \n        TextView version = (TextView) root.findViewById(R.id.AboutVersionText);\n        version.setText(getVersion());\n        \n        return root;\n\t}\n\t\n\t/**\n\t * Get the current package version.\n\t * @return The current version.\n\t */\n\tprivate String getVersion() {\n\t\tString result = \"\";\t\t\n\t\ttry {\n\n\t\t\tPackageManager manager = getContext().getPackageManager();\n\t\t\tPackageInfo info = manager.getPackageInfo(getContext().getPackageName(), 0);\n\n\t\t\tresult = String.format(getContext().getString(R.string.AboutVersionText), info.versionName, info.versionCode);\n\n\t\t} catch (NameNotFoundException e) {\n\t\t\tLog.w(AboutPreference.class.toString(), \"Unable to get application version: \" + e.getMessage());\n\t\t\tresult = \"Unable to get application version.\";\n\t\t}\n\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/AccessibilityPreferencesFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.utils.Constants;\n\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.os.Bundle;\nimport android.preference.Preference;\nimport android.preference.PreferenceFragment;\n\npublic class AccessibilityPreferencesFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {\n\t\n\tprivate Preference mInvertedContrast;\n\t\n\t@Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        addPreferencesFromResource(R.xml.preferences_accessibility_settings);\n        \n        mInvertedContrast = findPreference(Constants.PREFERENCE_INVERTED_DISPLAY_CONTRAST);\n        \n        updateInvertedContrastEnabledState();\n        \n        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tgetPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);\n\t\tsuper.onDestroy();\n\t}\n\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\tif (Constants.PREFERENCE_INVERTED_DISPLAY.equals(key)) {\n\t\t\tupdateInvertedContrastEnabledState();\n\t\t}\n\t}\n\t\n\tprivate void updateInvertedContrastEnabledState() {\n\t\tboolean useInvertedDisplay = getPreferenceManager().getSharedPreferences().getBoolean(Constants.PREFERENCE_INVERTED_DISPLAY, false);\n        mInvertedContrast.setEnabled(useInvertedDisplay);\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/AccessibilityPreviewPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.preference.Preference;\nimport android.preference.PreferenceManager;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.widget.TextView;\n\npublic class AccessibilityPreviewPreference extends Preference implements OnSharedPreferenceChangeListener {\n\t\n\tprivate static final String HTML_FORMAT = \"<!DOCTYPE html><html><head><meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\"><style type=\\\"text/css\\\">p { margin: 2px auto;}</style><body><p style=\\\"font-size: 4pt\\\">%s</p><p style=\\\"font-size: 8pt\\\">%s</p><p style=\\\"font-size: 10pt\\\">%s</p><p style=\\\"font-size: 14pt\\\">%s</p><p style=\\\"font-size: 18pt\\\">%s</p></body></html>\";\n\n\tprivate WebView mWebView;\n\n\tprivate String mHtml;\n\t\n\tpublic AccessibilityPreviewPreference(Context context) {\n\t\tsuper(context);\n\t\tinit();\n\t}\n\t\n\tpublic AccessibilityPreviewPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tinit();\n\t}\n\t\n\tpublic AccessibilityPreviewPreference(Context context, AttributeSet attrs,\tint defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\tinit();\n\t}\n\t\n\tprivate void init() {\n\t\tsetLayoutResource(R.layout.accessibility_preview);\n\t\t\n\t\tObject[] visualNames = getContext().getResources().getStringArray(R.array.FontPreviewText);\n\t\t\n        mHtml = String.format(HTML_FORMAT, visualNames);\n\t}\n\t\n\t@Override\n    protected View onCreateView(ViewGroup parent) {\n        View root = super.onCreateView(parent);\n        \n        TextView title = (TextView) root.findViewById(R.id.AccessibilityPreviewTitle);\n        title.setText(getTitle());\n        \n        TextView summary = (TextView) root.findViewById(R.id.AccessibilityPreviewSummary);\n        if (!TextUtils.isEmpty(getSummary())) {\n        \tsummary.setText(getSummary());\n        } else {\n        \tsummary.setVisibility(View.GONE);\n        }\n        \n        WebView wv = (WebView) root.findViewById(R.id.AccessibilityPreviewWebView);\n        wv.setFocusable(false);\n        wv.setFocusableInTouchMode(false);\n        wv.setClickable(false);\n        wv.setLongClickable(false);\n        wv.setHorizontalScrollBarEnabled(false);\n        wv.setVerticalScrollBarEnabled(false);\n        //wv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);\n        \n        return root;\n\t}\n\t\n\t@Override\n    protected void onBindView(View view) {\n\t\tsuper.onBindView(view);\n\t\tmWebView = (WebView) view.findViewById(R.id.AccessibilityPreviewWebView);\n\t\tupdatePreview();\n\t}\t\n\n\t@Override\n    protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {\n        super.onAttachedToHierarchy(preferenceManager);\n        getSharedPreferences().registerOnSharedPreferenceChangeListener(this);\n    }\n\n    @Override\n    protected void onPrepareForRemoval() {\n        getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);\n        super.onPrepareForRemoval();\n    }\n\t\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\tif (Constants.PREFERENCE_MINIMUM_FONT_SIZE.equals(key) ||\n\t\t\t\tConstants.PREFERENCE_TEXT_SCALING.equals(key) ||\n\t\t\t\tConstants.PREFERENCE_INVERTED_DISPLAY.equals(key)) {\n\t\t\tupdatePreview();\n\t\t}\n\t}\n\t\n\tprivate void updatePreview() {\n        if (mWebView == null) return;\n\n        WebSettings ws = mWebView.getSettings();\n\n        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());\n        \n        int fontSize = prefs.getInt(Constants.PREFERENCE_MINIMUM_FONT_SIZE, 1);\n        int textScaling = prefs.getInt(Constants.PREFERENCE_TEXT_SCALING, 100);\n        \t\t\n        ws.setMinimumFontSize(fontSize);\n        ws.setTextZoom(textScaling);\n        \n        mWebView.loadData(mHtml, \"text/html; charset=utf-8\", \"utf-8\");\n    }\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/AddonDetailsFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport java.util.List;\n\nimport org.tint.R;\nimport org.tint.addons.Addon;\nimport org.tint.controllers.Controller;\nimport org.tint.ui.managers.UIFactory;\n\nimport android.app.Fragment;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.content.pm.ResolveInfo;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.CompoundButton;\nimport android.widget.CompoundButton.OnCheckedChangeListener;\nimport android.widget.Switch;\nimport android.widget.TextView;\n\npublic class AddonDetailsFragment extends Fragment {\n\t\n\tpublic static final String EXTRA_ADDON_ID = \"EXTRA_ADDON_ID\";\n\t\n\tprivate View mContainer = null;\n\t\n\tprivate Addon mAddon;\n\t\n\tprivate TextView mName;\n\tprivate TextView mShortDesc;\n\tprivate TextView mLongDesc;\n\tprivate TextView mContact;\n\t\n\tprivate Switch mEnabled;\n\tprivate Button mPreferences;\n\t\n\tprivate TextView mCallbacks;\n\tprivate TextView mPermissions;\n\t\n\t@Override\n\tpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tif (mContainer == null) {\n\t\t\tmContainer = inflater.inflate(R.layout.addon_details_fragment, container, false);\n\t\t\t\n\t\t\tmName = (TextView) mContainer.findViewById(R.id.AddonName);\n\t\t\tmShortDesc = (TextView) mContainer.findViewById(R.id.AddonShortDesc);\n\t\t\tmLongDesc = (TextView) mContainer.findViewById(R.id.AddonLongDesc);\n\t\t\tmContact = (TextView) mContainer.findViewById(R.id.AddonContact);\n\t\t\t\n\t\t\tmEnabled = (Switch) mContainer.findViewById(R.id.AddonEnabled);\n\t\t\tmPreferences = (Button) mContainer.findViewById(R.id.AddonPreferences);\n\t\t\t\n\t\t\tmEnabled.setOnCheckedChangeListener(new OnCheckedChangeListener() {\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n\t\t\t\t\tmAddon.setEnabled(isChecked);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tmPreferences.setOnClickListener(new OnClickListener() {\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(View v) {\n\t\t\t\t\tmAddon.showAddonSettingsActivity();\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tmCallbacks = (TextView) mContainer.findViewById(R.id.AddonCallbacks);\n\t\t\tmPermissions = (TextView) mContainer.findViewById(R.id.AddonPermissions);\n\t\t}\n\t\t\n\t\tBundle args = getArguments();\n\t\tif (args != null) {\n\t\t\tmAddon = Controller.getInstance().getAddonManager().getAddons().get(args.getInt(EXTRA_ADDON_ID));\n\t\t\t\n\t\t\tmName.setText(mAddon.getName());\n\t\t\tmShortDesc.setText(mAddon.getShortDescription());\n\t\t\tmLongDesc.setText(mAddon.getDescription());\n\t\t\tmContact.setText(String.format(getString(R.string.AddonDetailsContact), mAddon.getContact()));\n\t\t\t\n\t\t\tmEnabled.setChecked(mAddon.isEnabled());\n\t\t\tmPreferences.setEnabled(mAddon.hasSettingsPage());\n\t\t\t\n\t\t\tfillCallbacksDetails();\n\t\t\tfillPackagePermissions();\t\t\t\n\t\t\t\n\t\t\tif (!UIFactory.isTablet(getActivity())) {\n        \t\t// The current addon name is currently shown in tablet-type preferences activity / fragments.\n        \t\tgetActivity().setTitle(mAddon.getName());\n        \t}\n\t\t}\n\t\t\n\t\treturn mContainer;\n\t}\n\n\tprivate void fillCallbacksDetails() {\n\t\tList<String> callbacks = mAddon.getUserReadbleCallbacks();\n\t\t\n\t\tStringBuilder sb = new StringBuilder();\n\t\t\n\t\tfor (String callback : callbacks) {\n\t\t\tif (sb.length() > 0) {\n\t\t\t\tsb.append('\\n');\n\t\t\t}\n\t\t\t\n\t\t\tsb.append(\"• \" + callback);\n\t\t}\n\t\t\n\t\tmCallbacks.setText(sb.toString());\n\t}\n\t\n\tprivate void fillPackagePermissions() {\n\t\tResolveInfo info = mAddon.getResolveInfo();\n\t\t\n\t\tStringBuilder sb = new StringBuilder();\n\t\t\n\t\tif ((info != null) &&\n\t\t\t\t(info.serviceInfo != null) &&\n\t\t\t\t(info.serviceInfo.packageName != null)) {\n\t\t\ttry {\n\t\t\t\tPackageInfo packageInfo = getActivity().getPackageManager().getPackageInfo(info.serviceInfo.packageName, PackageManager.GET_PERMISSIONS);\n\t\t\t\tString[] permissions = packageInfo.requestedPermissions;\n\t\t\t\t\n\t\t\t\tif ((permissions != null) &&\n\t\t\t\t\t\t(permissions.length > 0)) {\n\t\t\t\t\tfor (int i = 0; i < permissions.length; i++) {\n\t\t\t\t\t\tif (sb.length() > 0) {\n\t\t\t\t\t\t\tsb.append('\\n');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsb.append(\"• \" + permissions[i]);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsb.append(getString(R.string.AddonDetailsPermissionsNone));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmPermissions.setText(sb.toString());\n\t\t\t\t\n\t\t\t} catch (NameNotFoundException e) {\n\t\t\t\tsb.append(getString(R.string.AddonDetailsUnableToGetPermissions));\n\t\t\t}\n\t\t} else {\n\t\t\tsb.append(getString(R.string.AddonDetailsUnableToGetPermissions));\n\t\t}\n\t\t\n\t\tmPermissions.setText(sb.toString());\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/AddonsFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport java.util.List;\n\nimport org.tint.R;\nimport org.tint.addons.Addon;\nimport org.tint.controllers.Controller;\nimport org.tint.utils.ApplicationUtils;\n\nimport android.app.Fragment;\nimport android.content.ActivityNotFoundException;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.preference.PreferenceActivity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.ArrayAdapter;\nimport android.widget.CompoundButton;\nimport android.widget.CompoundButton.OnCheckedChangeListener;\nimport android.widget.Button;\nimport android.widget.ListView;\nimport android.widget.Switch;\nimport android.widget.TextView;\n\npublic class AddonsFragment extends Fragment {\n\t\n\tprivate ListView mListView;\n\t\n\tprivate Button mDisableAll;\n\tprivate Button mEnableAll;\n\t\n\tprivate List<Addon> mAddons;\n\t\n\tprivate AddonsAdapter mAdapter;\n\t\n\t@Override\n\tpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tView v = inflater.inflate(R.layout.addons_fragment, container, false);\n\t\t\n\t\tTextView getAddonsTextView = (TextView) v.findViewById(R.id.AddonsGetAddons);\n\t\tgetAddonsTextView.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\ttry {\n\t\t\t\t\tIntent i = new Intent(Intent.ACTION_VIEW, Uri.parse(\"market://search?q=Tint Addon\"));\n\t\t\t\t\tstartActivity(i);\n\t\t\t\t} catch (ActivityNotFoundException e) {\n\t\t\t\t\tApplicationUtils.showMessageDialog(\n\t\t\t\t\t\t\tgetActivity(),\n\t\t\t\t\t\t\tgetString(R.string.AddonsMarketNotFoundTitle),\n\t\t\t\t\t\t\tgetString(R.string.AddonsMarketNotFoundMessage));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tmListView = (ListView) v.findViewById(R.id.AddonsList);\n\t\tmListView.setOnItemClickListener(new OnItemClickListener() {\n\n\t\t\t@Override\n\t\t\tpublic void onItemClick(AdapterView<?> arg0, View v, int position, long id) {\n\t\t\t\tBundle args = new Bundle();\n\t\t\t\targs.putInt(AddonDetailsFragment.EXTRA_ADDON_ID, position);\n\t\t\t\t\n\t\t\t\tPreferenceActivity activity = (PreferenceActivity) getActivity();\n\t\t\t\tactivity.startPreferencePanel(AddonDetailsFragment.class.getName(), args, 0, mAddons.get(position).getName(), AddonsFragment.this, 0);\n\t\t\t}\n\t\t});\n\t\t\n\t\tmDisableAll = (Button) v.findViewById(R.id.AddonsDisableAll);\n\t\tmDisableAll.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\tfor (Addon addon : mAddons) {\n\t\t\t\t\taddon.setEnabled(false);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmAdapter.notifyDataSetChanged();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmEnableAll = (Button) v.findViewById(R.id.AddonsEnableAll);\n\t\tmEnableAll.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View arg0) {\n\t\t\t\tfor (Addon addon : mAddons) {\n\t\t\t\t\taddon.setEnabled(true);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmAdapter.notifyDataSetChanged();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn v;\n\t}\n\t\n\t@Override\n\tpublic void onActivityCreated(Bundle savedInstanceState) {\n\t\tsuper.onActivityCreated(savedInstanceState);\n\t\n\t\tif (Controller.getInstance().getAddonManager() != null) {\n\t\t\tmAddons = Controller.getInstance().getAddonManager().getAddons();\n\t\t} else {\n\t\t\tmAddons = null;\n\t\t}\n\t\t\t\t\t\t\n\t\tmAdapter = new AddonsAdapter(getActivity());\n\t\tmListView.setAdapter(mAdapter);\n\t}\n\t\n\t@Override\n\tpublic void onActivityResult(int requestCode, int resultCode, Intent data) {\n\t\tsuper.onActivityResult(requestCode, resultCode, data);\n\t\tmAdapter.notifyDataSetChanged();\n\t}\n\n\n\n\tprivate class AddonsAdapter extends ArrayAdapter<Addon> {\n\t\t\n\t\tprivate LayoutInflater mInflater;\n\t\t\n\t\tpublic AddonsAdapter(Context context) {\n\t\t\tsuper(context, 0, 0, mAddons);\n\t\t\t\n\t\t\tmInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\t}\n\t\t\n\t\t@Override\n        public View getView(int position, View convertView, ViewGroup parent) {\n\t\t\tView view;\n\t\t\t\n\t\t\tif (convertView == null) {\n                view = mInflater.inflate(R.layout.addon_row, parent, false);\n            } else {\n                view = convertView;\n            }\n\t\t\t\n\t\t\tfinal Addon addon = mAddons.get(position);\n\t\t\t\n\t\t\tTextView title = (TextView) view.findViewById(R.id.AddonName);\n\t\t\ttitle.setText(addon.getName());\n\t\t\t\n\t\t\tTextView desc = (TextView) view.findViewById(R.id.AddonShortDesc);\n\t\t\tdesc.setText(addon.getShortDescription());\n\t\t\t\n\t\t\tSwitch enabled = (Switch) view.findViewById(R.id.AddonEnabled);\n\t\t\tenabled.setChecked(addon.isEnabled());\n\t\t\t\n\t\t\tenabled.setOnCheckedChangeListener(new OnCheckedChangeListener() {\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n\t\t\t\t\taddon.setEnabled(isChecked);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\treturn view;\n\t\t}\n\n\t\t@Override\n\t\tpublic int getCount() {\n\t\t\treturn mAddons.size();\n\t\t}\n\t\t\n\t}\t\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/BaseSpinnerPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport android.content.Context;\nimport android.content.SharedPreferences.Editor;\nimport android.preference.DialogPreference;\nimport android.preference.PreferenceManager;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.OnItemSelectedListener;\nimport android.widget.ArrayAdapter;\nimport android.widget.EditText;\nimport android.widget.Spinner;\n\npublic abstract class BaseSpinnerPreference extends DialogPreference {\n\t\n\tprivate Context mContext;\n\tprivate View mContainer;\n\t\n\tprotected Spinner mSpinner;\n\tprotected EditText mEditText;\n\n\tpublic BaseSpinnerPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tmContext = context;\n\t}\n\n\t@Override\n\tprotected View onCreateDialogView() {\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\tmContainer = inflater.inflate(R.layout.spinner_preference, null);\n\t\t\n\t\treturn mContainer;\n\t}\n\n\t@Override\n\tprotected void onBindDialogView(View view) {\n\t\tsuper.onBindDialogView(view);\n\t\t\n\t\tmSpinner = (Spinner) mContainer.findViewById(R.id.SpinnerPreferenceSpinner);\n\t\tmEditText = (EditText) mContainer.findViewById(R.id.SpinnerPreferenceEdit);\n\t\t\n\t\tArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getContext(), getTitleArray(), android.R.layout.simple_spinner_item);\n\t\tadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n\t\t\n\t\tmSpinner.setAdapter(adapter);\n\t\t\n\t\tsetEditInputType();\n\t\tsetSpinnerValueFromPreferences();\n\t\t\n\t\tmSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {\n\t\t\t@Override\n\t\t\tpublic void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {\n\t\t\t\tonSpinnerItemSelected(position);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void onNothingSelected(AdapterView<?> arg0) { }\n\t\t});\n\t}\n\t\n\t@Override\n\tprotected void onDialogClosed(boolean positiveResult) {\n\t\tsuper.onDialogClosed(positiveResult);\n\t\t\n\t\tif (positiveResult) {\n\t\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit();\n\t    \teditor.putString(getKey(), mEditText.getText().toString());\n\t    \teditor.commit();\n\t\t}\n\t}\n\t\n\tprotected void showKeyboard() {\n\t\tInputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\tmgr.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT);\n\t}\n\t\n\tprotected void hideKeyboard() {\n\t\tInputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\tmgr.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);\n\t}\n\n\tprotected abstract int getTitleArray();\n\t\n\tprotected abstract void setEditInputType();\n\t\n\tprotected abstract void setSpinnerValueFromPreferences();\n\t\n\tprotected abstract void onSpinnerItemSelected(int position); \n\t\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/BrowserPreferencesFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\n\nimport android.os.Bundle;\nimport android.preference.PreferenceFragment;\n\npublic class BrowserPreferencesFragment extends PreferenceFragment {\n\t\n\t@Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        addPreferencesFromResource(R.xml.preferences_browser_settings);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/ClearPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.controllers.Controller;\nimport org.tint.providers.BookmarksWrapper;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.preference.DialogPreference;\nimport android.util.AttributeSet;\nimport android.webkit.CookieManager;\nimport android.webkit.GeolocationPermissions;\nimport android.webkit.WebViewDatabase;\n\npublic class ClearPreference extends DialogPreference {\n\n\tpublic ClearPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\t\n\t\tString key = getKey();\n\t\tif (key.equals(Constants.PREFERENCE_CLEAR_COOKIES)) {\n\t\t\tsetEnabled(CookieManager.getInstance().hasCookies());\n\t\t} else if (key.equals(Constants.PREFERENCE_CLEAR_FORM_DATA)) {\n\t\t\tsetEnabled(WebViewDatabase.getInstance(getContext()).hasFormData());\n\t\t} else if (key.equals(Constants.PREFERENCE_CLEAR_PASSWORDS)) {\n\t\t\tWebViewDatabase db = WebViewDatabase.getInstance(getContext());\t\t\t\n\t\t\tsetEnabled(db.hasUsernamePassword() || db.hasHttpAuthUsernamePassword());\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onDialogClosed(boolean positiveResult) {\n\t\tsuper.onDialogClosed(positiveResult);\n\t\t\t\t\t\t\n\t\tif (positiveResult) {\n\t\t\tString key = getKey();\n\t\t\t\n\t\t\tsetEnabled(false);\n\t\t\t\n\t\t\tif (key.equals(Constants.PREFERENCE_CLEAR_CACHE)) {\n\t\t\t\tController.getInstance().getUIManager().clearCache();\n\t\t\t} if (key.equals(Constants.PREFERENCE_CLEAR_HISTORY)) {\n\t\t\t\tBookmarksWrapper.clearHistoryAndOrBookmarks(Controller.getInstance().getMainActivity().getContentResolver(), true, false);\n\t\t\t} else if (key.equals(Constants.PREFERENCE_CLEAR_COOKIES)) {\n\t\t\t\tCookieManager.getInstance().removeAllCookie();\n\t\t\t} else if (Constants.PREFERENCE_CLEAR_GEOLOCATION.equals(key)) {\n\t\t\t\tGeolocationPermissions.getInstance().clearAll();\n\t\t\t} else if (key.equals(Constants.PREFERENCE_CLEAR_FORM_DATA)) {\n\t\t\t\tController.getInstance().getUIManager().clearFormData();\n\t\t\t} else if (key.equals(Constants.PREFERENCE_CLEAR_PASSWORDS)) {\n\t\t\t\tWebViewDatabase db = WebViewDatabase.getInstance(getContext());\n\t\t        db.clearUsernamePassword();\n\t\t        db.clearHttpAuthUsernamePassword();\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/GeneralPreferencesFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.ui.managers.UIFactory;\nimport org.tint.utils.ApplicationUtils;\nimport org.tint.utils.Constants;\n\nimport android.app.Activity;\nimport android.app.AlarmManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.os.Bundle;\nimport android.preference.PreferenceCategory;\nimport android.preference.PreferenceFragment;\nimport android.preference.PreferenceManager;\n\npublic class GeneralPreferencesFragment extends PreferenceFragment {\n\t\n\tprivate OnSharedPreferenceChangeListener mListener;\n\t\n\t@Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        addPreferencesFromResource(R.xml.preferences_general_settings);\n        \n        PreferenceCategory oldPhoneUIcategory = (PreferenceCategory) findPreference(\"PREFERENCE_CATEGORY_OLD_PHONE_UI\");\n        PreferenceCategory newPhoneUIcategory = (PreferenceCategory) findPreference(\"PREFERENCE_CATEGORY_NEW_PHONE_UI\");\n        PreferenceCategory tabletUIcategory = (PreferenceCategory) findPreference(\"PREFERENCE_CATEGORY_TABLET_UI\");\n        \n        switch (UIFactory.getUIType(getActivity())) {\n        case PHONE:\n        \tgetPreferenceScreen().removePreference(oldPhoneUIcategory);\n        \tgetPreferenceScreen().removePreference(tabletUIcategory);\n        \tbreak;\n        \n        case LEGACY_PHONE:\n        \tgetPreferenceScreen().removePreference(newPhoneUIcategory);\n        \tgetPreferenceScreen().removePreference(tabletUIcategory);\n        \tbreak;\n        \n        case TABLET:\n        \tgetPreferenceScreen().removePreference(newPhoneUIcategory);\n        \tgetPreferenceScreen().removePreference(oldPhoneUIcategory);\n        \tbreak;\n        }\n        \n        mListener = new OnSharedPreferenceChangeListener() {\n\n\t\t\t@Override\n\t\t\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n\t\t\t\tif (Constants.PREFERENCE_UI_TYPE.equals(key)) {\n\t\t\t\t\taskForRestart();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\t\t\t\n\t\t};\n\t\t\n\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(mListener);\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tPreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(mListener);\n\t\tsuper.onDestroy();\n\t}\n\t\n\tprivate void askForRestart() {\n\t\tApplicationUtils.showYesNoDialog(getActivity(),\n\t\t\t\tandroid.R.drawable.ic_dialog_alert,\n\t\t\t\tR.string.RestartDialogTitle,\n\t\t\t\tR.string.RestartDialogMessage,\n\t\t\t\tnew DialogInterface.OnClickListener() {\n\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\tActivity activity = getActivity();\n\t\t\t\t\n\t\t\t\tPendingIntent intent = PendingIntent.getActivity(activity.getBaseContext(), 0, new Intent(activity.getIntent()), activity.getIntent().getFlags());\n\t\t\t\tAlarmManager mgr = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);\n\t\t\t\tmgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, intent);\n\t\t\t\tSystem.exit(2);\n\t\t\t}\n\t\t});\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/HomepageSpinnerPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.content.SharedPreferences.Editor;\nimport android.preference.PreferenceManager;\nimport android.text.InputType;\nimport android.util.AttributeSet;\n\npublic class HomepageSpinnerPreference extends BaseSpinnerPreference {\n\n\tpublic HomepageSpinnerPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t}\n\n\t@Override\n\tprotected int getTitleArray() {\t\t\n\t\treturn R.array.HomepageTitles;\n\t}\n\t\n\t@Override\n\tprotected void setEditInputType() {\n\t\tmEditText.setInputType(InputType.TYPE_TEXT_VARIATION_URI);\n\t}\n\t\n\t@Override\n\tprotected void setSpinnerValueFromPreferences() {\n\t\tString currentHomepage = PreferenceManager.getDefaultSharedPreferences(getContext()).getString(Constants.PREFERENCE_HOME_PAGE, Constants.URL_ABOUT_START);\n\t\n\t\tif (currentHomepage.equals(Constants.URL_ABOUT_START)) {\n\t\t\tmSpinner.setSelection(0);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tmEditText.setText(Constants.URL_ABOUT_START);\n\t\t} else if (currentHomepage.equals(Constants.URL_ABOUT_BLANK)) {\n\t\t\tmSpinner.setSelection(1);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tmEditText.setText(Constants.URL_ABOUT_BLANK);\n\t\t} else {\n\t\t\tmSpinner.setSelection(2);\n\t\t\tmEditText.setEnabled(true);\n\t\t\tmEditText.setText(currentHomepage);\t\t\t\t\t\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected void onSpinnerItemSelected(int position) {\n\t\tswitch(position) {\n\t\tcase 0:\n\t\t\tmEditText.setText(Constants.URL_ABOUT_START);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tmEditText.setText(Constants.URL_ABOUT_BLANK);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tmEditText.setEnabled(true);\n\t\t\t\n\t\t\tif ((mEditText.getText().toString().equals(Constants.URL_ABOUT_START)) ||\n\t\t\t\t\t(mEditText.getText().toString().equals(Constants.URL_ABOUT_BLANK))) {\t\t\t\t\t\n\t\t\t\tmEditText.setText(null);\n\t\t\t}\n\t\t\t\n\t\t\tmEditText.selectAll();\n\t\t\tshowKeyboard();\n\t\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tmEditText.setText(Constants.URL_ABOUT_START);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onDialogClosed(boolean positiveResult) {\n\t\tsuper.onDialogClosed(positiveResult);\n\t\t\n\t\tif (positiveResult) {\n\t\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit();\n\t\t\t\n\t\t\tswitch (mSpinner.getSelectedItemPosition()) {\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\t\teditor.putBoolean(Constants.TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED, false);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\teditor.putBoolean(Constants.TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED, true);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\teditor.putBoolean(Constants.TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED, false);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\teditor.commit();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/IHistoryBookmaksExportListener.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\npublic interface IHistoryBookmaksExportListener {\n\t\n\tvoid onExportProgress(int step, int progress, int total);\n\t\n\tvoid onExportDone(String message);\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/IHistoryBookmaksImportListener.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\npublic interface IHistoryBookmaksImportListener {\n\t\n\tvoid onImportProgress(int step, int progress, int total);\n\t\n\tvoid onImportDone(String message);\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/PreferencesActivity.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport java.util.List;\n\nimport org.tint.R;\n\nimport android.annotation.SuppressLint;\nimport android.app.ActionBar;\nimport android.os.Bundle;\nimport android.preference.PreferenceActivity;\nimport android.view.MenuItem;\n\npublic class PreferencesActivity extends PreferenceActivity {\n\t\n\t@Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        \n        ActionBar actionBar = getActionBar();\n        actionBar.setHomeButtonEnabled(true);\n        actionBar.setDisplayHomeAsUpEnabled(true);\n\t}\n\t\n\t@Override\n    public void onBuildHeaders(List<Header> target) {\n\t\tloadHeadersFromResource(R.xml.preferences_headers, target);\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\tcase android.R.id.home:\n\t\t\tsetResult(RESULT_CANCELED);\n            finish();\n\t\t\treturn true;\n\t\tdefault: return super.onContextItemSelected(item);\n\t\t}\n\t}\n\t\n\t@SuppressLint(\"Override\")\n\tprotected boolean isValidFragment(String fragmentName) {\n\t\treturn true;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/PrivacyPreferencesFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.utils.Constants;\n\nimport android.os.Bundle;\nimport android.preference.PreferenceFragment;\nimport android.preference.PreferenceScreen;\n\npublic class PrivacyPreferencesFragment extends PreferenceFragment {\n\t\n\t@Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        addPreferencesFromResource(R.xml.preferences_privacy_settings);\n        \n        PreferenceScreen websiteSettings = (PreferenceScreen) findPreference(Constants.PREFERENCE_WEBSITES_SETTINGS);\n        websiteSettings.setFragment(WebsitesSettingsFragment.class.getName());\n        \n        PreferenceScreen sslExceptionsSettings = (PreferenceScreen) findPreference(Constants.PREFERENCE_SSL_EXCEPTIONS);\n        sslExceptionsSettings.setFragment(SslExceptionsFragment.class.getName());\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/SearchEnginePreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicReference;\n\nimport org.tint.R;\nimport org.tint.model.SearchUrlAdapter;\nimport org.tint.model.SearchUrlGroup;\nimport org.tint.model.SearchUrlItem;\nimport org.tint.tasks.SearchUrlTask;\nimport org.tint.tasks.SearchUrlTask.ISearchUrlTaskListener;\nimport org.tint.utils.Constants;\nimport org.tint.utils.UrlUtils;\n\nimport android.content.Context;\nimport android.content.SharedPreferences.Editor;\nimport android.os.AsyncTask;\nimport android.preference.DialogPreference;\nimport android.preference.PreferenceManager;\nimport android.text.Editable;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.EditText;\nimport android.widget.ExpandableListView;\nimport android.widget.ExpandableListView.OnChildClickListener;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\npublic class SearchEnginePreference extends DialogPreference implements ISearchUrlTaskListener {\n\t\n\tprivate TextView mText2;\n\tprivate TextView mCurrentEngine;\n\tprivate TextView mCustomEngineText;\n\tprivate EditText mCustomEngineEditText;\n\tprivate ImageView mDivider1;\n\tprivate ImageView mDivider2;\n\tprivate ExpandableListView mList;\n\tprivate ProgressBar mProgress;\n\tprivate TextView mProgressText;\n\t\n\tprivate TextWatcher mTextWatcher;\n\t\n\tprivate SearchUrlTask mTask;\n\t\n\tprivate SearchUrlAdapter mAdapter;\n\t\n\tprivate static final AtomicReference<AsyncTask<Void, Integer, String>> mSearchUrlSyncThread =\n\t\t      new AtomicReference<AsyncTask<Void, Integer, String>>();\n\t\n\tpublic SearchEnginePreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t}\n\t\n\t@Override\n\tprotected View onCreateDialogView() {\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\treturn inflater.inflate(R.layout.search_engine_preference, null);\n\t}\n\t\n\t@Override\n\tprotected void onBindDialogView(View view) {\n\t\tsuper.onBindDialogView(view);\n\t\t\n\t\tmText2 = (TextView) view.findViewById(R.id.SearchUrlText2);\n\t\tmCurrentEngine = (TextView) view.findViewById(R.id.CurrentSearchEngine);\n\t\tmCustomEngineText = (TextView) view.findViewById(R.id.SearchUrlManualEdit);\n\t\tmCustomEngineEditText = (EditText) view.findViewById(R.id.SearchUrlEditText);\n\t\tmDivider1 = (ImageView) view.findViewById(R.id.divider1);\n\t\tmDivider2 = (ImageView) view.findViewById(R.id.divider2);\n\t\tmList = (ExpandableListView) view.findViewById(R.id.SearchUrlList);\n\t\tmProgress = (ProgressBar) view.findViewById(R.id.SearchUrlProgressBar);\n\t\tmProgressText = (TextView) view.findViewById(R.id.SearchUrlProgressText);\n\t\t\n\t\tmCustomEngineText.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tmText2.setVisibility(View.GONE);\n\t\t\t\tmCustomEngineText.setVisibility(View.GONE);\n\t\t\t\tmDivider1.setVisibility(View.GONE);\n\t\t\t\tmDivider2.setVisibility(View.GONE);\n\t\t\t\tmList.setVisibility(View.GONE);\n\t\t\t\tmProgress.setVisibility(View.GONE);\n\t\t\t\tmProgressText.setVisibility(View.GONE);\n\t\t\t\t\n\t\t\t\tmCustomEngineEditText.setVisibility(View.VISIBLE);\n\t\t\t\tmCustomEngineEditText.requestFocus();\n\t\t\t\tshowKeyboard();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmList.setOnChildClickListener(new OnChildClickListener() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {\n\t\t\t\t\n\t\t\t\tif (mAdapter != null) {\n\t\t\t\t\tmCustomEngineEditText.removeTextChangedListener(mTextWatcher);\n\t\t\t\t\t\n\t\t\t\t\tSearchUrlItem item = (SearchUrlItem) mAdapter.getChild(groupPosition, childPosition);\n\t\t\t\t\t\n\t\t\t\t\tmCurrentEngine.setText(item.getName());\n\t\t\t\t\tmCustomEngineEditText.setText(item.getUrl());\n\t\t\t\t\t\n\t\t\t\t\tremoveEditTextFocus();\n\t\t\t\t\t\n\t\t\t\t\tmCustomEngineEditText.addTextChangedListener(mTextWatcher);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t\t\n\t\tmTextWatcher = new TextWatcher() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {\n\t\t\t\tmCurrentEngine.setText(getContext().getString(R.string.SearchUrlCustom));\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void beforeTextChanged(CharSequence s, int start, int count,\tint after) { }\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void afterTextChanged(Editable s) { }\n\t\t};\n\t\t\n\t\tmCurrentEngine.setText(getCurrentSearchEngineName());\n\t\tmCustomEngineEditText.setText(UrlUtils.getRawSearchUrl(getContext()));\n\t\t\n\t\tmCustomEngineEditText.setVisibility(View.GONE);\n\t\tmCustomEngineEditText.addTextChangedListener(mTextWatcher);\n\t\t\n\t\tstartGetSearchUrlOnline();\n\t}\n\t\n\t@Override\n\tprotected void onDialogClosed(boolean positiveResult) {\n\t\tsuper.onDialogClosed(positiveResult);\n\t\t\n\t\tif (positiveResult) {\n\t\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit();\n\t    \teditor.putString(getKey(), mCustomEngineEditText.getText().toString());\n\t    \teditor.putString(getKey() + \"_NAME\",  mCurrentEngine.getText().toString());\n\t    \teditor.commit();\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onProgress(int step) {\n\t\tswitch (step) {\n\t\tcase 0:\n\t\t\tmProgressText.setText(R.string.SearchUrlConnecting);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tmProgressText.setText(R.string.SearchUrlParsing);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tmProgressText.setText(R.string.SearchUrlConnecting);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onDone(String result) {\t\t\n\t\tif (result != null) {\n\t\t\tmProgress.setVisibility(View.GONE);\n\t\t\tmProgressText.setText(result);\t\t\t\n\t\t} else {\n\t\t\tmProgress.setVisibility(View.INVISIBLE);\n\t\t\tmProgressText.setVisibility(View.INVISIBLE);\n\t\t\tmList.setVisibility(View.VISIBLE);\n\t\t\t\n\t\t\tList<SearchUrlGroup> results = mTask.getResults();\n\t\t\t\n\t\t\tmAdapter = new SearchUrlAdapter(getContext(), results);\n\t\t\t\n\t\t\tmList.setAdapter(mAdapter);\n\t\t}\n\t\t\n\t\tmSearchUrlSyncThread.compareAndSet(mTask, null);\n\t}\n\t\n\tprivate void startGetSearchUrlOnline() {\n\t\tremoveEditTextFocus();\n\t\t\n\t\tmList.setVisibility(View.INVISIBLE);\n\t\tmProgress.setVisibility(View.VISIBLE);\n\t\tmProgressText.setVisibility(View.VISIBLE);\t\t\n\t\t\n\t\tmTask = new SearchUrlTask(getContext(), this);\n\t\tboolean retVal = mSearchUrlSyncThread.compareAndSet(null, mTask);\n\t\tif (retVal) {\n\t\t\tmTask.execute();\n\t\t}\n\t}\n\t\n\tprivate void removeEditTextFocus() {\n\t\tmCustomEngineEditText.clearFocus();\n\t\t\n\t\tInputMethodManager mgr = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\tmgr.hideSoftInputFromWindow(mCustomEngineEditText.getWindowToken(), 0);\n\t}\n\t\n\tprivate void showKeyboard() {\n\t\tInputMethodManager mgr = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\tmgr.showSoftInput(mCustomEngineEditText, InputMethodManager.SHOW_IMPLICIT);\n\t}\n\t\n\tprivate String getCurrentSearchEngineName() {\n\t\tString name = PreferenceManager.getDefaultSharedPreferences(getContext()).getString(Constants.PREFERENCE_SEARCH_URL + \"_NAME\", \"\");\n\t\t\n\t\tif (TextUtils.isEmpty(name)) {\n\t\t\tString searchUrl = UrlUtils.getRawSearchUrl(getContext());\n\t\t\tif (getContext().getString(R.string.SearchUrlGoogle).equals(searchUrl)) {\n\t\t\t\tname = getContext().getString(R.string.SearchUrlDefault);\n\t\t\t} else {\n\t\t\t\tname = getContext().getString(R.string.SearchUrlCustom);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn name;\n\t}\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/SeekBarPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.preference.Preference;\nimport android.preference.PreferenceManager;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\n\npublic class SeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener {\n\t\n\tprivate int mDefaultValue;\n\tprivate int mMinValue;\n\tprivate int mMaxValue;\n\tprivate int mStepValue;\n\n\tprivate String mSymbol;\n\t\n\tprivate TextView mTitle;\n\tprivate TextView mSummary;\n\tprivate TextView mValue;\n\tprivate SeekBar mSeekBar;\n\t\n\tpublic SeekBarPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\t\n\t\tif (attrs != null) {\n\t\t\tTypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.SeekBarPreference);\n\t\t\t\n\t\t\tmMinValue = a.getInt(R.styleable.SeekBarPreference_minValue, 0);\n\t\t\tmMaxValue = a.getInt(R.styleable.SeekBarPreference_maxValue, 10);\n\t\t\tmStepValue = a.getInt(R.styleable.SeekBarPreference_stepValue, 1);\n\t\t\t\n\t\t\tif (mMaxValue <= mMinValue) {\n\t\t\t\tmMaxValue = mMinValue + 1;\n\t\t\t}\n\t\t\t\n\t\t\tif (mDefaultValue < mMinValue) {\n\t\t\t\tmDefaultValue = mMinValue;\n\t\t\t}\n\t\t\t\n\t\t\tif (mStepValue <= 0) {\n\t\t\t\tmStepValue = 1;\n\t\t\t}\n\t\t\t\n\t\t\tmMinValue = Math.round(mMinValue / mStepValue);\n\t\t\tmMaxValue = Math.round(mMaxValue / mStepValue);\n\t\t\t\n\t\t\tmDefaultValue = a.getInt(R.styleable.SeekBarPreference_android_defaultValue, 0);\n\t\t\t\n\t\t\tmSymbol = a.getString(R.styleable.SeekBarPreference_symbol);\n\t\t\t\n\t\t\ta.recycle();\n\t\t}\n\t}\n\n\t@Override\n\tprotected View onCreateView(ViewGroup parent) {\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\t\n\t\tView v = inflater.inflate(R.layout.seekbar_preference, null);\n\t\t\n\t\tmTitle = (TextView) v.findViewById(R.id.SeekBarPreferenceTitle);\n\t\tmTitle.setText(getTitle());\n\t\t\n\t\tmSummary = (TextView) v.findViewById(R.id.SeekBarPreferenceSummary);\n\t\tif (!TextUtils.isEmpty(getSummary())) {\n\t\t\tmSummary.setText(getSummary());\n\t\t} else {\n\t\t\tmSummary.setVisibility(View.GONE);\n\t\t}\n\t\t\n\t\tmValue = (TextView) v.findViewById(R.id.SeekBarPreferenceValue);\n\t\t\n\t\tmSeekBar = (SeekBar) v.findViewById(R.id.SeekBarPreferenceSeekBar);\n\t\tmSeekBar.setMax(mMaxValue - mMinValue);\n\t\t\n\t\tint currentValue = getBoundedValue(PreferenceManager.getDefaultSharedPreferences(getContext()).getInt(getKey(), mDefaultValue));\n\t\tcurrentValue = currentValue - mMinValue;\n\t\t\n\t\tmSeekBar.setProgress(currentValue);\n\t\tupdateValue(currentValue, false);\n\t\tmSeekBar.setOnSeekBarChangeListener(this);\n\t\t\n\t\treturn v;\n\t}\n\n\t@Override\n\tpublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n\t\tupdateValue(progress, true);\n\t}\n\n\t@Override\n\tpublic void onStartTrackingTouch(SeekBar seekBar) {\t}\n\n\t@Override\n\tpublic void onStopTrackingTouch(SeekBar seekBar) { }\t\n\n\tprivate int getBoundedValue(int value) {\n\t\t\n\t\tvalue = Math.round(value / mStepValue);\n\t\t\n\t\tif (value < mMinValue) {\n\t\t\tvalue = mMinValue;\n\t\t}\n\t\t\n\t\tif (value > mMaxValue) {\n\t\t\tvalue = mMaxValue;\n\t\t}\n\t\t\n\t\treturn value;\n\t}\n\t\n\tprivate void updateValue(int value, boolean save) {\t\t\t\n\t\t\n\t\tvalue = (value + mMinValue) * mStepValue;\n\t\t\n\t\tmValue.setText(String.format(\"%s\" + mSymbol, value));\n\t\t\n\t\tif (save) {\n\t\t\tPreferenceManager.getDefaultSharedPreferences(getContext()).edit().putInt(getKey(), value).commit();\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/SslExceptionsFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.providers.SslExceptionsProvider;\nimport org.tint.providers.SslExceptionsWrapper;\nimport org.tint.utils.ApplicationUtils;\n\nimport android.app.ListFragment;\nimport android.app.LoaderManager;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Loader;\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport android.text.Html;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.CompoundButton;\nimport android.widget.CompoundButton.OnCheckedChangeListener;\nimport android.widget.ListView;\nimport android.widget.SimpleCursorAdapter;\nimport android.widget.Switch;\nimport android.widget.TextView;\n\npublic class SslExceptionsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {\n\t\n\tprivate SslExceptionAdapter mAdapter;\n\t\n\tprivate OnCheckedChangeListener mCheckedChangeListener;\n\t\n\t@Override\n\tpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tView view = super.onCreateView(inflater, container, savedInstanceState);\t\t\n\t\t\n\t\tmCheckedChangeListener = new OnCheckedChangeListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n\t\t\t\tlong id = (Long) buttonView.getTag();\n\t\t\t\tSslExceptionsWrapper.toggleSslException(getActivity().getContentResolver(), id, isChecked);\n\t\t\t}\n\t\t};\n\t\t\n\t\tString[] from = new String[] { SslExceptionsProvider.Columns.AUTHORITY };\n\t\tint[] to = new int[] { R.id.SslExceptionRow_Title };\n\t\t\n\t\tmAdapter = new SslExceptionAdapter(getActivity(), R.layout.ssl_exception_row, null, from, to, 0);\n\t\t\n\t\tsetListAdapter(mAdapter);\n\t\t\n\t\treturn view;\n\t}\t\n\n\t@Override\n\tpublic void onActivityCreated(Bundle savedInstanceState) {\n\t\tsuper.onActivityCreated(savedInstanceState);\n\t\t\n\t\tsetEmptyText(getString(R.string.SslExceptionEmptyText));\n\t\t\n\t\tgetLoaderManager().restartLoader(0, null, this);\n\t}\n\n\t@Override\n\tpublic void onListItemClick(ListView l, View v, int position, final long id) {\n\t\tsuper.onListItemClick(l, v, position, id);\n\t\t\n\t\tApplicationUtils.showYesNoDialog(\n\t\t\t\tgetActivity(),\n\t\t\t\tandroid.R.drawable.ic_dialog_info,\n\t\t\t\tR.string.RemoveSslExceptionTitle,\n\t\t\t\tR.string.RemoveSslExceptionMessage,\n\t\t\t\tnew DialogInterface.OnClickListener() {\n\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\tSslExceptionsWrapper.removeSslException(getActivity().getContentResolver(), id);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t});\n\t}\n\t\n\t@Override\n\tpublic Loader<Cursor> onCreateLoader(int id, Bundle args) {\n\t\tsetListShown(false);\n\t\t\n\t\treturn SslExceptionsWrapper.getSslErrorAuthoritiesCursorLoader(getActivity());\n\t}\n\n\t@Override\n\tpublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {\n\t\tmAdapter.swapCursor(data);\n\t\tsetListShown(true);\n\t}\n\n\t@Override\n\tpublic void onLoaderReset(Loader<Cursor> loader) {\n\t\tmAdapter.swapCursor(null);\n\t}\n\t\n\tprivate class SslExceptionAdapter extends SimpleCursorAdapter {\n\t\t\n\t\tpublic SslExceptionAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {\n\t\t\tsuper(context, R.layout.ssl_exception_row, c, from, to, flags);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\tView superView = super.getView(position, convertView, parent);\n\t\t\t\n\t\t\tCursor c = getCursor();\n\t\t\t\n\t\t\tSwitch sw = (Switch) superView.findViewById(R.id.SslExceptionRow_AllowSwitch);\n\t\t\tsw.setTag(c.getLong(c.getColumnIndex(SslExceptionsProvider.Columns._ID)));\n\t\t\tsw.setChecked(c.getInt(c.getColumnIndex(SslExceptionsProvider.Columns.ALLOW)) > 0 ? true : false);\n\t\t\tsw.setOnCheckedChangeListener(mCheckedChangeListener);\n\t\t\t\n\t\t\tint reasons = c.getInt(c.getColumnIndex(SslExceptionsProvider.Columns.REASON));\n\t\t\t\n\t\t\tTextView tv = (TextView) superView.findViewById(R.id.SslExceptionRow_Reasons);\n\t\t\ttv.setText(Html.fromHtml(SslExceptionsWrapper.sslErrorReasonToString(getActivity(), reasons)));\n\t\t\t\n\t\t\treturn superView;\n\t\t}\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/UserAgentSpinnerPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.utils.Constants;\n\nimport android.content.Context;\nimport android.preference.PreferenceManager;\nimport android.text.InputType;\nimport android.util.AttributeSet;\n\npublic class UserAgentSpinnerPreference extends BaseSpinnerPreference {\n\n\tpublic UserAgentSpinnerPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t}\n\n\t@Override\n\tprotected int getTitleArray() {\n\t\treturn R.array.UserAgentsTitles;\n\t}\n\n\t@Override\n\tprotected void setEditInputType() {\n\t\tmEditText.setInputType(InputType.TYPE_CLASS_TEXT);\n\t}\n\n\t@Override\n\tprotected void setSpinnerValueFromPreferences() {\n\t\tString currentUserAgent = PreferenceManager.getDefaultSharedPreferences(getContext()).getString(\n\t\t\t\tConstants.PREFERENCE_USER_AGENT,\n\t\t\t\t\t\tConstants.USER_AGENT_ANDROID);\n\t\t\n\t\tif (currentUserAgent.equals(Constants.USER_AGENT_ANDROID)) {\n\t\t\tmSpinner.setSelection(0);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tmEditText.setText(Constants.USER_AGENT_ANDROID);\n\t\t} else if (currentUserAgent.equals(Constants.USER_AGENT_DESKTOP)) {\n\t\t\tmSpinner.setSelection(1);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tmEditText.setText(Constants.USER_AGENT_DESKTOP);\n\t\t} else {\n\t\t\tmSpinner.setSelection(2);\n\t\t\tmEditText.setEnabled(true);\n\t\t\tmEditText.setText(currentUserAgent);\t\t\t\t\t\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onSpinnerItemSelected(int position) {\n\t\tswitch(position) {\n\t\tcase 0:\n\t\t\tmEditText.setText(Constants.USER_AGENT_ANDROID);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tmEditText.setText(Constants.USER_AGENT_DESKTOP);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tmEditText.setEnabled(true);\n\t\t\t\n\t\t\tif ((mEditText.getText().toString().equals(Constants.USER_AGENT_ANDROID)) ||\n\t\t\t\t\t(mEditText.getText().toString().equals(Constants.USER_AGENT_DESKTOP))) {\t\t\t\t\t\n\t\t\t\tmEditText.setText(null);\n\t\t\t}\n\t\t\t\n\t\t\tmEditText.selectAll();\n\t\t\tshowKeyboard();\n\t\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tmEditText.setText(Constants.USER_AGENT_ANDROID);\n\t\t\tmEditText.setEnabled(false);\n\t\t\tbreak;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/WebViewDialogPreference.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport org.tint.R;\nimport org.tint.utils.ApplicationUtils;\n\nimport android.app.AlertDialog.Builder;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.preference.DialogPreference;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.webkit.WebView;\n\npublic class WebViewDialogPreference extends DialogPreference {\n\t\n\tprivate WebView mWebView;\n\t\n\tprivate String mHtml;\n\n\tpublic WebViewDialogPreference(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tinit(attrs);\n\t}\n\t\n\tpublic WebViewDialogPreference(Context context, AttributeSet attrs,\tint defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\tinit(attrs);\n\t}\n\t\n\t@Override\n\tprotected View onCreateDialogView() {\n\t\tLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\treturn inflater.inflate(R.layout.webview_dialog_preference, null);\n\t}\n\t\n\t@Override\n\tprotected void onBindDialogView(View view) {\n\t\tsuper.onBindDialogView(view);\n\t\t\n\t\tmWebView = (WebView) view.findViewById(R.id.PreferenceWebView);\n\t\tmWebView.loadData(mHtml, \"text/html; charset=UTF-8\", null);\n\t}\n\t\n\t@Override\n\tprotected void onPrepareDialogBuilder(Builder builder) {\n\t\tsuper.onPrepareDialogBuilder(builder);\t\t\n\t\tbuilder.setNegativeButton(null, null);\t\t\n\t}\n\n\tprivate void init(AttributeSet attrs) {\n\t\tif (attrs != null) {\n\t\t\tTypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.WebViewDialogPreference);\n\t\t\t\n\t\t\tint id = a.getResourceId(R.styleable.WebViewDialogPreference_html, -1);\n\t\t\tif (id != -1) {\n\t\t\t\tmHtml = ApplicationUtils.getStringFromRawResource(getContext(), id);\n\t\t\t} else {\n\t\t\t\tmHtml = \"Unable to get resource.\";\n\t\t\t}\n\t\t\t\n\t\t\ta.recycle();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/preferences/WebsitesSettingsFragment.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.preferences;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.Set;\n\nimport org.tint.R;\nimport org.tint.ui.managers.UIFactory;\nimport android.app.AlertDialog;\nimport android.app.ListFragment;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.preference.PreferenceActivity;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.GeolocationPermissions;\nimport android.webkit.ValueCallback;\nimport android.webkit.WebStorage;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\npublic class WebsitesSettingsFragment extends ListFragment {\n\t\n\tprivate static final String EXTRA_SITE = \"site\";\n\t\n\tprivate SiteAdapter mAdapter = null;\n\tprivate Site mSite = null;\n\t\n\t@Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n\t\tView view = inflater.inflate(R.layout.websites_settings_fragment, container, false);\n\t\t\n\t\tBundle args = getArguments();\n        if (args != null) {\n            mSite = (Site) args.getParcelable(EXTRA_SITE);            \n        }\n        if (mSite == null) {\n//            View clear = view.findViewById(R.id.clear_all_button);\n//            clear.setVisibility(View.VISIBLE);\n//            clear.setOnClickListener(this);\n        } else {\n        \tif (!UIFactory.isTablet(getActivity())) {\n        \t\t// The current website is currently shown in tablet-type preferences activity / fragements.\n        \t\tgetActivity().setTitle(String.format(getString(R.string.WebsitesSettingsSiteTitle), mSite.getPrettyTitle()));\n        \t}\n        }\n\t\t\n\t\treturn view;\n\t}\n\t\n\t@Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n        \n        mAdapter = new SiteAdapter(getActivity(), R.layout.websites_settings_row);\n        \n        if (mSite != null) {\n            mAdapter.mCurrentSite = mSite;\n        }\n        \n        getListView().setAdapter(mAdapter);\n        getListView().setOnItemClickListener(mAdapter);\n\t}\n\t\n\t@Override\n    public void onResume() {\n        super.onResume();\n        mAdapter.askForOrigins();\n    }\n\t\n\tprivate void finish() {\n        PreferenceActivity activity = (PreferenceActivity) getActivity();\n        if (activity != null) {\n            activity.finishPreferencePanel(this, 0, null);\n        }\n    }\n\t\n\tclass SiteAdapter extends ArrayAdapter<Site> implements AdapterView.OnItemClickListener {\n\t\t\n\t\tprivate int mResource;\n        private LayoutInflater mInflater;\n        private Bitmap mUsageEmptyIcon;\n        private Bitmap mUsageLowIcon;\n        private Bitmap mUsageHighIcon;\n        private Bitmap mLocationAllowedIcon;\n        private Bitmap mLocationDisallowedIcon;\n        private Site mCurrentSite;\n\t\t\n\t\tpublic SiteAdapter(Context context, int rsc) {\n            this(context, rsc, null);\n        }\n\t\t\n\t\tpublic SiteAdapter(Context context, int rsc, Site site) {\n            super(context, rsc);\n            \n            mResource = rsc;\n            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n            mUsageEmptyIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_list_data_off);\n            mUsageLowIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_list_data_small);\n            mUsageHighIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_list_data_large);\n            mLocationAllowedIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_gps_on_holo_dark);\n            mLocationDisallowedIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_gps_denied_holo_dark);\n            mCurrentSite = site;\n            \n            if (mCurrentSite == null) {\n                askForOrigins();\n            }\n        }\n\t\t\n\t\t/**\n         * Adds the specified feature to the site corresponding to supplied\n         * origin in the map. Creates the site if it does not already exist.\n         */\n        private void addFeatureToSite(Map<String, Site> sites, String origin, int feature) {\n            Site site = null;\n            if (sites.containsKey(origin)) {\n                site = (Site) sites.get(origin);\n            } else {\n                site = new Site(origin);\n                sites.put(origin, site);\n            }\n            site.addFeature(feature);\n        }\n\t\t\n\t\t@SuppressWarnings(\"rawtypes\")\n\t\tpublic void askForOrigins() {\n            // Get the list of origins we want to display.\n            // All 'HTML 5 modules' (Database, Geolocation etc) form these\n            // origin strings using WebCore::SecurityOrigin::toString(), so it's\n            // safe to group origins here. Note that WebCore::SecurityOrigin\n            // uses 0 (which is not printed) for the port if the port is the\n            // default for the protocol. Eg http://www.google.com and\n            // http://www.google.com:80 both record a port of 0 and hence\n            // toString() == 'http://www.google.com' for both.\n\n            WebStorage.getInstance().getOrigins(new ValueCallback<Map>() {\n\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\tpublic void onReceiveValue(Map origins) {\n                    Map<String, Site> sites = new HashMap<String, Site>();\n                    if (origins != null) {\n                        Iterator<String> iter = origins.keySet().iterator();\n                        while (iter.hasNext()) {\n                            addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);\n                        }\n                    }\n                    \n                    askForGeolocation(sites);\n                }\n            });\n        }\n\t\t\n\t\tpublic void askForGeolocation(final Map<String, Site> sites) {\n            GeolocationPermissions.getInstance().getOrigins(new ValueCallback<Set<String> >() {\n                public void onReceiveValue(Set<String> origins) {\n                    if (origins != null) {\n                        Iterator<String> iter = origins.iterator();\n                        while (iter.hasNext()) {\n                            addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION);\n                        }\n                    }\n                    \n                    //populateIcons(sites);\n                    populateOrigins(sites);\n                }\n            });\n        }\n\t\t\n\t\tpublic void populateOrigins(Map<String, Site> sites) {\n            clear();\n\n            // We can now simply populate our array with Site instances\n            Set<Map.Entry<String, Site>> elements = sites.entrySet();\n            Iterator<Map.Entry<String, Site>> entryIterator = elements.iterator();\n            while (entryIterator.hasNext()) {\n                Map.Entry<String, Site> entry = entryIterator.next();\n                Site site = entry.getValue();\n                add(site);\n            }\n\n            notifyDataSetChanged();\n        }\n\t\t\n\t\tpublic String sizeValueToString(long bytes) {\n            // We display the size in MB, to 1dp, rounding up to the next 0.1MB.\n            // bytes should always be greater than zero.\n            if (bytes <= 0) {\n                Log.e(\"WebsitesSettingsFragment\", \"sizeValueToString called with non-positive value: \" + bytes);\n                return \"0\";\n            }\n            float megabytes = (float) bytes / (1024.0F * 1024.0F);\n            int truncated = (int) Math.ceil(megabytes * 10.0F);\n            float result = (float) (truncated / 10.0F);\n            return String.valueOf(result);\n        }\n\t\t\n\t\tpublic void setIconForUsage(ImageView usageIcon, long usageInBytes) {\n            float usageInMegabytes = (float) usageInBytes / (1024.0F * 1024.0F);\n            // We set the correct icon:\n            // 0 < empty < 0.1MB\n            // 0.1MB < low < 5MB\n            // 5MB < high\n            if (usageInMegabytes <= 0.1) {\n                usageIcon.setImageBitmap(mUsageEmptyIcon);\n            } else if (usageInMegabytes > 0.1 && usageInMegabytes <= 5) {\n                usageIcon.setImageBitmap(mUsageLowIcon);\n            } else if (usageInMegabytes > 5) {\n                usageIcon.setImageBitmap(mUsageHighIcon);\n            }\n        }\n\t\t\n\t\t@Override\n        public View getView(int position, View convertView, ViewGroup parent) {\n\t\t\tView view;\n\t\t\t\n\t\t\tfinal TextView title;\n\t\t\tfinal TextView subtitle;\n\t\t\t\n\t\t\tfinal ImageView settingsIcon;\n\t\t\t\n\t\t\tfinal ImageView usageIcon;\n            final ImageView locationIcon;\n            final ImageView featureIcon;\n\t\t\t\n\t\t\tif (convertView == null) {\n                view = mInflater.inflate(mResource, parent, false);\n            } else {\n                view = convertView;\n            }\n\t\t\t\n\t\t\ttitle = (TextView) view.findViewById(R.id.WebsitesSettingsTitle);\n\t\t\tsubtitle = (TextView) view.findViewById(R.id.WebsitesSettingsSubTitle);\n\t\t\tsettingsIcon = (ImageView) view.findViewById(R.id.WebsitesSettingsIcon);\n            featureIcon = (ImageView) view.findViewById(R.id.WebsitesSettingsFeatureIcon);\n            usageIcon = (ImageView) view.findViewById(R.id.WebsitesSettingsUsageIcon);\n            locationIcon = (ImageView) view.findViewById(R.id.WebsitesSettingsLocationIcon);\n            \n//            featureIcon.setVisibility(View.GONE);\n//            usageIcon.setVisibility(View.GONE);\n//            locationIcon.setVisibility(View.GONE);\n            \n            if (mCurrentSite == null) {            \t\n            \tSite site = getItem(position);\n            \t\n            \ttitle.setText(site.getPrettyTitle());\n            \t\n            \tString subtitleText = site.getPrettyOrigin();\n                if (subtitleText != null) {\n                    title.setMaxLines(1);\n                    title.setSingleLine(true);\n                    subtitle.setVisibility(View.VISIBLE);\n                    subtitle.setText(subtitleText);\n                } else {\n                    subtitle.setVisibility(View.GONE);\n                    title.setMaxLines(2);\n                    title.setSingleLine(false);\n                }\n            \t\n            \tusageIcon.setVisibility(View.GONE);\n                locationIcon.setVisibility(View.GONE);\n                featureIcon.setVisibility(View.GONE);\n            \t\n                // We set the site as the view's tag,\n                // so that we can get it in onItemClick()\n                view.setTag(site);\n                \n            \tif (site.hasFeature(Site.FEATURE_WEB_STORAGE)) {\n                    WebStorage.getInstance().getUsageForOrigin(site.getOrigin(), new ValueCallback<Long>() {\n                        public void onReceiveValue(Long value) {\n                            if (value != null) {\n                                setIconForUsage(usageIcon, value.longValue());\n                                usageIcon.setVisibility(View.VISIBLE);\n                            }\n                        }\n                    });\n                }\n            \t\n            \tif (site.hasFeature(Site.FEATURE_GEOLOCATION)) {\n                    locationIcon.setVisibility(View.VISIBLE);\n                    GeolocationPermissions.getInstance().getAllowed(site.getOrigin(), new ValueCallback<Boolean>() {\n                        public void onReceiveValue(Boolean allowed) {\n                            if (allowed != null) {\n                                if (allowed.booleanValue()) {\n                                    locationIcon.setImageBitmap(mLocationAllowedIcon);\n                                } else {\n                                    locationIcon.setImageBitmap(mLocationDisallowedIcon);\n                                }\n                            }\n                        }\n                    });\n                }\n            \t\n            } else {\n            \t\n            \tsettingsIcon.setVisibility(View.GONE);\n            \tlocationIcon.setVisibility(View.GONE);\n                usageIcon.setVisibility(View.GONE);\n                featureIcon.setVisibility(View.VISIBLE);\n                \n                switch (mCurrentSite.getFeatureByIndex(position)) {\n                case Site.FEATURE_WEB_STORAGE:\n                    WebStorage.getInstance().getUsageForOrigin(mCurrentSite.getOrigin(), new ValueCallback<Long>() {\n                        public void onReceiveValue(Long value) {\n                            if (value != null) {\n                                String usage = String.format(getString(R.string.WebsitesSettingsDataUsage),  sizeValueToString(value.longValue()));\n                                title.setText(usage);\n                                subtitle.setText(R.string.WebsitesSettingsDataClickToClear);\n                                subtitle.setVisibility(View.VISIBLE);\n                                setIconForUsage(featureIcon, value.longValue());\n                            }\n                        }\n                    });\n                    break;\n                case Site.FEATURE_GEOLOCATION:\n                \tsubtitle.setText(R.string.WebsitesSettingsGeolocationClickToClear);\n                    GeolocationPermissions.getInstance().getAllowed(mCurrentSite.getOrigin(), new ValueCallback<Boolean>() {\n                        public void onReceiveValue(Boolean allowed) {\n                            if (allowed != null) {\n                                if (allowed.booleanValue()) {\n                                    title.setText(R.string.WebsitesSettingsGeolocationAllowed);\n                                    featureIcon.setImageBitmap(mLocationAllowedIcon);\n                                } else {\n                                    title.setText(R.string.WebsitesSettingsGeolocationNotAllowed);\n                                    featureIcon.setImageBitmap(mLocationDisallowedIcon);\n                                }\n                                \n                                subtitle.setVisibility(View.VISIBLE);\n                            }\n                        }\n                    });\n                    break;\n            }\n            }\n\t\t\t\n\t\t\treturn view;\n\t\t}\n\n\t\tpublic void onItemClick(AdapterView<?> parent,\n\t\t\t\tView view,\n\t\t\t\tint position,\n\t\t\t\tlong id) {\n\t\t\tif (mCurrentSite != null) {\n\t\t\t\tswitch (mCurrentSite.getFeatureByIndex(position)) {\n\t\t\t\tcase Site.FEATURE_WEB_STORAGE:\n\t\t\t\t\tnew AlertDialog.Builder(getContext())\n\t\t\t\t\t.setTitle(R.string.WebsitesSettingsCleatDataDialogTitle)\n\t\t\t\t\t.setMessage(R.string.WebsitesSettingsCleatDataDialogMessage)\n\t\t\t\t\t.setPositiveButton(R.string.OK,\n\t\t\t\t\t\t\tnew AlertDialog.OnClickListener() {\n\t\t\t\t\t\tpublic void onClick(DialogInterface dlg, int which) {\n\t\t\t\t\t\t\tWebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());\n\t\t\t\t\t\t\t// If this site has no more features, then go back to the\n\t\t\t\t\t\t\t// origins list.\n\t\t\t\t\t\t\tmCurrentSite.removeFeature(Site.FEATURE_WEB_STORAGE);\n\t\t\t\t\t\t\tif (mCurrentSite.getFeatureCount() == 0) {\n\t\t\t\t\t\t\t\tfinish();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taskForOrigins();\n\t\t\t\t\t\t\tnotifyDataSetChanged();\n\t\t\t\t\t\t}})\n\t\t\t\t\t\t.setNegativeButton(R.string.Cancel, null)\n\t\t\t\t\t\t.setIcon(android.R.drawable.ic_dialog_alert)\n\t\t\t\t\t\t.show();\n\t\t\t\t\tbreak;\n\t\t\t\tcase Site.FEATURE_GEOLOCATION:\n\t\t\t\t\tnew AlertDialog.Builder(getContext())\n\t\t\t\t\t.setTitle(R.string.WebsitesSettingsGeolocationPageDialogTitle)\n\t\t\t\t\t.setMessage(R.string.WebsitesSettingsGeolocationPageDialogMessage)\n\t\t\t\t\t.setPositiveButton(R.string.OK,\n\t\t\t\t\t\t\tnew AlertDialog.OnClickListener() {\n\t\t\t\t\t\tpublic void onClick(DialogInterface dlg, int which) {\n\t\t\t\t\t\t\tGeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin());\n\t\t\t\t\t\t\tmCurrentSite.removeFeature(Site.FEATURE_GEOLOCATION);\n\t\t\t\t\t\t\tif (mCurrentSite.getFeatureCount() == 0) {\n\t\t\t\t\t\t\t\tfinish();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taskForOrigins();\n\t\t\t\t\t\t\tnotifyDataSetChanged();\n\t\t\t\t\t\t}})\n\t\t\t\t\t\t.setNegativeButton(R.string.Cancel, null)\n\t\t\t\t\t\t.setIcon(android.R.drawable.ic_dialog_alert)\n\t\t\t\t\t\t.show();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tSite site = (Site) view.getTag();\n\t\t\t\tPreferenceActivity activity = (PreferenceActivity) getActivity();\n\t\t\t\tif (activity != null) {\n\t\t\t\t\tBundle args = new Bundle();\n\t\t\t\t\targs.putParcelable(EXTRA_SITE, site);\n\t\t\t\t\tactivity.startPreferencePanel(WebsitesSettingsFragment.class.getName(), args, 0,\n\t\t\t\t\t\t\tsite.getPrettyTitle(), null, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic int getCount() {\n            if (mCurrentSite == null) {\n                return super.getCount();\n            }\n            return mCurrentSite.getFeatureCount();\n        }\n\t}\n\t\n\tstatic class Site implements Parcelable {\n        private String mOrigin;\n        private String mTitle;\n        private Bitmap mIcon;\n        private int mFeatures;\n\n        // These constants provide the set of features that a site may support\n        // They must be consecutive. To add a new feature, add a new FEATURE_XXX\n        // variable with value equal to the current value of FEATURE_COUNT, then\n        // increment FEATURE_COUNT.\n        private final static int FEATURE_WEB_STORAGE = 0;\n        private final static int FEATURE_GEOLOCATION = 1;\n        // The number of features available.\n        private final static int FEATURE_COUNT = 2;\n\n        public Site(String origin) {\n            mOrigin = origin;\n            mTitle = null;\n            mIcon = null;\n            mFeatures = 0;\n        }\n\n        public void addFeature(int feature) {\n            mFeatures |= (1 << feature);\n        }\n\n        public void removeFeature(int feature) {\n            mFeatures &= ~(1 << feature);\n        }\n\n        public boolean hasFeature(int feature) {\n            return (mFeatures & (1 << feature)) != 0;\n        }\n\n        /**\n         * Gets the number of features supported by this site.\n         */\n        public int getFeatureCount() {\n            int count = 0;\n            for (int i = 0; i < FEATURE_COUNT; ++i) {\n                count += hasFeature(i) ? 1 : 0;\n            }\n            return count;\n        }\n\n        /**\n         * Gets the ID of the nth (zero-based) feature supported by this site.\n         * The return value is a feature ID - one of the FEATURE_XXX values.\n         * This is required to determine which feature is displayed at a given\n         * position in the list of features for this site. This is used both\n         * when populating the view and when responding to clicks on the list.\n         */\n        public int getFeatureByIndex(int n) {\n            int j = -1;\n            for (int i = 0; i < FEATURE_COUNT; ++i) {\n                j += hasFeature(i) ? 1 : 0;\n                if (j == n) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        public String getOrigin() {\n            return mOrigin;\n        }\n\n        public void setTitle(String title) {\n            mTitle = title;\n        }\n\n        public void setIcon(Bitmap icon) {\n            mIcon = icon;\n        }\n\n        public Bitmap getIcon() {\n            return mIcon;\n        }\n\n        public String getPrettyOrigin() {\n            return mTitle == null ? null : hideHttp(mOrigin);\n        }\n\n        public String getPrettyTitle() {\n            return mTitle == null ? hideHttp(mOrigin) : mTitle;\n        }\n\n        private String hideHttp(String str) {\n            Uri uri = Uri.parse(str);\n            return \"http\".equals(uri.getScheme()) ?  str.substring(7) : str;\n        }\n\n        @Override\n        public int describeContents() {\n            return 0;\n        }\n\n        @Override\n        public void writeToParcel(Parcel dest, int flags) {\n            dest.writeString(mOrigin);\n            dest.writeString(mTitle);\n            dest.writeInt(mFeatures);\n            dest.writeParcelable(mIcon, flags);\n        }\n\n        private Site(Parcel in) {\n            mOrigin = in.readString();\n            mTitle = in.readString();\n            mFeatures = in.readInt();\n            mIcon = in.readParcelable(null);\n        }\n\n        public static final Parcelable.Creator<Site> CREATOR\n                = new Parcelable.Creator<Site>() {\n            public Site createFromParcel(Parcel in) {\n                return new Site(in);\n            }\n\n            public Site[] newArray(int size) {\n                return new Site[size];\n            }\n        };\n\n    }\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/runnables/HideToolbarsRunnable.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.runnables;\n\nimport org.tint.ui.managers.LegacyPhoneUIManager;\n\nimport android.os.Handler;\nimport android.os.Message;\nimport android.util.Log;\n\npublic class HideToolbarsRunnable implements Runnable {\n\n\tprivate LegacyPhoneUIManager mUIManager;\n\tprivate int mDuration;\n\t\n\tprivate boolean mDisabled;\n\t\n\tprivate Handler mHandler = new Handler() {\n\t\tpublic void handleMessage(Message msg) {\n\t\t\tif ((!mDisabled) &&\n\t\t\t\t\t(mUIManager != null)) {\n\t\t\t\tmUIManager.hideToolbars();\n\t\t\t}\n\t\t}\n\t};\n\t\n\tpublic HideToolbarsRunnable(LegacyPhoneUIManager uiManager, int duration) {\n\t\tmUIManager = uiManager;\n\t\tmDuration = duration;\n\t\t\n\t\tmDisabled = false;\n\t}\n\t\n\tpublic void disable() {\n\t\tmDisabled = true;\n\t}\n\t\n\t@Override\n\tpublic void run() {\n\t\ttry {\n\t\t\tThread.sleep(mDuration);\n\t\t\tmHandler.sendEmptyMessage(0);\n\t\t} catch (InterruptedException e) {\n\t\t\tLog.d(\"HideToolbarsRunnable\", e.getMessage());\n\t\t\tmHandler.sendEmptyMessage(0);\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/tabs/GenericTabListener.java",
    "content": "/*\r\n * Tint Browser for Android\r\n * \r\n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\r\n *\r\n * This program is free software; you can redistribute it and/or\r\n * modify it under the terms of the GNU General Public License\r\n * version 3 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n * GNU General Public License for more details.\r\n */\r\n\r\npackage org.tint.ui.tabs;\r\n\r\nimport android.app.ActionBar;\r\nimport android.app.ActionBar.Tab;\r\nimport android.app.Activity;\r\nimport android.app.Fragment;\r\nimport android.app.FragmentTransaction;\r\nimport android.os.Bundle;\r\n\r\npublic class GenericTabListener<T extends Fragment> implements ActionBar.TabListener {\r\n\r\n\tprivate Fragment mFragment;\r\n    private Activity mActivity;\r\n    private String mTag;\r\n    private Class<T> mClass;\r\n\t\r\n    /** Constructor used each time a new tab is created.\r\n     * @param activity  The host Activity, used to instantiate the fragment\r\n     * @param tag  The identifier tag for the fragment\r\n     * @param clz  The fragment's Class, used to instantiate the fragment\r\n     */\r\n    public GenericTabListener(Activity activity, String tag, Class<T> clz) {\r\n    \tthis(activity, tag, clz, null);\r\n    }\r\n    \r\n    public GenericTabListener(Activity activity, String tag, Class<T> clz, Bundle args) {\r\n    \tmFragment = null;\r\n    \tmActivity = activity;\r\n    \tmTag = tag;\r\n    \tmClass = clz;\r\n    \t\r\n    \t// Check to see if we already have a fragment for this tab, probably\r\n        // from a previously saved state.  If so, deactivate it, because our\r\n        // initial state is that a tab isn't shown.\r\n        mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);\r\n        if (mFragment != null && !mFragment.isDetached()) {\r\n            FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();\r\n            ft.detach(mFragment);\r\n            ft.commit();\r\n        }\r\n\r\n    }\r\n    \r\n\t@Override\r\n\tpublic void onTabReselected(Tab tab, FragmentTransaction ft) { }\r\n\r\n\t@Override\r\n\tpublic void onTabSelected(Tab tab, FragmentTransaction ft) {\r\n\t\t// Check if the fragment is already initialized\r\n        if (mFragment == null) {\r\n            // If not, instantiate and add it to the activity\r\n            mFragment = Fragment.instantiate(mActivity, mClass.getName());\r\n            ft.add(android.R.id.content, mFragment, mTag);\r\n        } else {\r\n            // If it exists, simply attach it in order to show it\r\n            ft.attach(mFragment);\r\n        }\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void onTabUnselected(Tab tab, FragmentTransaction ft) {\r\n\t\tif (mFragment != null) {\r\n            // Detach the fragment, because another one is being attached\r\n            ft.detach(mFragment);\r\n        }\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/org/tint/ui/tabs/WebViewFragmentTabListener.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.tabs;\n\nimport org.tint.R;\nimport org.tint.ui.fragments.TabletWebViewFragment;\nimport org.tint.ui.managers.TabletUIManager;\n\nimport android.app.ActionBar;\nimport android.app.ActionBar.Tab;\nimport android.app.FragmentTransaction;\n\npublic class WebViewFragmentTabListener implements ActionBar.TabListener {\n\t\n\tprivate TabletUIManager mUIManager;\n\tprivate TabletWebViewFragment mFragment;\n\t\n\tprivate boolean mFragmentAdded;\n\n\tpublic WebViewFragmentTabListener(TabletUIManager uiManager, TabletWebViewFragment fragment) {\n\t\tmUIManager = uiManager;\n\t\tmFragment = fragment;\n\t\t\n\t\tmFragmentAdded = false;\n\t}\n\t\n\t@Override\n\tpublic void onTabReselected(Tab arg0, FragmentTransaction arg1) { }\n\n\t@Override\n\tpublic void onTabSelected(Tab arg0, FragmentTransaction ft) {\n\t\tif (mFragment.isStartPageShown()) {\n\t\t\tft.show(mUIManager.getStartPageFragment());\n\t\t} else {\n\t\t\tif (!mFragmentAdded) {\n\t\t\t\tft.add(R.id.WebViewContainer, mFragment, null);\n\t\t\t\tmFragmentAdded = true;\n\t\t\t} else {\n\t\t\t\tft.show(mFragment);\n\t\t\t}\n\t\t}\n\t\tmFragment.onTabSelected(arg0);\n\t\tmUIManager.onTabSelected(arg0);\n\t}\n\n\t@Override\n\tpublic void onTabUnselected(Tab arg0, FragmentTransaction ft) {\n\t\tif (mFragment.isStartPageShown()) {\n\t\t\tft.hide(mUIManager.getStartPageFragment());\n\t\t} else {\n\t\t\tft.hide(mFragment);\n\t\t}\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/views/PanelLayout.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.views;\n\nimport org.tint.R;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\nimport android.animation.Animator.AnimatorListener;\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.util.TypedValue;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.animation.AccelerateDecelerateInterpolator;\nimport android.widget.RelativeLayout;\n\npublic class PanelLayout extends RelativeLayout {\n\t\n\tpublic interface PanelEventsListener {\n\t\tvoid onPanelShown();\n\t\tvoid onPanelHidden();\n\t}\n\t\n\tprivate static final int ANIMATION_DURATION = 150;\n\tprivate static final int BEZEL_SIZE_REDUCED = 5;\n\tprivate static final int BEZEL_SIZE_STANDARD = 10;\n\tprivate static final int BEZEL_SIZE_OPENED = 100;\n\n\tprivate Animator mAnimator;\n\n\tprivate boolean mPanelShown;\n\n\tprivate AnimatorListener mShowListener;\n\tprivate AnimatorListener mHideListener;\n\n\tprivate RelativeLayout mContent;\n\tprivate RelativeLayout mPanel;\n\t\n\tprivate TabsScroller mTabsScroller;\n\n\tprivate boolean mInSlide;\n\tprivate float mBezelTopDelta;\n\tprivate float mBezelSizeReduced;\n\tprivate float mBezelSizeStandard;\n\tprivate float mBezelSizeOpened;\n\tprivate float mLastX;\n\tprivate float mTranslation;\n\tprivate float mAlpha;\n\tprivate boolean mLastMoveOpen;\n\t\n\tprivate PanelEventsListener mListener;\n\n\tpublic PanelLayout(Context context) {\n\t\tthis(context, null);\n\t}\n\n\tpublic PanelLayout(Context context, AttributeSet attrs) {\n\t\tthis(context, attrs, 0);\n\t}\n\n\tpublic PanelLayout(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\n\t\tmListener = null;\n\t\t\n\t\tmInSlide = false;\n\t\tmLastMoveOpen = false;\n\t\tmTranslation = 0;\n\t\tmAlpha = 0;\n\n\t\tmPanelShown = false;\n\t\tmAnimator = null;\n\n\t\tif (!isInEditMode()) {\n\t\t\t\n\t\t\tTypedValue tv = new TypedValue();\n\t\t\tcontext.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);\n\t\t\t\n\t\t\tmBezelTopDelta = getResources().getDimension(tv.resourceId);\n\t\t\t\n\t\t\tfloat density = context.getResources().getDisplayMetrics().density;\n\t\t\t\n\t\t\tmBezelSizeReduced = BEZEL_SIZE_REDUCED * density + 0.5f;\n\t\t\tmBezelSizeStandard = BEZEL_SIZE_STANDARD * density + 0.5f;\n\t\t\tmBezelSizeOpened = BEZEL_SIZE_OPENED * density + 0.5f;\n\t\t\t\n\t\t\tLayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\t\tView v = layoutInflater.inflate(R.layout.panel_layout, this);\n\n\t\t\tmContent = (RelativeLayout) v.findViewById(R.id.main_content);\n\t\t\tmPanel = (RelativeLayout) v.findViewById(R.id.panel);\n\n\t\t\tmTabsScroller = (TabsScroller) v.findViewById(R.id.tabs_scroller);\n\t\t\t\t\t\t\n\t\t\tmShowListener = new AnimatorListenerAdapter() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onAnimationEnd(Animator animation) {\n\t\t\t\t\tmAnimator = null;\n\t\t\t\t\tmPanel.requestLayout();\n\t\t\t\t\tmPanelShown = true;\n\t\t\t\t\tmTranslation = mPanel.getWidth();\n\t\t\t\t\tmAlpha = 1;\n\t\t\t\t\t\n\t\t\t\t\tif (mListener != null) {\n\t\t\t\t\t\tmListener.onPanelShown();\n\t\t\t\t\t}\n\t\t\t\t}               \n\t\t\t};\n\n\t\t\tmHideListener = new AnimatorListenerAdapter() {\n\t\t\t\t@Override\n\t\t\t\tpublic void onAnimationEnd(Animator animation) {\n\t\t\t\t\tmAnimator = null;\n\t\t\t\t\tmPanelShown = false;\n\t\t\t\t\tmTranslation = 0;\n\t\t\t\t\tmAlpha = 0;\n\t\t\t\t\t\n\t\t\t\t\tif (mListener != null) {\n\t\t\t\t\t\tmListener.onPanelHidden();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\t\n\tpublic void setPanelEventsListener(PanelEventsListener listener) {\n\t\tmListener = listener;\n\t}\n\n\t@Override\n\tpublic boolean onInterceptTouchEvent(MotionEvent ev) {\n\n\t\tswitch (ev.getAction()) {\n\t\tcase MotionEvent.ACTION_DOWN:\n\t\t\tfloat y = ev.getY();\n\t\t\t\n\t\t\tif (y > mBezelTopDelta) {\n\t\t\t\tfloat x = ev.getX();\n\t\t\t\t\n\t\t\t\tfloat bezelSize;\n\t\t\t\tif (mPanelShown) {\n\t\t\t\t\tbezelSize = mBezelSizeOpened;\n\t\t\t\t} else {\n\t\t\t\t\tfloat height = mPanel.getHeight() - mBezelTopDelta;\n\t\t\t\t\tif ((y - mBezelTopDelta <= 0.1 * height) ||\n\t\t\t\t\t\t\t(y - mBezelTopDelta >= 0.9 * height)) {\n\t\t\t\t\t\tbezelSize = mBezelSizeReduced;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbezelSize = mBezelSizeStandard;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ((x >= mTranslation) &&\n\t\t\t\t\t\t(x <= mTranslation + bezelSize)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MotionEvent.ACTION_UP:\n\t\tcase MotionEvent.ACTION_MOVE:\n\t\t\tif (mInSlide) {\n\t\t\t\treturn true;\n\t\t\t}\t\t\t\n\n\t\t\tbreak;\n\t\t}\n\n\t\treturn super.onInterceptTouchEvent(ev);\n\t}\n\n\t@Override\n\tpublic boolean onTouchEvent(MotionEvent event) {\n\n\t\tswitch (event.getAction()) {\n\t\tcase MotionEvent.ACTION_DOWN:\n\t\t\tfloat y = event.getY();\n\t\t\t\n\t\t\tif (y > mBezelTopDelta) {\n\t\t\t\tfloat x = event.getX();\n\t\t\t\t\n\t\t\t\tfloat bezelSize;\n\t\t\t\tif (mPanelShown) {\n\t\t\t\t\tbezelSize = mBezelSizeOpened;\n\t\t\t\t} else {\n\t\t\t\t\tfloat height = mPanel.getHeight() - mBezelTopDelta;\n\t\t\t\t\tif ((y - mBezelTopDelta <= 0.1 * height) ||\n\t\t\t\t\t\t\t(y - mBezelTopDelta >= 0.9 * height)) {\n\t\t\t\t\t\tbezelSize = mBezelSizeReduced;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbezelSize = mBezelSizeStandard;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ((x >= mTranslation) &&\n\t\t\t\t\t\t(x <= mTranslation + bezelSize)) {\n\t\t\t\t\t\n\t\t\t\t\tmInSlide = true;\n\t\t\t\t\tmLastX = event.getX();\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MotionEvent.ACTION_UP:\n\t\t\tif (mInSlide) {\n\t\t\t\tmInSlide = false;\n\t\t\t\t\n\t\t\t\tif (mLastMoveOpen) {\n\t\t\t\t\tif (mTranslation >= 0.2 * mPanel.getWidth()) {\n\t\t\t\t\t\tshowPanel();\n\t\t\t\t\t} else {\n\t\t\t\t\t\thidePanel();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (mTranslation <= 0.9 * mPanel.getWidth()) {\n\t\t\t\t\t\thidePanel();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshowPanel();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MotionEvent.ACTION_MOVE:\n\t\t\tif (mInSlide) {\n\t\t\t\t\n\t\t\t\tfloat translation = event.getX() - mLastX;\n\t\t\t\t\n\t\t\t\tmLastMoveOpen = translation >= 0;\n\t\t\t\t\n\t\t\t\tmTranslation += translation;\n\t\t\t\tmAlpha = mTranslation / mPanel.getWidth();\n\n\t\t\t\tif (mTranslation > mPanel.getWidth()) {\n\t\t\t\t\tmTranslation = mPanel.getWidth();\n\t\t\t\t\tmAlpha = 1;\n\t\t\t\t\tmPanelShown = true;\n\t\t\t\t}\n\n\t\t\t\tif (mTranslation < 0) {\n\t\t\t\t\tmTranslation = 0;\n\t\t\t\t\tmAlpha = 0;\n\t\t\t\t\tmPanelShown = false;\n\t\t\t\t}\n\n\t\t\t\tmLastX = event.getX();\n\n\t\t\t\tmContent.setTranslationX(mTranslation);\n\t\t\t\tmPanel.setAlpha(mAlpha);\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\treturn super.onTouchEvent(event);\n\t}\n\n\tpublic TabsScroller getTabsScroller() {\n\t\treturn mTabsScroller;\n\t}\n\t\t\n\tpublic void togglePanel() {\n\t\tif (mPanelShown) {\n\t\t\thidePanel();\n\t\t} else {\n\t\t\tshowPanel();\n\t\t}\n\t}\n\n\tpublic void showPanel() {\n\t\tif (mAnimator != null) {\n\t\t\tmAnimator.end();\n\t\t}\n\n\t\tmPanel.setAlpha(mAlpha);\n\n\t\tAnimatorSet animator = new AnimatorSet();\t\t\n\n\t\tAnimatorSet.Builder b = animator.play(ObjectAnimator.ofFloat(mPanel, \"alpha\", 1));\n\n\t\tb.with(ObjectAnimator.ofFloat(mContent, \"translationX\", mPanel.getWidth()));\n\n\t\tanimator.addListener(mShowListener);\n\n\t\tmAnimator = animator;\n\t\t\t\t\n\t\tmAnimator.setDuration((long) (ANIMATION_DURATION * ((mPanel.getWidth() - mTranslation) / mPanel.getWidth())));\n\t\tmAnimator.setInterpolator(new AccelerateDecelerateInterpolator());\n\n\t\tmAnimator.start();\n\t}\n\n\tpublic void hidePanel() {\n\t\tif (mAnimator != null) {\n\t\t\tmAnimator.end();\n\t\t}\n\n\t\tmPanel.setAlpha(mAlpha);\n\n\t\tAnimatorSet animator = new AnimatorSet();\n\t\tAnimatorSet.Builder b = animator.play(ObjectAnimator.ofFloat(mPanel, \"alpha\", 0));\n\n\t\tb.with(ObjectAnimator.ofFloat(mContent, \"translationX\", 0));\n\n\t\tanimator.addListener(mHideListener);\n\n\t\tmAnimator = animator;\n\n\t\tmAnimator.setDuration((long) (ANIMATION_DURATION * (mTranslation / mPanel.getWidth())));\n\t\tmAnimator.setInterpolator(new AccelerateDecelerateInterpolator());\n\n\t\tmAnimator.start();\n\t}\n\t\n\tpublic boolean isPanelShown() {\n\t\treturn mPanelShown;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/views/PhoneUrlBar.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.views;\n\nimport org.tint.R;\nimport org.tint.controllers.Controller;\nimport org.tint.model.UrlSuggestionCursorAdapter;\nimport org.tint.model.UrlSuggestionCursorAdapter.QueryBuilderListener;\nimport org.tint.providers.BookmarksProvider;\nimport org.tint.providers.BookmarksWrapper;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.AdapterView;\nimport android.widget.AutoCompleteTextView;\nimport android.widget.FilterQueryProvider;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.PopupMenu;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.SimpleCursorAdapter.CursorToStringConverter;\n\npublic class PhoneUrlBar extends LinearLayout {\n\t\n\tpublic interface OnPhoneUrlBarEventListener {\n\t\t\n\t\tvoid onVisibilityChanged(boolean urlBarVisible);\n\t\t\n\t\tvoid onUrlValidated();\n\t\t\n\t\tvoid onGoStopReloadClicked();\n\t\t\n\t\tvoid onMenuVisibilityChanged(boolean isVisible);\n\t\t\n\t}\n\t\n\tprivate Context mContext;\n\tprivate Activity mActivity;\n\t\n\tprivate PopupMenu mPopupMenu;\n\t\n\tprivate LinearLayout mTitleLayout;\n\tprivate LinearLayout mUrlLayout;\n\t\n\tprivate TextView mTitle;\n\tprivate TextView mSubTitle;\n\t\n\tprivate AutoCompleteTextView mUrl;\n\t\n\tprivate ImageView mPrivateBrowsing;\n\t\n\tprivate ImageView mGoStopReload;\t\n\tprivate ImageView mMenuButton;\n\t\n\tprivate TextWatcher mUrlTextWatcher;\n\t\n\tprivate boolean mIsUrlBarVisible = false;\n\tprivate boolean mIsUrlChangedByUser = false;\n\t\n\tprivate OnPhoneUrlBarEventListener mEventListener = null;\n\t\n\tprivate boolean mOverflowMenuShowing;\n\n\tpublic PhoneUrlBar(Context context) {\n\t\tthis(context, null);\n\t}\n\n\tpublic PhoneUrlBar(Context context, AttributeSet attrs) {\n\t\tthis(context, attrs, 0);\n\t}\n\t\n\tpublic PhoneUrlBar(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\t\n\t\tmContext = context;\n\t\t\n\t\tmActivity = Controller.getInstance().getMainActivity();\n\t\t\n\t\tLayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\tView v = layoutInflater.inflate(R.layout.phone_url_bar, this);\n\t\t\n\t\tmPrivateBrowsing = (ImageView) v.findViewById(R.id.ImagePrivateBrowsing);\n\t\t\n\t\tmTitleLayout = (LinearLayout) v.findViewById(R.id.UrlBarTitleLayout);\n\t\tmUrlLayout = (LinearLayout) v.findViewById(R.id.UrlBarUrlLayout);\n\t\t\n\t\tmTitle = (TextView) v.findViewById(R.id.UrlBarTitle);\n\t\tmSubTitle = (TextView) v.findViewById(R.id.UrlBarSubTitle);\n\t\t\n\t\tmUrl = (AutoCompleteTextView) v.findViewById(R.id.UrlBarUrlEdit);\n\t\t\n\t\tmGoStopReload = (ImageView) v.findViewById(R.id.UrlBarGoStopReload);\n\t\t\n\t\tmMenuButton = (ImageView) v.findViewById(R.id.MenuButton);\n\t\t\n\t\tif (ViewConfiguration.get(mContext).hasPermanentMenuKey()) {\n\t\t\tmMenuButton.setVisibility(View.GONE);\n\t\t\t\n\t\t\tRelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mGoStopReload.getLayoutParams();\n\t\t\tparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);\n\t\t\tmGoStopReload.setLayoutParams(params);\n\t\t} else {\n\t\t\tmMenuButton.setOnClickListener(new OnClickListener() {\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void onClick(View v) {\n\t\t\t\t\t\n\t\t\t\t\tif (mActivity == null) {\n\t\t\t\t\t\tmActivity = Controller.getInstance().getMainActivity();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (mPopupMenu == null) {\n\t\t\t            mPopupMenu = new PopupMenu(mContext, mMenuButton);\n\t\t\t            \n\t\t\t            mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t@Override\n\t\t\t\t\t\t\tpublic boolean onMenuItemClick(MenuItem item) {\n\t\t\t\t\t\t\t\treturn mActivity.onOptionsItemSelected(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t            \n\t\t\t            mPopupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t@Override\n\t\t\t\t\t\t\tpublic void onDismiss(PopupMenu menu) {\n\t\t\t\t\t\t\t\tif (menu == mPopupMenu) {\n\t\t\t\t\t\t\t\t\tmOverflowMenuShowing = false;\n\t\t\t\t\t\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\t\t\t\t\t\tmEventListener.onMenuVisibilityChanged(mOverflowMenuShowing);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t            \n\t\t\t            if (!mActivity.onCreateOptionsMenu(mPopupMenu.getMenu())) {\n\t\t\t                mPopupMenu = null;\n\t\t\t                return;\n\t\t\t            }\n\t\t\t        }\n\t\t\t        Menu menu = mPopupMenu.getMenu();\n\t\t\t        if (mActivity.onPrepareOptionsMenu(menu)) {\n\t\t\t            mOverflowMenuShowing = true;\n\t\t\t            mPopupMenu.show();\n\t\t\t            \n\t\t\t            if (mEventListener != null) {\n\t\t\t\t\t\t\tmEventListener.onMenuVisibilityChanged(mOverflowMenuShowing);\n\t\t\t\t\t\t}\n\t\t\t        }\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tmTitleLayout.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tshowUrl();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmTitle.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tshowUrl();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmSubTitle.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tshowUrl();\n\t\t\t}\n\t\t});\n\t\t\n\t\tString[] from = new String[] { BookmarksProvider.Columns.TITLE, BookmarksProvider.Columns.URL };\n    \tint[] to = new int[] {R.id.AutocompleteTitle, R.id.AutocompleteUrl};\n    \t\n\t\tUrlSuggestionCursorAdapter adapter = new UrlSuggestionCursorAdapter(\n\t\t\t\tmContext,\n\t\t\t\tR.layout.url_autocomplete_line,\n\t\t\t\tnull,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\t0,\n\t\t\t\tnew QueryBuilderListener() {\t\t\t\t\t\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onSuggestionSelected(String url) {\n\t\t\t\t\t\tsetUrl(url);\n\t\t\t\t\t\tmUrl.setSelection(url.length());\n\t\t\t\t\t}\n\t\t\t\t});\n    \t\n    \tadapter.setCursorToStringConverter(new CursorToStringConverter() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic CharSequence convertToString(Cursor cursor) {\n\t\t\t\tString aColumnString = cursor.getString(cursor.getColumnIndex(BookmarksProvider.Columns.URL));\n                return aColumnString;\n\t\t\t}\n\t\t});\n    \t\n    \tadapter.setFilterQueryProvider(new FilterQueryProvider() {\t\t\n\t\t\t@Override\n\t\t\tpublic Cursor runQuery(CharSequence constraint) {\n\t\t\t\tif ((constraint != null) &&\n\t\t\t\t\t\t(constraint.length() > 0)) {\n\t\t\t\t\treturn BookmarksWrapper.getUrlSuggestions(mContext.getContentResolver(),\n\t\t\t\t\t\t\tconstraint.toString());\n\t\t\t\t} else {\n\t\t\t\t\treturn BookmarksWrapper.getUrlSuggestions(mContext.getContentResolver(),\n\t\t\t\t\t\t\tnull);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n    \t\n    \tmUrl.setThreshold(1);\n    \tmUrl.setAdapter(adapter);\n    \t\n    \tmUrlTextWatcher = new TextWatcher() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onTextChanged(CharSequence s, int start, int before, int count) { }\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void beforeTextChanged(CharSequence s, int start, int count, \tint after) { }\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void afterTextChanged(Editable s) {\n\t\t\t\tmIsUrlChangedByUser = true;\t\t\n\t\t\t\tmGoStopReload.setImageResource(R.drawable.ic_go);\n\t\t\t}\n\t\t};\n\t\t\n\t\tmUrl.addTextChangedListener(mUrlTextWatcher);\n\t\t\n\t\tmUrl.setOnKeyListener(new OnKeyListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic boolean onKey(View v, int keyCode, KeyEvent event) {\n\t\t\t\tif ((event.getAction() == KeyEvent.ACTION_DOWN) &&\n\t\t\t\t\t\t(keyCode == KeyEvent.KEYCODE_ENTER)) {\t\t\t\t\t\n\t\t\t\t\ttriggerOnUrlValidated();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\t\n\t\tmUrl.setOnItemClickListener(new OnItemClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {\n\t\t\t\ttriggerOnUrlValidated();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmUrl.setDropDownAnchor(R.id.UrlBarContainer);\n\t\t\n\t\tmGoStopReload.setOnClickListener(new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\tmEventListener.onGoStopReloadClicked();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tpublic void setTitle(String title) {\n\t\tmTitle.setText(title);\n\t}\n\t\n\tpublic void setTitle(int resId) {\n\t\tsetTitle(mContext.getString(resId));\n\t}\n\t\n\tpublic void setTitleOnly(String title) {\n\t\tmTitle.setText(title);\t\n\t\t\t\t\n\t\tmSubTitle.setText(null);\n\t\tmSubTitle.setVisibility(View.GONE);\n\t}\n\t\n\tpublic void setTitleOnly(int resId) {\n\t\tsetTitleOnly(mContext.getString(resId));\n\t}\n\t\n\tpublic void setSubtitle(String subtitle) {\n\t\tmSubTitle.setText(subtitle);\n\t\t\n\t\tif ((subtitle == null) ||\n\t\t\t\t(subtitle.isEmpty())) {\n\t\t\tmSubTitle.setVisibility(View.GONE);\n\t\t} else {\n\t\t\tmSubTitle.setVisibility(View.VISIBLE);\n\t\t}\n\t}\n\t\n\tpublic void setSubtitle(int resId) {\n\t\tsetSubtitle(mContext.getString(resId));\n\t}\n\t\n\tpublic void showUrl() {\n\t\tmTitleLayout.setVisibility(View.GONE);\n\t\tmUrlLayout.setVisibility(View.VISIBLE);\n\t\t\n\t\tmIsUrlBarVisible = true;\n\t\tmUrl.requestFocus();\n\t\t\n\t\tInputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\tmgr.showSoftInput(mUrl, InputMethodManager.SHOW_IMPLICIT);\n\t\t\n\t\ttriggerOnUrlBarVisibilityChanged();\n\t}\n\t\n\tpublic void hideUrl() {\n\t\thideUrl(true);\n\t}\n\t\n\tpublic void hideUrl(boolean hideKeyboard) {\n\t\tmUrlLayout.setVisibility(View.GONE);\n\t\tmTitleLayout.setVisibility(View.VISIBLE);\n\t\t\n\t\tmIsUrlBarVisible = false;\n\t\t\n\t\tif (hideKeyboard) {\n\t\t\tInputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\t\tmgr.hideSoftInputFromWindow(mUrl.getWindowToken(), 0);\n\t\t}\n\t\t\n\t\ttriggerOnUrlBarVisibilityChanged();\n\t}\n\t\n\tpublic boolean isUrlBarVisible() {\n\t\treturn mIsUrlBarVisible;\n\t}\n\t\n\tpublic String getUrl() {\n\t\treturn mUrl.getText().toString();\n\t}\n\t\n\tpublic void setUrl(String url) {\n\t\tmUrl.removeTextChangedListener(mUrlTextWatcher);\n\t\tmUrl.setText(url);\n\t\tmUrl.addTextChangedListener(mUrlTextWatcher);\n\t\tmIsUrlChangedByUser = false;\n\t}\n\t\n\tpublic boolean isUrlChangedByUser() {\n\t\treturn mIsUrlChangedByUser;\n\t}\n\t\n\tpublic void setGoStopReloadImage(int resId) {\n\t\tmGoStopReload.setImageResource(resId);\n\t}\n\t\n\tpublic void showGoStopReloadButton() {\n\t\tmGoStopReload.setVisibility(View.VISIBLE);\n\t}\n\t\n\tpublic void hideGoStopReloadButton() {\n\t\tmGoStopReload.setVisibility(View.GONE);\n\t}\n\t\n\tpublic void setEventListener(OnPhoneUrlBarEventListener listener) {\n\t\tmEventListener = listener;\n\t}\n\t\n\tpublic boolean isMenuShowing() {\n\t\treturn mOverflowMenuShowing;\n\t}\n\t\n\tpublic void setPrivateBrowsingIndicator(boolean value) {\n\t\tif (value) {\n\t\t\tmPrivateBrowsing.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\tmPrivateBrowsing.setVisibility(View.GONE);\n\t\t}\n\t}\n\t\n\tprivate void triggerOnUrlBarVisibilityChanged() {\n\t\tif (mEventListener != null) {\n\t\t\tmEventListener.onVisibilityChanged(mIsUrlBarVisible);\n\t\t}\n\t}\n\t\n\tprivate void triggerOnUrlValidated() {\n\t\tif (mEventListener != null) {\n\t\t\tmEventListener.onUrlValidated();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/views/ScrollerView.java",
    "content": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * Class taken from the stock browser in AOSP.\n * Only slightly modified to meet Tint's needs.\n */\n\npackage org.tint.ui.views;\n\nimport android.content.Context;\nimport android.graphics.PointF;\nimport android.graphics.Rect;\nimport android.util.AttributeSet;\nimport android.view.FocusFinder;\nimport android.view.InputDevice;\nimport android.view.KeyEvent;\nimport android.view.MotionEvent;\nimport android.view.VelocityTracker;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewDebug;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\nimport android.view.accessibility.AccessibilityEvent;\nimport android.view.accessibility.AccessibilityNodeInfo;\nimport android.view.animation.AnimationUtils;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\nimport android.widget.OverScroller;\nimport android.widget.TextView;\n\nimport java.util.List;\n\n/**\n * Layout container for a view hierarchy that can be scrolled by the user,\n * allowing it to be larger than the physical display.  A ScrollView\n * is a {@link FrameLayout}, meaning you should place one child in it\n * containing the entire contents to scroll; this child may itself be a layout\n * manager with a complex hierarchy of objects.  A child that is often used\n * is a {@link LinearLayout} in a vertical orientation, presenting a vertical\n * array of top-level items that the user can scroll through.\n *\n * <p>The {@link TextView} class also\n * takes care of its own scrolling, so does not require a ScrollView, but\n * using the two together is possible to achieve the effect of a text view\n * within a larger container.\n *\n * <p>ScrollView only supports vertical scrolling.\n *\n * @attr ref android.R.styleable#ScrollView_fillViewport\n */\npublic class ScrollerView extends FrameLayout {\n\tstatic final int ANIMATED_SCROLL_GAP = 250;\n\n\tstatic final float MAX_SCROLL_FACTOR = 0.5f;\n\n\tprivate long mLastScroll;\n\n\tprivate final Rect mTempRect = new Rect();\n\tprotected OverScroller mScroller;\n\n\t/**\n\t * Position of the last motion event.\n\t */\n\tprivate float mLastMotionY;\n\n\t/**\n\t * True when the layout has changed but the traversal has not come through yet.\n\t * Ideally the view hierarchy would keep track of this for us.\n\t */\n\tprivate boolean mIsLayoutDirty = true;\n\n\t/**\n\t * The child to give focus to in the event that a child has requested focus while the\n\t * layout is dirty. This prevents the scroll from being wrong if the child has not been\n\t * laid out before requesting focus.\n\t */\n\tprotected View mChildToScrollTo = null;\n\n\t/**\n\t * True if the user is currently dragging this ScrollView around. This is\n\t * not the same as 'is being flinged', which can be checked by\n\t * mScroller.isFinished() (flinging begins when the user lifts his finger).\n\t */\n\tprotected boolean mIsBeingDragged = false;\n\n\t/**\n\t * Determines speed during touch scrolling\n\t */\n\tprivate VelocityTracker mVelocityTracker;\n\n\t/**\n\t * When set to true, the scroll view measure its child to make it fill the currently\n\t * visible area.\n\t */\n\t@ViewDebug.ExportedProperty(category = \"layout\")\n\tprivate boolean mFillViewport;\n\n\t/**\n\t * Whether arrow scrolling is animated.\n\t */\n\tprivate boolean mSmoothScrollingEnabled = true;\n\n\tprivate int mTouchSlop;\n\tprotected int mMinimumVelocity;\n\tprivate int mMaximumVelocity;\n\n\tprivate int mOverscrollDistance;\n\tprivate int mOverflingDistance;\n\n\t/**\n\t * ID of the active pointer. This is used to retain consistency during\n\t * drags/flings if multiple pointers are used.\n\t */\n\tprivate int mActivePointerId = INVALID_POINTER;\n\n\t/**\n\t * The StrictMode \"critical time span\" objects to catch animation\n\t * stutters.  Non-null when a time-sensitive animation is\n\t * in-flight.  Must call finish() on them when done animating.\n\t * These are no-ops on user builds.\n\t */\n\tprivate Span mScrollStrictSpan = null;  // aka \"drag\"\n\tprivate Span mFlingStrictSpan = null;\n\n\t/**\n\t * Sentinel value for no current active pointer.\n\t * Used by {@link #mActivePointerId}.\n\t */\n\tprivate static final int INVALID_POINTER = -1;\n\n\t/**\n\t * orientation of the scrollview\n\t */\n\tprotected boolean mHorizontal;\n\n\tprotected boolean mIsOrthoDragged;\n\tprivate float mLastOrthoCoord;\n\tprivate View mDownView;\n\tprivate PointF mDownCoords;\n\n\tprivate float mScrollFactor;\n\n\tpublic ScrollerView(Context context) {\n\t\tthis(context, null);\n\t}\n\n\tpublic ScrollerView(Context context, AttributeSet attrs) {\n\t\tthis(context, attrs, 0);\n\t}\n\n\tpublic ScrollerView(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\tinitScrollView();\n\t\tsetFillViewport(true);\n\t}\n\n\tprivate void initScrollView() {\n\t\tmScroller = new OverScroller(getContext());\n\t\tsetFocusable(true);\n\t\tsetDescendantFocusability(FOCUS_AFTER_DESCENDANTS);\n\t\tsetWillNotDraw(false);\n\t\tfinal ViewConfiguration configuration = ViewConfiguration.get(getContext());\n\t\tmTouchSlop = configuration.getScaledTouchSlop();\n\t\tmMinimumVelocity = configuration.getScaledMinimumFlingVelocity();\n\t\tmMaximumVelocity = configuration.getScaledMaximumFlingVelocity();\n\t\tmOverscrollDistance = configuration.getScaledOverscrollDistance();\n\t\tmOverflingDistance = configuration.getScaledOverflingDistance();\n\t\tmDownCoords = new PointF();\n\n\t\tmScrollFactor = 64 * getContext().getResources().getDisplayMetrics().density + 0.5f;\n\t}\n\n\tpublic void setOrientation(int orientation) {\n\t\tmHorizontal = (orientation == LinearLayout.HORIZONTAL);\n\t\trequestLayout();\n\t}\n\n\t@Override\n\tpublic boolean shouldDelayChildPressedState() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tprotected float getTopFadingEdgeStrength() {\n\t\tif (getChildCount() == 0) {\n\t\t\treturn 0.0f;\n\t\t}\n\t\tif (mHorizontal) {\n\t\t\tfinal int length = getHorizontalFadingEdgeLength();\n\t\t\tif (getScrollX() < length) {\n\t\t\t\treturn getScrollX() / (float) length;\n\t\t\t}\n\t\t} else {\n\t\t\tfinal int length = getVerticalFadingEdgeLength();\n\t\t\tif (getScrollY() < length) {\n\t\t\t\treturn getScrollY() / (float) length;\n\t\t\t}\n\t\t}\n\t\treturn 1.0f;\n\t}\n\n\t@Override\n\tprotected float getBottomFadingEdgeStrength() {\n\t\tif (getChildCount() == 0) {\n\t\t\treturn 0.0f;\n\t\t}\n\t\tif (mHorizontal) {\n\t\t\tfinal int length = getHorizontalFadingEdgeLength();\n\t\t\tfinal int bottomEdge = getWidth() - getPaddingRight();\n\t\t\tfinal int span = getChildAt(0).getRight() - getScrollX() - bottomEdge;\n\t\t\tif (span < length) {\n\t\t\t\treturn span / (float) length;\n\t\t\t}\n\t\t} else {\n\t\t\tfinal int length = getVerticalFadingEdgeLength();\n\t\t\tfinal int bottomEdge = getHeight() - getPaddingBottom();\n\t\t\tfinal int span = getChildAt(0).getBottom() - getScrollY() - bottomEdge;\n\t\t\tif (span < length) {\n\t\t\t\treturn span / (float) length;\n\t\t\t}\n\t\t}\n\t\treturn 1.0f;\n\t}\n\n\t/**\n\t * @return The maximum amount this scroll view will scroll in response to\n\t *   an arrow event.\n\t */\n\tpublic int getMaxScrollAmount() {\n\t\treturn (int) (MAX_SCROLL_FACTOR * (mHorizontal\n\t\t\t\t? (getRight() - getLeft()) : (getBottom() - getTop())));\n\t}\n\n\n\t@Override\n\tpublic void addView(View child) {\n\t\tif (getChildCount() > 0) {\n\t\t\tthrow new IllegalStateException(\"ScrollView can host only one direct child\");\n\t\t}\n\n\t\tsuper.addView(child);\n\t}\n\n\t@Override\n\tpublic void addView(View child, int index) {\n\t\tif (getChildCount() > 0) {\n\t\t\tthrow new IllegalStateException(\"ScrollView can host only one direct child\");\n\t\t}\n\n\t\tsuper.addView(child, index);\n\t}\n\n\t@Override\n\tpublic void addView(View child, ViewGroup.LayoutParams params) {\n\t\tif (getChildCount() > 0) {\n\t\t\tthrow new IllegalStateException(\"ScrollView can host only one direct child\");\n\t\t}\n\n\t\tsuper.addView(child, params);\n\t}\n\n\t@Override\n\tpublic void addView(View child, int index, ViewGroup.LayoutParams params) {\n\t\tif (getChildCount() > 0) {\n\t\t\tthrow new IllegalStateException(\"ScrollView can host only one direct child\");\n\t\t}\n\n\t\tsuper.addView(child, index, params);\n\t}\n\n\t/**\n\t * @return Returns true this ScrollView can be scrolled\n\t */\n\tprivate boolean canScroll() {\n\t\tView child = getChildAt(0);\n\t\tif (child != null) {\n\t\t\tif (mHorizontal) {\n\t\t\t\treturn getWidth() < child.getWidth() + getPaddingLeft() + getPaddingRight();\n\t\t\t} else {\n\t\t\t\treturn getHeight() < child.getHeight() + getPaddingTop() + getPaddingBottom();\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Indicates whether this ScrollView's content is stretched to fill the viewport.\n\t *\n\t * @return True if the content fills the viewport, false otherwise.\n\t *\n\t * @attr ref android.R.styleable#ScrollView_fillViewport\n\t */\n\tpublic boolean isFillViewport() {\n\t\treturn mFillViewport;\n\t}\n\n\t/**\n\t * Indicates this ScrollView whether it should stretch its content height to fill\n\t * the viewport or not.\n\t *\n\t * @param fillViewport True to stretch the content's height to the viewport's\n\t *        boundaries, false otherwise.\n\t *\n\t * @attr ref android.R.styleable#ScrollView_fillViewport\n\t */\n\tpublic void setFillViewport(boolean fillViewport) {\n\t\tif (fillViewport != mFillViewport) {\n\t\t\tmFillViewport = fillViewport;\n\t\t\trequestLayout();\n\t\t}\n\t}\n\n\t/**\n\t * @return Whether arrow scrolling will animate its transition.\n\t */\n\tpublic boolean isSmoothScrollingEnabled() {\n\t\treturn mSmoothScrollingEnabled;\n\t}\n\n\t/**\n\t * Set whether arrow scrolling will animate its transition.\n\t * @param smoothScrollingEnabled whether arrow scrolling will animate its transition\n\t */\n\tpublic void setSmoothScrollingEnabled(boolean smoothScrollingEnabled) {\n\t\tmSmoothScrollingEnabled = smoothScrollingEnabled;\n\t}\n\n\t@Override\n\tprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n\t\tsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);\n\n\t\tif (!mFillViewport) {\n\t\t\treturn;\n\t\t}\n\n\t\tfinal int heightMode = MeasureSpec.getMode(heightMeasureSpec);\n\t\tif (heightMode == MeasureSpec.UNSPECIFIED) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (getChildCount() > 0) {\n\t\t\tfinal View child = getChildAt(0);\n\t\t\tif (mHorizontal) {\n\t\t\t\tint width = getMeasuredWidth();\n\t\t\t\tif (child.getMeasuredWidth() < width) {\n\t\t\t\t\tfinal FrameLayout.LayoutParams lp = (LayoutParams) child\n\t\t\t\t\t\t\t.getLayoutParams();\n\n\t\t\t\t\tint childHeightMeasureSpec = getChildMeasureSpec(\n\t\t\t\t\t\t\theightMeasureSpec, getPaddingTop() + getPaddingBottom(),\n\t\t\t\t\t\t\tlp.height);\n\t\t\t\t\twidth -= getPaddingLeft();\n\t\t\t\t\twidth -= getPaddingRight();\n\t\t\t\t\tint childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(\n\t\t\t\t\t\t\twidth, MeasureSpec.EXACTLY);\n\n\t\t\t\t\tchild.measure(childWidthMeasureSpec, childHeightMeasureSpec);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tint height = getMeasuredHeight();\n\t\t\t\tif (child.getMeasuredHeight() < height) {\n\t\t\t\t\tfinal FrameLayout.LayoutParams lp = (LayoutParams) child\n\t\t\t\t\t\t\t.getLayoutParams();\n\n\t\t\t\t\tint childWidthMeasureSpec = getChildMeasureSpec(\n\t\t\t\t\t\t\twidthMeasureSpec, getPaddingLeft() + getPaddingRight(),\n\t\t\t\t\t\t\tlp.width);\n\t\t\t\t\theight -= getPaddingTop();\n\t\t\t\t\theight -= getPaddingBottom();\n\t\t\t\t\tint childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(\n\t\t\t\t\t\t\theight, MeasureSpec.EXACTLY);\n\n\t\t\t\t\tchild.measure(childWidthMeasureSpec, childHeightMeasureSpec);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean dispatchKeyEvent(KeyEvent event) {\n\t\t// Let the focused view and/or our descendants get the key first\n\t\treturn super.dispatchKeyEvent(event) || executeKeyEvent(event);\n\t}\n\n\t/**\n\t * You can call this function yourself to have the scroll view perform\n\t * scrolling from a key event, just as if the event had been dispatched to\n\t * it by the view hierarchy.\n\t *\n\t * @param event The key event to execute.\n\t * @return Return true if the event was handled, else false.\n\t */\n\tpublic boolean executeKeyEvent(KeyEvent event) {\n\t\tmTempRect.setEmpty();\n\n\t\tif (!canScroll()) {\n\t\t\tif (isFocused() && event.getKeyCode() != KeyEvent.KEYCODE_BACK) {\n\t\t\t\tView currentFocused = findFocus();\n\t\t\t\tif (currentFocused == this) currentFocused = null;\n\t\t\t\tView nextFocused = FocusFinder.getInstance().findNextFocus(this,\n\t\t\t\t\t\tcurrentFocused, View.FOCUS_DOWN);\n\t\t\t\treturn nextFocused != null\n\t\t\t\t\t\t&& nextFocused != this\n\t\t\t\t\t\t&& nextFocused.requestFocus(View.FOCUS_DOWN);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean handled = false;\n\t\tif (event.getAction() == KeyEvent.ACTION_DOWN) {\n\t\t\tswitch (event.getKeyCode()) {\n\t\t\tcase KeyEvent.KEYCODE_DPAD_UP:\n\t\t\t\tif (!event.isAltPressed()) {\n\t\t\t\t\thandled = arrowScroll(View.FOCUS_UP);\n\t\t\t\t} else {\n\t\t\t\t\thandled = fullScroll(View.FOCUS_UP);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase KeyEvent.KEYCODE_DPAD_DOWN:\n\t\t\t\tif (!event.isAltPressed()) {\n\t\t\t\t\thandled = arrowScroll(View.FOCUS_DOWN);\n\t\t\t\t} else {\n\t\t\t\t\thandled = fullScroll(View.FOCUS_DOWN);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase KeyEvent.KEYCODE_SPACE:\n\t\t\t\tpageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn handled;\n\t}\n\n\tprivate boolean inChild(int x, int y) {\n\t\tif (getChildCount() > 0) {\n\t\t\tfinal int scrollY = getScrollY();\n\t\t\tfinal View child = getChildAt(0);\n\t\t\treturn !(y < child.getTop() - scrollY\n\t\t\t\t\t|| y >= child.getBottom() - scrollY\n\t\t\t\t\t|| x < child.getLeft()\n\t\t\t\t\t|| x >= child.getRight());\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate void initOrResetVelocityTracker() {\n\t\tif (mVelocityTracker == null) {\n\t\t\tmVelocityTracker = VelocityTracker.obtain();\n\t\t} else {\n\t\t\tmVelocityTracker.clear();\n\t\t}\n\t}\n\n\tprivate void initVelocityTrackerIfNotExists() {\n\t\tif (mVelocityTracker == null) {\n\t\t\tmVelocityTracker = VelocityTracker.obtain();\n\t\t}\n\t}\n\n\tprivate void recycleVelocityTracker() {\n\t\tif (mVelocityTracker != null) {\n\t\t\tmVelocityTracker.recycle();\n\t\t\tmVelocityTracker = null;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n\t\tif (disallowIntercept) {\n\t\t\trecycleVelocityTracker();\n\t\t}\n\t\tsuper.requestDisallowInterceptTouchEvent(disallowIntercept);\n\t}\n\n\t@Override\n\tpublic boolean onInterceptTouchEvent(MotionEvent ev) {\n\t\t/*\n\t\t * This method JUST determines whether we want to intercept the motion.\n\t\t * If we return true, onMotionEvent will be called and we do the actual\n\t\t * scrolling there.\n\t\t */\n\n\t\t/*\n\t\t * Shortcut the most recurring case: the user is in the dragging state\n\t\t * and he is moving his finger. We want to intercept this motion.\n\t\t */\n\t\tfinal int action = ev.getAction();\n\t\t\n\t\tif ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {\n\t\t\treturn true;\n\t\t}\n\t\tif ((action == MotionEvent.ACTION_MOVE) && (mIsOrthoDragged)) {\n\t\t\treturn true;\n\t\t}\n\t\tswitch (action & MotionEvent.ACTION_MASK) {\n\t\tcase MotionEvent.ACTION_MOVE: {\n\t\t\t/*\n\t\t\t * mIsBeingDragged == false, otherwise the shortcut would have\n\t\t\t * caught it. Check whether the user has moved far enough from his\n\t\t\t * original down touch.\n\t\t\t */\n\n\t\t\t/*\n\t\t\t * Locally do absolute value. mLastMotionY is set to the y value of\n\t\t\t * the down event.\n\t\t\t */\n\t\t\tfinal int activePointerId = mActivePointerId;\n\t\t\tif (activePointerId == INVALID_POINTER) {\n\t\t\t\t// If we don't have a valid id, the touch down wasn't on\n\t\t\t\t// content.\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tfinal int pointerIndex = ev.findPointerIndex(activePointerId);\n\t\t\tfinal float y = mHorizontal ? ev.getX(pointerIndex) : ev\n\t\t\t\t\t.getY(pointerIndex);\n\t\t\tfinal int yDiff = (int) Math.abs(y - mLastMotionY);\n\t\t\tif (yDiff > mTouchSlop) {\n\t\t\t\tmIsBeingDragged = true;\n\t\t\t\tmLastMotionY = y;\n\t\t\t\tinitVelocityTrackerIfNotExists();\n\t\t\t\tmVelocityTracker.addMovement(ev);\n\t\t\t\tif (mScrollStrictSpan == null) {\n\t\t\t\t\tmScrollStrictSpan = enterCriticalSpan(\"ScrollView-scroll\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfinal float ocoord = mHorizontal ? ev.getY(pointerIndex) : ev\n\t\t\t\t\t\t.getX(pointerIndex);\n\t\t\t\tif (Math.abs(ocoord - mLastOrthoCoord) > mTouchSlop) {\n\t\t\t\t\tmIsOrthoDragged = true;\n\t\t\t\t\tmLastOrthoCoord = ocoord;\n\t\t\t\t\tinitVelocityTrackerIfNotExists();\n\t\t\t\t\tmVelocityTracker.addMovement(ev);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase MotionEvent.ACTION_DOWN: {\n\t\t\tfinal float y = mHorizontal ? ev.getX() : ev.getY();\n\t\t\tmDownCoords.x = ev.getX();\n\t\t\tmDownCoords.y = ev.getY();\n\t\t\tif (!inChild((int) ev.getX(), (int) ev.getY())) {\n\t\t\t\tmIsBeingDragged = false;\n\t\t\t\trecycleVelocityTracker();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Remember location of down touch. ACTION_DOWN always refers to\n\t\t\t * pointer index 0.\n\t\t\t */\n\t\t\tmLastMotionY = y;\n\t\t\tmActivePointerId = ev.getPointerId(0);\n\n\t\t\tinitOrResetVelocityTracker();\n\t\t\tmVelocityTracker.addMovement(ev);\n\t\t\t/*\n\t\t\t * If being flinged and user touches the screen, initiate drag;\n\t\t\t * otherwise don't. mScroller.isFinished should be false when being\n\t\t\t * flinged.\n\t\t\t */\n\t\t\tmIsBeingDragged = !mScroller.isFinished();\n\t\t\tif (mIsBeingDragged && mScrollStrictSpan == null) {\n\t\t\t\tmScrollStrictSpan = enterCriticalSpan(\"ScrollView-scroll\");\n\t\t\t}\n\t\t\tmIsOrthoDragged = false;\n\t\t\tfinal float ocoord = mHorizontal ? ev.getY() : ev.getX();\n\t\t\tmLastOrthoCoord = ocoord;\n\t\t\tmDownView = findViewAt((int) ev.getX(), (int) ev.getY());\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\n\t\tcase MotionEvent.ACTION_CANCEL:\n\t\tcase MotionEvent.ACTION_UP:\n\t\t\t/* Release the drag */\n\t\t\tmIsBeingDragged = false;\n\t\t\tmIsOrthoDragged = false;\n\t\t\tmActivePointerId = INVALID_POINTER;\n\t\t\trecycleVelocityTracker();\n\t\t\tif (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,\n\t\t\t\t\tgetScrollRange())) {\n\t\t\t\tinvalidate();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase MotionEvent.ACTION_POINTER_UP:\n\t\t\tonSecondaryPointerUp(ev);\n\t\t\tbreak;\n\t\t}\n\n\t\t/*\n\t\t * The only time we want to intercept motion events is if we are in the\n\t\t * drag mode.\n\t\t */\n\t\treturn mIsBeingDragged || mIsOrthoDragged;\n\t}\n\n\t@Override\n\tpublic boolean onTouchEvent(MotionEvent ev) {\n\t\tinitVelocityTrackerIfNotExists();\n\t\tmVelocityTracker.addMovement(ev);\n\n\t\tfinal int action = ev.getAction();\n\t\tswitch (action & MotionEvent.ACTION_MASK) {\n\t\tcase MotionEvent.ACTION_DOWN: {\n\t\t\tmIsBeingDragged = getChildCount() != 0;\n\t\t\tif (!mIsBeingDragged) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If being flinged and user touches, stop the fling. isFinished\n\t\t\t * will be false if being flinged.\n\t\t\t */\n\t\t\tif (!mScroller.isFinished()) {\n\t\t\t\tmScroller.abortAnimation();\n\t\t\t\tif (mFlingStrictSpan != null) {\n\t\t\t\t\tmFlingStrictSpan.finish();\n\t\t\t\t\tmFlingStrictSpan = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remember where the motion event started\n\t\t\tmLastMotionY = mHorizontal ? ev.getX() : ev.getY();\n\t\t\tmActivePointerId = ev.getPointerId(0);\n\t\t\tbreak;\n\t\t}\n\t\tcase MotionEvent.ACTION_MOVE:\n\t\t\t\n\t\t\tfinal int activePointerIndex = ev.findPointerIndex(mActivePointerId);\n\t\t\tfinal float x = ev.getX(activePointerIndex);\n\t\t\tfloat y = ev.getY(activePointerIndex);\n\t\t\t\n//\t\t\tif (mIsOrthoDragged) {\n\t\t\tif (isOrthoMove(x - mDownCoords.x, y - mDownCoords.y)) {\n\t\t\t\tmIsOrthoDragged = true;\n\t\t\t\t// Scroll to follow the motion event\n//\t\t\t\tfinal int activePointerIndex = ev.findPointerIndex(mActivePointerId);\n//\t\t\t\tfinal float x = ev.getX(activePointerIndex);\n//\t\t\t\tfinal float y = ev.getY(activePointerIndex);\n//\t\t\t\tif (isOrthoMove(x - mDownCoords.x, y - mDownCoords.y)) {\n\t\t\t\t\tonOrthoDrag(mDownView, mHorizontal\n\t\t\t\t\t\t\t? y - mDownCoords.y\n\t\t\t\t\t\t\t\t\t: x - mDownCoords.x);\n//\t\t\t\t}\n\t\t\t} else if (mIsBeingDragged) {\n\t\t\t\t// Scroll to follow the motion event\n//\t\t\t\tfinal int activePointerIndex = ev.findPointerIndex(mActivePointerId);\n//\t\t\t\tfinal float y = mHorizontal ? ev.getX(activePointerIndex) : ev.getY(activePointerIndex);\n\t\t\t\ty = mHorizontal ? ev.getX(activePointerIndex) : ev.getY(activePointerIndex);\n\t\t\t\tfinal int deltaY = (int) (mLastMotionY - y);\n\t\t\t\tmLastMotionY = y;\n\n\t\t\t\tfinal int oldX = getScrollX();\n\t\t\t\tfinal int oldY = getScrollY();\n\t\t\t\tfinal int range = getScrollRange();\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\tif (overScrollBy(deltaY, 0, getScrollX(), 0, range, 0,\n\t\t\t\t\t\t\tmOverscrollDistance, 0, true)) {\n\t\t\t\t\t\t// Break our velocity if we hit a scroll barrier.\n\t\t\t\t\t\tmVelocityTracker.clear();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (overScrollBy(0, deltaY, 0, getScrollY(), 0, range,\n\t\t\t\t\t\t\t0, mOverscrollDistance, true)) {\n\t\t\t\t\t\t// Break our velocity if we hit a scroll barrier.\n\t\t\t\t\t\tmVelocityTracker.clear();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tonScrollChanged(getScrollX(), getScrollY(), oldX, oldY);\n\n\t\t\t\tfinal int overscrollMode = getOverScrollMode();\n\t\t\t\tif (overscrollMode == OVER_SCROLL_ALWAYS ||\n\t\t\t\t\t\t(overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) {\n\t\t\t\t\tfinal int pulledToY = mHorizontal ? oldX + deltaY : oldY + deltaY;\n\t\t\t\t\tif (pulledToY < 0) {\n\t\t\t\t\t\tonPull(pulledToY);\n\t\t\t\t\t} else if (pulledToY > range) {\n\t\t\t\t\t\tonPull(pulledToY - range);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonPull(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase MotionEvent.ACTION_UP:\n\t\t\tfinal VelocityTracker vtracker = mVelocityTracker;\n\t\t\tvtracker.computeCurrentVelocity(1000, mMaximumVelocity);\n\t\t\tif (isOrthoMove(vtracker.getXVelocity(mActivePointerId),\n\t\t\t\t\tvtracker.getYVelocity(mActivePointerId))\n\t\t\t\t\t&& mMinimumVelocity < Math.abs((mHorizontal ? vtracker.getYVelocity()\n\t\t\t\t\t\t\t: vtracker.getXVelocity()))) {\n\t\t\t\tonOrthoFling(mDownView, mHorizontal ? vtracker.getYVelocity()\n\t\t\t\t\t\t: vtracker.getXVelocity());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (mIsOrthoDragged) {\n\t\t\t\tonOrthoDragFinished(mDownView);\n\t\t\t\tmActivePointerId = INVALID_POINTER;\n\t\t\t\tendDrag();\n\t\t\t} else if (mIsBeingDragged) {\n\t\t\t\tfinal VelocityTracker velocityTracker = mVelocityTracker;\n\t\t\t\tvelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);\n\t\t\t\tint initialVelocity = mHorizontal\n\t\t\t\t\t\t? (int) velocityTracker.getXVelocity(mActivePointerId)\n\t\t\t\t\t\t\t\t: (int) velocityTracker.getYVelocity(mActivePointerId);\n\n\t\t\t\t\t\tif (getChildCount() > 0) {\n\t\t\t\t\t\t\tif ((Math.abs(initialVelocity) > mMinimumVelocity)) {\n\t\t\t\t\t\t\t\tfling(-initialVelocity);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfinal int bottom = getScrollRange();\n\t\t\t\t\t\t\t\tif (mHorizontal) {\n\t\t\t\t\t\t\t\t\tif (mScroller.springBack(getScrollX(), getScrollY(), 0, bottom, 0, 0)) {\n\t\t\t\t\t\t\t\t\t\tinvalidate();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0, bottom)) {\n\t\t\t\t\t\t\t\t\t\tinvalidate();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonPull(0);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmActivePointerId = INVALID_POINTER;\n\t\t\t\t\t\tendDrag();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase MotionEvent.ACTION_CANCEL:\n\t\t\tif (mIsOrthoDragged) {\n\t\t\t\tonOrthoDragFinished(mDownView);\n\t\t\t\tmActivePointerId = INVALID_POINTER;\n\t\t\t\tendDrag();\n\t\t\t} else if (mIsBeingDragged && getChildCount() > 0) {\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\tif (mScroller.springBack(getScrollX(), getScrollY(), 0, getScrollRange(), 0, 0)) {\n\t\t\t\t\t\tinvalidate();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0, getScrollRange())) {\n\t\t\t\t\t\tinvalidate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmActivePointerId = INVALID_POINTER;\n\t\t\t\tendDrag();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase MotionEvent.ACTION_POINTER_DOWN: {\n\t\t\tfinal int index = ev.getActionIndex();\n//\t\t\tfinal float y = mHorizontal ? ev.getX(index) : ev.getY(index);\n\t\t\ty = mHorizontal ? ev.getX(index) : ev.getY(index);\n\t\t\tmLastMotionY = y;\n\t\t\tmLastOrthoCoord = mHorizontal ? ev.getY(index) : ev.getX(index);\n\t\t\tmActivePointerId = ev.getPointerId(index);\n\t\t\tbreak;\n\t\t}\n\t\tcase MotionEvent.ACTION_POINTER_UP:\n\t\t\tonSecondaryPointerUp(ev);\n\t\t\tmLastMotionY = mHorizontal\n\t\t\t\t\t? ev.getX(ev.findPointerIndex(mActivePointerId))\n\t\t\t\t\t\t\t: ev.getY(ev.findPointerIndex(mActivePointerId));\n\t\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprotected View findViewAt(int x, int y) {\n\t\t// subclass responsibility\n\t\treturn null;\n\t}\n\n\tprotected void onPull(int delta) {\n\t}\n\n\tprivate void onSecondaryPointerUp(MotionEvent ev) {\n\t\tfinal int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>\n\t\tMotionEvent.ACTION_POINTER_INDEX_SHIFT;\n\t\tfinal int pointerId = ev.getPointerId(pointerIndex);\n\t\tif (pointerId == mActivePointerId) {\n\t\t\t// This was our active pointer going up. Choose a new\n\t\t\t// active pointer and adjust accordingly.\n\t\t\t// TODO: Make this decision more intelligent.\n\t\t\tfinal int newPointerIndex = pointerIndex == 0 ? 1 : 0;\n\t\t\tmLastMotionY = mHorizontal ? ev.getX(newPointerIndex) : ev.getY(newPointerIndex);\n\t\t\tmActivePointerId = ev.getPointerId(newPointerIndex);\n\t\t\tif (mVelocityTracker != null) {\n\t\t\t\tmVelocityTracker.clear();\n\t\t\t}\n\t\t\tmLastOrthoCoord = mHorizontal ? ev.getY(newPointerIndex)\n\t\t\t\t\t: ev.getX(newPointerIndex);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onGenericMotionEvent(MotionEvent event) {\n\t\tif ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {\n\t\t\tswitch (event.getAction()) {\n\t\t\tcase MotionEvent.ACTION_SCROLL: {\n\t\t\t\tif (!mIsBeingDragged) {\n\t\t\t\t\tif (mHorizontal) {\n\t\t\t\t\t\tfinal float hscroll = event\n\t\t\t\t\t\t\t\t.getAxisValue(MotionEvent.AXIS_HSCROLL);\n\t\t\t\t\t\tif (hscroll != 0) {\n\t\t\t\t\t\t\tfinal int delta = (int) (hscroll * mScrollFactor);\t//getHorizontalScrollFactor()\n\t\t\t\t\t\t\tfinal int range = getScrollRange();\n\t\t\t\t\t\t\tint oldScrollX = getScrollX();\n\t\t\t\t\t\t\tint newScrollX = oldScrollX - delta;\n\t\t\t\t\t\t\tif (newScrollX < 0) {\n\t\t\t\t\t\t\t\tnewScrollX = 0;\n\t\t\t\t\t\t\t} else if (newScrollX > range) {\n\t\t\t\t\t\t\t\tnewScrollX = range;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (newScrollX != oldScrollX) {\n\t\t\t\t\t\t\t\tsuper.scrollTo(newScrollX, getScrollY());\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfinal float vscroll = event\n\t\t\t\t\t\t\t\t.getAxisValue(MotionEvent.AXIS_VSCROLL);\n\t\t\t\t\t\tif (vscroll != 0) {\n\t\t\t\t\t\t\tfinal int delta = (int) (vscroll * mScrollFactor);\t//getVerticalScrollFactor()\n\t\t\t\t\t\t\tfinal int range = getScrollRange();\n\t\t\t\t\t\t\tint oldScrollY = getScrollY();\n\t\t\t\t\t\t\tint newScrollY = oldScrollY - delta;\n\t\t\t\t\t\t\tif (newScrollY < 0) {\n\t\t\t\t\t\t\t\tnewScrollY = 0;\n\t\t\t\t\t\t\t} else if (newScrollY > range) {\n\t\t\t\t\t\t\t\tnewScrollY = range;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (newScrollY != oldScrollY) {\n\t\t\t\t\t\t\t\tsuper.scrollTo(getScrollX(), newScrollY);\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn super.onGenericMotionEvent(event);\n\t}\n\n\tprotected void onOrthoDrag(View draggedView, float distance) {\n\t}\n\n\tprotected void onOrthoDragFinished(View draggedView) {\n\t}\n\n\tprotected void onOrthoFling(View draggedView, float velocity) {\n\t}\n\n\t@Override\n\tprotected void onOverScrolled(int scrollX, int scrollY,\n\t\t\tboolean clampedX, boolean clampedY) {\n\t\t// Treat animating scrolls differently; see #computeScroll() for why.\n\t\tif (!mScroller.isFinished()) {\n\t\t\tsetScrollX(scrollX);\n\t\t\tsetScrollY(scrollY);\n\t\t\tinvalidateParentIfNeeded();\n\t\t\tif (mHorizontal && clampedX) {\n\t\t\t\tmScroller.springBack(getScrollX(), getScrollY(), 0, getScrollRange(), 0, 0);\n\t\t\t} else if (!mHorizontal && clampedY) {\n\t\t\t\tmScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0, getScrollRange());\n\t\t\t}\n\t\t} else {\n\t\t\tsuper.scrollTo(scrollX, scrollY);\n\t\t}\n\t\tawakenScrollBars();\n\t}\n\n\t@Override\n\tpublic void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {\n\t\tsuper.onInitializeAccessibilityNodeInfo(info);\n\t\tinfo.setScrollable(true);\n\t}\n\n\t@Override\n\tpublic void onInitializeAccessibilityEvent(AccessibilityEvent event) {\n\t\tsuper.onInitializeAccessibilityEvent(event);\n\t\tevent.setScrollable(true);\n\t}\n\n\t@Override\n\tpublic boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {\n\t\t// Do not append text content to scroll events they are fired frequently\n\t\t// and the client has already received another event type with the text.\n\t\tif (event.getEventType() != AccessibilityEvent.TYPE_VIEW_SCROLLED) {\n\t\t\tsuper.dispatchPopulateAccessibilityEvent(event);\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate int getScrollRange() {\n\t\tint scrollRange = 0;\n\t\tif (getChildCount() > 0) {\n\t\t\tView child = getChildAt(0);\n\t\t\tif (mHorizontal) {\n\t\t\t\tscrollRange = Math.max(0,\n\t\t\t\t\t\tchild.getWidth() - (getWidth() - getPaddingRight() - getPaddingLeft()));\n\t\t\t} else {\n\t\t\t\tscrollRange = Math.max(0,\n\t\t\t\t\t\tchild.getHeight() - (getHeight() - getPaddingBottom() - getPaddingTop()));\n\t\t\t}\n\t\t}\n\t\treturn scrollRange;\n\t}\n\n\t/**\n\t * <p>\n\t * Finds the next focusable component that fits in the specified bounds.\n\t * </p>\n\t *\n\t * @param topFocus look for a candidate is the one at the top of the bounds\n\t *                 if topFocus is true, or at the bottom of the bounds if topFocus is\n\t *                 false\n\t * @param top      the top offset of the bounds in which a focusable must be\n\t *                 found\n\t * @param bottom   the bottom offset of the bounds in which a focusable must\n\t *                 be found\n\t * @return the next focusable component in the bounds or null if none can\n\t *         be found\n\t */\n\tprivate View findFocusableViewInBounds(boolean topFocus, int top, int bottom) {\n\n\t\tList<View> focusables = getFocusables(View.FOCUS_FORWARD);\n\t\tView focusCandidate = null;\n\n\t\t/*\n\t\t * A fully contained focusable is one where its top is below the bound's\n\t\t * top, and its bottom is above the bound's bottom. A partially\n\t\t * contained focusable is one where some part of it is within the\n\t\t * bounds, but it also has some part that is not within bounds.  A fully contained\n\t\t * focusable is preferred to a partially contained focusable.\n\t\t */\n\t\tboolean foundFullyContainedFocusable = false;\n\n\t\tint count = focusables.size();\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\tView view = focusables.get(i);\n\t\t\tint viewTop = mHorizontal ? view.getLeft() : view.getTop();\n\t\t\tint viewBottom = mHorizontal ? view.getRight() : view.getBottom();\n\n\t\t\tif (top < viewBottom && viewTop < bottom) {\n\t\t\t\t/*\n\t\t\t\t * the focusable is in the target area, it is a candidate for\n\t\t\t\t * focusing\n\t\t\t\t */\n\n\t\t\t\tfinal boolean viewIsFullyContained = (top < viewTop) &&\n\t\t\t\t\t\t(viewBottom < bottom);\n\n\t\t\t\tif (focusCandidate == null) {\n\t\t\t\t\t/* No candidate, take this one */\n\t\t\t\t\tfocusCandidate = view;\n\t\t\t\t\tfoundFullyContainedFocusable = viewIsFullyContained;\n\t\t\t\t} else {\n\t\t\t\t\tfinal int ctop = mHorizontal ? focusCandidate.getLeft() : focusCandidate.getTop();\n\t\t\t\t\tfinal int cbot = mHorizontal ? focusCandidate.getRight() : focusCandidate.getBottom();\n\t\t\t\t\tfinal boolean viewIsCloserToBoundary =\n\t\t\t\t\t\t\t(topFocus && viewTop < ctop) ||\n\t\t\t\t\t\t\t(!topFocus && viewBottom > cbot);\n\n\t\t\t\t\tif (foundFullyContainedFocusable) {\n\t\t\t\t\t\tif (viewIsFullyContained && viewIsCloserToBoundary) {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * We're dealing with only fully contained views, so\n\t\t\t\t\t\t\t * it has to be closer to the boundary to beat our\n\t\t\t\t\t\t\t * candidate\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tfocusCandidate = view;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (viewIsFullyContained) {\n\t\t\t\t\t\t\t/* Any fully contained view beats a partially contained view */\n\t\t\t\t\t\t\tfocusCandidate = view;\n\t\t\t\t\t\t\tfoundFullyContainedFocusable = true;\n\t\t\t\t\t\t} else if (viewIsCloserToBoundary) {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * Partially contained view beats another partially\n\t\t\t\t\t\t\t * contained view if it's closer\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tfocusCandidate = view;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn focusCandidate;\n\t}\n\n\t// i was here\n\n\t/**\n\t * <p>Handles scrolling in response to a \"page up/down\" shortcut press. This\n\t * method will scroll the view by one page up or down and give the focus\n\t * to the topmost/bottommost component in the new visible area. If no\n\t * component is a good candidate for focus, this scrollview reclaims the\n\t * focus.</p>\n\t *\n\t * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}\n\t *                  to go one page up or\n\t *                  {@link android.view.View#FOCUS_DOWN} to go one page down\n\t * @return true if the key event is consumed by this method, false otherwise\n\t */\n\tpublic boolean pageScroll(int direction) {\n\t\tboolean down = direction == View.FOCUS_DOWN;\n\t\tint height = getHeight();\n\n\t\tif (down) {\n\t\t\tmTempRect.top = getScrollY() + height;\n\t\t\tint count = getChildCount();\n\t\t\tif (count > 0) {\n\t\t\t\tView view = getChildAt(count - 1);\n\t\t\t\tif (mTempRect.top + height > view.getBottom()) {\n\t\t\t\t\tmTempRect.top = view.getBottom() - height;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmTempRect.top = getScrollY() - height;\n\t\t\tif (mTempRect.top < 0) {\n\t\t\t\tmTempRect.top = 0;\n\t\t\t}\n\t\t}\n\t\tmTempRect.bottom = mTempRect.top + height;\n\n\t\treturn scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);\n\t}\n\n\t/**\n\t * <p>Handles scrolling in response to a \"home/end\" shortcut press. This\n\t * method will scroll the view to the top or bottom and give the focus\n\t * to the topmost/bottommost component in the new visible area. If no\n\t * component is a good candidate for focus, this scrollview reclaims the\n\t * focus.</p>\n\t *\n\t * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}\n\t *                  to go the top of the view or\n\t *                  {@link android.view.View#FOCUS_DOWN} to go the bottom\n\t * @return true if the key event is consumed by this method, false otherwise\n\t */\n\tpublic boolean fullScroll(int direction) {\n\t\tboolean down = direction == View.FOCUS_DOWN;\n\t\tint height = getHeight();\n\n\t\tmTempRect.top = 0;\n\t\tmTempRect.bottom = height;\n\n\t\tif (down) {\n\t\t\tint count = getChildCount();\n\t\t\tif (count > 0) {\n\t\t\t\tView view = getChildAt(count - 1);\n\t\t\t\tmTempRect.bottom = view.getBottom() + getPaddingBottom();\n\t\t\t\tmTempRect.top = mTempRect.bottom - height;\n\t\t\t}\n\t\t}\n\n\t\treturn scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);\n\t}\n\n\t/**\n\t * <p>Scrolls the view to make the area defined by <code>top</code> and\n\t * <code>bottom</code> visible. This method attempts to give the focus\n\t * to a component visible in this area. If no component can be focused in\n\t * the new visible area, the focus is reclaimed by this ScrollView.</p>\n\t *\n\t * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}\n\t *                  to go upward, {@link android.view.View#FOCUS_DOWN} to downward\n\t * @param top       the top offset of the new area to be made visible\n\t * @param bottom    the bottom offset of the new area to be made visible\n\t * @return true if the key event is consumed by this method, false otherwise\n\t */\n\tprivate boolean scrollAndFocus(int direction, int top, int bottom) {\n\t\tboolean handled = true;\n\n\t\tint height = getHeight();\n\t\tint containerTop = getScrollY();\n\t\tint containerBottom = containerTop + height;\n\t\tboolean up = direction == View.FOCUS_UP;\n\n\t\tView newFocused = findFocusableViewInBounds(up, top, bottom);\n\t\tif (newFocused == null) {\n\t\t\tnewFocused = this;\n\t\t}\n\n\t\tif (top >= containerTop && bottom <= containerBottom) {\n\t\t\thandled = false;\n\t\t} else {\n\t\t\tint delta = up ? (top - containerTop) : (bottom - containerBottom);\n\t\t\tdoScrollY(delta);\n\t\t}\n\n\t\tif (newFocused != findFocus()) newFocused.requestFocus(direction);\n\n\t\treturn handled;\n\t}\n\n\t/**\n\t * Handle scrolling in response to an up or down arrow click.\n\t *\n\t * @param direction The direction corresponding to the arrow key that was\n\t *                  pressed\n\t * @return True if we consumed the event, false otherwise\n\t */\n\tpublic boolean arrowScroll(int direction) {\n\n\t\tView currentFocused = findFocus();\n\t\tif (currentFocused == this) currentFocused = null;\n\n\t\tView nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction);\n\n\t\tfinal int maxJump = getMaxScrollAmount();\n\n\t\tif (nextFocused != null && isWithinDeltaOfScreen(nextFocused, maxJump, getHeight())) {\n\t\t\tnextFocused.getDrawingRect(mTempRect);\n\t\t\toffsetDescendantRectToMyCoords(nextFocused, mTempRect);\n\t\t\tint scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);\n\t\t\tdoScrollY(scrollDelta);\n\t\t\tnextFocused.requestFocus(direction);\n\t\t} else {\n\t\t\t// no new focus\n\t\t\tint scrollDelta = maxJump;\n\n\t\t\tif (direction == View.FOCUS_UP && getScrollY() < scrollDelta) {\n\t\t\t\tscrollDelta = getScrollY();\n\t\t\t} else if (direction == View.FOCUS_DOWN) {\n\t\t\t\tif (getChildCount() > 0) {\n\t\t\t\t\tint daBottom = getChildAt(0).getBottom();\n\t\t\t\t\tint screenBottom = getScrollY() + getHeight() - getPaddingBottom();\n\t\t\t\t\tif (daBottom - screenBottom < maxJump) {\n\t\t\t\t\t\tscrollDelta = daBottom - screenBottom;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (scrollDelta == 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdoScrollY(direction == View.FOCUS_DOWN ? scrollDelta : -scrollDelta);\n\t\t}\n\n\t\tif (currentFocused != null && currentFocused.isFocused()\n\t\t\t\t&& isOffScreen(currentFocused)) {\n\t\t\t// previously focused item still has focus and is off screen, give\n\t\t\t// it up (take it back to ourselves)\n\t\t\t// (also, need to temporarily force FOCUS_BEFORE_DESCENDANTS so we are\n\t\t\t// sure to\n\t\t\t// get it)\n\t\t\tfinal int descendantFocusability = getDescendantFocusability();  // save\n\t\t\tsetDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);\n\t\t\trequestFocus();\n\t\t\tsetDescendantFocusability(descendantFocusability);  // restore\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate boolean isOrthoMove(float moveX, float moveY) {\n\t\treturn mHorizontal && Math.abs(moveY) > Math.abs(moveX)\n\t\t\t\t|| !mHorizontal && Math.abs(moveX) > Math.abs(moveY);\n\t}\n\n\t/**\n\t * @return whether the descendant of this scroll view is scrolled off\n\t *  screen.\n\t */\n\tprivate boolean isOffScreen(View descendant) {\n\t\tif (mHorizontal) {\n\t\t\treturn !isWithinDeltaOfScreen(descendant, getWidth(), 0);\n\t\t} else {\n\t\t\treturn !isWithinDeltaOfScreen(descendant, 0, getHeight());\n\t\t}\n\t}\n\n\t/**\n\t * @return whether the descendant of this scroll view is within delta\n\t *  pixels of being on the screen.\n\t */\n\tprivate boolean isWithinDeltaOfScreen(View descendant, int delta, int height) {\n\t\tdescendant.getDrawingRect(mTempRect);\n\t\toffsetDescendantRectToMyCoords(descendant, mTempRect);\n\t\tif (mHorizontal) {\n\t\t\treturn (mTempRect.right + delta) >= getScrollX()\n\t\t\t\t\t&& (mTempRect.left - delta) <= (getScrollX() + height);\n\t\t} else {\n\t\t\treturn (mTempRect.bottom + delta) >= getScrollY()\n\t\t\t\t\t&& (mTempRect.top - delta) <= (getScrollY() + height);\n\t\t}\n\t}\n\n\t/**\n\t * Smooth scroll by a Y delta\n\t *\n\t * @param delta the number of pixels to scroll by on the Y axis\n\t */\n\tprivate void doScrollY(int delta) {\n\t\tif (delta != 0) {\n\t\t\tif (mSmoothScrollingEnabled) {\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\tsmoothScrollBy(0, delta);\n\t\t\t\t} else {\n\t\t\t\t\tsmoothScrollBy(delta, 0);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\tscrollBy(0, delta);\n\t\t\t\t} else {\n\t\t\t\t\tscrollBy(delta, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.\n\t *\n\t * @param dx the number of pixels to scroll by on the X axis\n\t * @param dy the number of pixels to scroll by on the Y axis\n\t */\n\tpublic final void smoothScrollBy(int dx, int dy) {\n\t\tif (getChildCount() == 0) {\n\t\t\t// Nothing to do.\n\t\t\treturn;\n\t\t}\n\t\tlong duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;\n\t\tif (duration > ANIMATED_SCROLL_GAP) {\n\t\t\tif (mHorizontal) {\n\t\t\t\tfinal int width = getWidth() - getPaddingRight() - getPaddingLeft();\n\t\t\t\tfinal int right = getChildAt(0).getWidth();\n\t\t\t\tfinal int maxX = Math.max(0, right - width);\n\t\t\t\tfinal int scrollX = getScrollX();\n\t\t\t\tdx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;\n\t\t\t\tmScroller.startScroll(scrollX, getScrollY(), dx, 0);\n\t\t\t} else {\n\t\t\t\tfinal int height = getHeight() - getPaddingBottom() - getPaddingTop();\n\t\t\t\tfinal int bottom = getChildAt(0).getHeight();\n\t\t\t\tfinal int maxY = Math.max(0, bottom - height);\n\t\t\t\tfinal int scrollY = getScrollY();\n\t\t\t\tdy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;\n\t\t\t\tmScroller.startScroll(getScrollX(), scrollY, 0, dy);\n\t\t\t}\n\t\t\tinvalidate();\n\t\t} else {\n\t\t\tif (!mScroller.isFinished()) {\n\t\t\t\tmScroller.abortAnimation();\n\t\t\t\tif (mFlingStrictSpan != null) {\n\t\t\t\t\tmFlingStrictSpan.finish();\n\t\t\t\t\tmFlingStrictSpan = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscrollBy(dx, dy);\n\t\t}\n\t\tmLastScroll = AnimationUtils.currentAnimationTimeMillis();\n\t}\n\n\t/**\n\t * Like {@link #scrollTo}, but scroll smoothly instead of immediately.\n\t *\n\t * @param x the position where to scroll on the X axis\n\t * @param y the position where to scroll on the Y axis\n\t */\n\tpublic final void smoothScrollTo(int x, int y) {\n\t\tsmoothScrollBy(x - getScrollX(), y - getScrollY());\n\t}\n\n\t/**\n\t * <p>\n\t * The scroll range of a scroll view is the overall height of all of its\n\t * children.\n\t * </p>\n\t */\n\t@Override\n\tprotected int computeVerticalScrollRange() {\n\t\tif (mHorizontal) {\n\t\t\treturn super.computeVerticalScrollRange();\n\t\t}\n\t\tfinal int count = getChildCount();\n\t\tfinal int contentHeight = getHeight() - getPaddingBottom() - getPaddingTop();\n\t\tif (count == 0) {\n\t\t\treturn contentHeight;\n\t\t}\n\n\t\tint scrollRange = getChildAt(0).getBottom();\n\t\tfinal int scrollY = getScrollY();\n\t\tfinal int overscrollBottom = Math.max(0, scrollRange - contentHeight);\n\t\tif (scrollY < 0) {\n\t\t\tscrollRange -= scrollY;\n\t\t} else if (scrollY > overscrollBottom) {\n\t\t\tscrollRange += scrollY - overscrollBottom;\n\t\t}\n\n\t\treturn scrollRange;\n\t}\n\n\t/**\n\t * <p>\n\t * The scroll range of a scroll view is the overall height of all of its\n\t * children.\n\t * </p>\n\t */\n\t@Override\n\tprotected int computeHorizontalScrollRange() {\n\t\tif (!mHorizontal) {\n\t\t\treturn super.computeHorizontalScrollRange();\n\t\t}\n\t\tfinal int count = getChildCount();\n\t\tfinal int contentWidth = getWidth() - getPaddingRight() - getPaddingLeft();\n\t\tif (count == 0) {\n\t\t\treturn contentWidth;\n\t\t}\n\n\t\tint scrollRange = getChildAt(0).getRight();\n\t\tfinal int scrollX = getScrollX();\n\t\tfinal int overscrollBottom = Math.max(0, scrollRange - contentWidth);\n\t\tif (scrollX < 0) {\n\t\t\tscrollRange -= scrollX;\n\t\t} else if (scrollX > overscrollBottom) {\n\t\t\tscrollRange += scrollX - overscrollBottom;\n\t\t}\n\n\t\treturn scrollRange;\n\t}\n\n\t@Override\n\tprotected int computeVerticalScrollOffset() {\n\t\treturn Math.max(0, super.computeVerticalScrollOffset());\n\t}\n\n\t@Override\n\tprotected int computeHorizontalScrollOffset() {\n\t\treturn Math.max(0, super.computeHorizontalScrollOffset());\n\t}\n\n\t@Override\n\tprotected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {\n\t\tViewGroup.LayoutParams lp = child.getLayoutParams();\n\n\t\tint childWidthMeasureSpec;\n\t\tint childHeightMeasureSpec;\n\n\t\tif (mHorizontal) {\n\t\t\tchildHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, getPaddingTop()\n\t\t\t\t\t+ getPaddingBottom(), lp.height);\n\n\t\t\tchildWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);\n\t\t} else {\n\t\t\tchildWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft()\n\t\t\t\t\t+ getPaddingRight(), lp.width);\n\n\t\t\tchildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);\n\t\t}\n\n\t\tchild.measure(childWidthMeasureSpec, childHeightMeasureSpec);\n\t}\n\n\t@Override\n\tprotected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,\n\t\t\tint parentHeightMeasureSpec, int heightUsed) {\n\t\tfinal MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();\n\n\t\tint childWidthMeasureSpec;\n\t\tint childHeightMeasureSpec;\n\t\tif (mHorizontal) {\n\t\t\tchildHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,\n\t\t\t\t\tgetPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin\n\t\t\t\t\t+ heightUsed, lp.height);\n\t\t\tchildWidthMeasureSpec = MeasureSpec.makeMeasureSpec(\n\t\t\t\t\tlp.leftMargin + lp.rightMargin, MeasureSpec.UNSPECIFIED);\n\t\t} else {\n\t\t\tchildWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,\n\t\t\t\t\tgetPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin\n\t\t\t\t\t+ widthUsed, lp.width);\n\t\t\tchildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(\n\t\t\t\t\tlp.topMargin + lp.bottomMargin, MeasureSpec.UNSPECIFIED);\n\t\t}\n\t\tchild.measure(childWidthMeasureSpec, childHeightMeasureSpec);\n\t}\n\n\t@Override\n\tpublic void computeScroll() {\n\t\tif (mScroller.computeScrollOffset()) {\n\t\t\t// This is called at drawing time by ViewGroup.  We don't want to\n\t\t\t// re-show the scrollbars at this point, which scrollTo will do,\n\t\t\t// so we replicate most of scrollTo here.\n\t\t\t//\n\t\t\t//         It's a little odd to call onScrollChanged from inside the drawing.\n\t\t\t//\n\t\t\t//         It is, except when you remember that computeScroll() is used to\n\t\t\t//         animate scrolling. So unless we want to defer the onScrollChanged()\n\t\t\t//         until the end of the animated scrolling, we don't really have a\n\t\t\t//         choice here.\n\t\t\t//\n\t\t\t//         I agree.  The alternative, which I think would be worse, is to post\n\t\t\t//         something and tell the subclasses later.  This is bad because there\n\t\t\t//         will be a window where mScrollX/Y is different from what the app\n\t\t\t//         thinks it is.\n\t\t\t//\n\t\t\tint oldX = getScrollX();\n\t\t\tint oldY = getScrollY();\n\t\t\tint x = mScroller.getCurrX();\n\t\t\tint y = mScroller.getCurrY();\n\n\t\t\tif (oldX != x || oldY != y) {\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\toverScrollBy(x - oldX, y - oldY, oldX, oldY, getScrollRange(), 0,\n\t\t\t\t\t\t\tmOverflingDistance, 0, false);\n\t\t\t\t} else {\n\t\t\t\t\toverScrollBy(x - oldX, y - oldY, oldX, oldY, 0, getScrollRange(),\n\t\t\t\t\t\t\t0, mOverflingDistance, false);\n\t\t\t\t}\n\t\t\t\tonScrollChanged(getScrollX(), getScrollY(), oldX, oldY);\n\t\t\t}\n\t\t\tawakenScrollBars();\n\n\t\t\t// Keep on drawing until the animation has finished.\n\t\t\tpostInvalidate();\n\t\t} else {\n\t\t\tif (mFlingStrictSpan != null) {\n\t\t\t\tmFlingStrictSpan.finish();\n\t\t\t\tmFlingStrictSpan = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Scrolls the view to the given child.\n\t *\n\t * @param child the View to scroll to\n\t */\n\tprivate void scrollToChild(View child) {\n\t\tchild.getDrawingRect(mTempRect);\n\n\t\t/* Offset from child's local coordinates to ScrollView coordinates */\n\t\toffsetDescendantRectToMyCoords(child, mTempRect);\n\t\tscrollToChildRect(mTempRect, true);\n\t}\n\n\t/**\n\t * If rect is off screen, scroll just enough to get it (or at least the\n\t * first screen size chunk of it) on screen.\n\t *\n\t * @param rect      The rectangle.\n\t * @param immediate True to scroll immediately without animation\n\t * @return true if scrolling was performed\n\t */\n\tprivate boolean scrollToChildRect(Rect rect, boolean immediate) {\n\t\tfinal int delta = computeScrollDeltaToGetChildRectOnScreen(rect);\n\t\tfinal boolean scroll = delta != 0;\n\t\tif (scroll) {\n\t\t\tif (immediate) {\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\tscrollBy(delta, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollBy(0, delta);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (mHorizontal) {\n\t\t\t\t\tsmoothScrollBy(delta, 0);\n\t\t\t\t} else {\n\t\t\t\t\tsmoothScrollBy(0, delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn scroll;\n\t}\n\n\t/**\n\t * Compute the amount to scroll in the Y direction in order to get\n\t * a rectangle completely on the screen (or, if taller than the screen,\n\t * at least the first screen size chunk of it).\n\t *\n\t * @param rect The rect.\n\t * @return The scroll delta.\n\t */\n\tprotected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {\n\t\tif (mHorizontal) {\n\t\t\treturn computeScrollDeltaToGetChildRectOnScreenHorizontal(rect);\n\t\t} else {\n\t\t\treturn computeScrollDeltaToGetChildRectOnScreenVertical(rect);\n\t\t}\n\t}\n\n\tprivate int computeScrollDeltaToGetChildRectOnScreenVertical(Rect rect) {\n\t\tif (getChildCount() == 0) return 0;\n\n\t\tint height = getHeight();\n\t\tint screenTop = getScrollY();\n\t\tint screenBottom = screenTop + height;\n\n\t\tint fadingEdge = getVerticalFadingEdgeLength();\n\n\t\t// leave room for top fading edge as long as rect isn't at very top\n\t\tif (rect.top > 0) {\n\t\t\tscreenTop += fadingEdge;\n\t\t}\n\n\t\t// leave room for bottom fading edge as long as rect isn't at very bottom\n\t\tif (rect.bottom < getChildAt(0).getHeight()) {\n\t\t\tscreenBottom -= fadingEdge;\n\t\t}\n\n\t\tint scrollYDelta = 0;\n\n\t\tif (rect.bottom > screenBottom && rect.top > screenTop) {\n\t\t\t// need to move down to get it in view: move down just enough so\n\t\t\t// that the entire rectangle is in view (or at least the first\n\t\t\t// screen size chunk).\n\n\t\t\tif (rect.height() > height) {\n\t\t\t\t// just enough to get screen size chunk on\n\t\t\t\tscrollYDelta += (rect.top - screenTop);\n\t\t\t} else {\n\t\t\t\t// get entire rect at bottom of screen\n\t\t\t\tscrollYDelta += (rect.bottom - screenBottom);\n\t\t\t}\n\n\t\t\t// make sure we aren't scrolling beyond the end of our content\n\t\t\tint bottom = getChildAt(0).getBottom();\n\t\t\tint distanceToBottom = bottom - screenBottom;\n\t\t\tscrollYDelta = Math.min(scrollYDelta, distanceToBottom);\n\n\t\t} else if (rect.top < screenTop && rect.bottom < screenBottom) {\n\t\t\t// need to move up to get it in view: move up just enough so that\n\t\t\t// entire rectangle is in view (or at least the first screen\n\t\t\t// size chunk of it).\n\n\t\t\tif (rect.height() > height) {\n\t\t\t\t// screen size chunk\n\t\t\t\tscrollYDelta -= (screenBottom - rect.bottom);\n\t\t\t} else {\n\t\t\t\t// entire rect at top\n\t\t\t\tscrollYDelta -= (screenTop - rect.top);\n\t\t\t}\n\n\t\t\t// make sure we aren't scrolling any further than the top our content\n\t\t\tscrollYDelta = Math.max(scrollYDelta, -getScrollY());\n\t\t}\n\t\treturn scrollYDelta;\n\t}\n\n\tprivate int computeScrollDeltaToGetChildRectOnScreenHorizontal(Rect rect) {\n\t\tif (getChildCount() == 0) return 0;\n\n\t\tint width = getWidth();\n\t\tint screenLeft = getScrollX();\n\t\tint screenRight = screenLeft + width;\n\n\t\tint fadingEdge = getHorizontalFadingEdgeLength();\n\n\t\t// leave room for left fading edge as long as rect isn't at very left\n\t\tif (rect.left > 0) {\n\t\t\tscreenLeft += fadingEdge;\n\t\t}\n\n\t\t// leave room for right fading edge as long as rect isn't at very right\n\t\tif (rect.right < getChildAt(0).getWidth()) {\n\t\t\tscreenRight -= fadingEdge;\n\t\t}\n\n\t\tint scrollXDelta = 0;\n\n\t\tif (rect.right > screenRight && rect.left > screenLeft) {\n\t\t\t// need to move right to get it in view: move right just enough so\n\t\t\t// that the entire rectangle is in view (or at least the first\n\t\t\t// screen size chunk).\n\n\t\t\tif (rect.width() > width) {\n\t\t\t\t// just enough to get screen size chunk on\n\t\t\t\tscrollXDelta += (rect.left - screenLeft);\n\t\t\t} else {\n\t\t\t\t// get entire rect at right of screen\n\t\t\t\tscrollXDelta += (rect.right - screenRight);\n\t\t\t}\n\n\t\t\t// make sure we aren't scrolling beyond the end of our content\n\t\t\tint right = getChildAt(0).getRight();\n\t\t\tint distanceToRight = right - screenRight;\n\t\t\tscrollXDelta = Math.min(scrollXDelta, distanceToRight);\n\n\t\t} else if (rect.left < screenLeft && rect.right < screenRight) {\n\t\t\t// need to move right to get it in view: move right just enough so that\n\t\t\t// entire rectangle is in view (or at least the first screen\n\t\t\t// size chunk of it).\n\n\t\t\tif (rect.width() > width) {\n\t\t\t\t// screen size chunk\n\t\t\t\tscrollXDelta -= (screenRight - rect.right);\n\t\t\t} else {\n\t\t\t\t// entire rect at left\n\t\t\t\tscrollXDelta -= (screenLeft - rect.left);\n\t\t\t}\n\n\t\t\t// make sure we aren't scrolling any further than the left our content\n\t\t\tscrollXDelta = Math.max(scrollXDelta, -getScrollX());\n\t\t}\n\t\treturn scrollXDelta;\n\t}\n\n\n\t@Override\n\tpublic void requestChildFocus(View child, View focused) {\n\t\tif (!mIsLayoutDirty) {\n\t\t\tscrollToChild(focused);\n\t\t} else {\n\t\t\t// The child may not be laid out yet, we can't compute the scroll yet\n\t\t\tmChildToScrollTo = focused;\n\t\t}\n\t\tsuper.requestChildFocus(child, focused);\n\t}\n\n\n\t/**\n\t * When looking for focus in children of a scroll view, need to be a little\n\t * more careful not to give focus to something that is scrolled off screen.\n\t *\n\t * This is more expensive than the default {@link android.view.ViewGroup}\n\t * implementation, otherwise this behavior might have been made the default.\n\t */\n\t@Override\n\tprotected boolean onRequestFocusInDescendants(int direction,\n\t\t\tRect previouslyFocusedRect) {\n\n\t\t// convert from forward / backward notation to up / down / left / right\n\t\t// (ugh).\n\t\tif (mHorizontal) {\n\t\t\tif (direction == View.FOCUS_FORWARD) {\n\t\t\t\tdirection = View.FOCUS_RIGHT;\n\t\t\t} else if (direction == View.FOCUS_BACKWARD) {\n\t\t\t\tdirection = View.FOCUS_LEFT;\n\t\t\t}\n\t\t} else {\n\t\t\tif (direction == View.FOCUS_FORWARD) {\n\t\t\t\tdirection = View.FOCUS_DOWN;\n\t\t\t} else if (direction == View.FOCUS_BACKWARD) {\n\t\t\t\tdirection = View.FOCUS_UP;\n\t\t\t}\n\t\t}\n\n\t\tfinal View nextFocus = previouslyFocusedRect == null ?\n\t\t\t\tFocusFinder.getInstance().findNextFocus(this, null, direction) :\n\t\t\t\t\tFocusFinder.getInstance().findNextFocusFromRect(this,\n\t\t\t\t\t\t\tpreviouslyFocusedRect, direction);\n\n\t\t\t\tif (nextFocus == null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (isOffScreen(nextFocus)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn nextFocus.requestFocus(direction, previouslyFocusedRect);\n\t}\n\n\t@Override\n\tpublic boolean requestChildRectangleOnScreen(View child, Rect rectangle,\n\t\t\tboolean immediate) {\n\t\t// offset into coordinate space of this scroll view\n\t\trectangle.offset(child.getLeft() - child.getScrollX(),\n\t\t\t\tchild.getTop() - child.getScrollY());\n\n\t\treturn scrollToChildRect(rectangle, immediate);\n\t}\n\n\t@Override\n\tpublic void requestLayout() {\n\t\tmIsLayoutDirty = true;\n\t\tsuper.requestLayout();\n\t}\n\n\t@Override\n\tprotected void onDetachedFromWindow() {\n\t\tsuper.onDetachedFromWindow();\n\n\t\tif (mScrollStrictSpan != null) {\n\t\t\tmScrollStrictSpan.finish();\n\t\t\tmScrollStrictSpan = null;\n\t\t}\n\t\tif (mFlingStrictSpan != null) {\n\t\t\tmFlingStrictSpan.finish();\n\t\t\tmFlingStrictSpan = null;\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onLayout(boolean changed, int l, int t, int r, int b) {\n\t\tsuper.onLayout(changed, l, t, r, b);\n\t\tmIsLayoutDirty = false;\n\t\t// Give a child focus if it needs it\n\t\tif (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {\n\t\t\tscrollToChild(mChildToScrollTo);\n\t\t}\n\t\tmChildToScrollTo = null;\n\n\t\t// Calling this with the present values causes it to re-clam them\n\t\tscrollTo(getScrollX(), getScrollY());\n\t}\n\n\t@Override\n\tprotected void onSizeChanged(int w, int h, int oldw, int oldh) {\n\t\tsuper.onSizeChanged(w, h, oldw, oldh);\n\n\t\tView currentFocused = findFocus();\n\t\tif (null == currentFocused || this == currentFocused)\n\t\t\treturn;\n\n\t\t// If the currently-focused view was visible on the screen when the\n\t\t// screen was at the old height, then scroll the screen to make that\n\t\t// view visible with the new screen height.\n\t\tif (isWithinDeltaOfScreen(currentFocused, 0, oldh)) {\n\t\t\tcurrentFocused.getDrawingRect(mTempRect);\n\t\t\toffsetDescendantRectToMyCoords(currentFocused, mTempRect);\n\t\t\tint scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);\n\t\t\tdoScrollY(scrollDelta);\n\t\t}\n\t}\n\n\t/**\n\t * Return true if child is an descendant of parent, (or equal to the parent).\n\t */\n\tprivate boolean isViewDescendantOf(View child, View parent) {\n\t\tif (child == parent) {\n\t\t\treturn true;\n\t\t}\n\n\t\tfinal ViewParent theParent = child.getParent();\n\t\treturn (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);\n\t}\n\n\t/**\n\t * Fling the scroll view\n\t *\n\t * @param velocityY The initial velocity in the Y direction. Positive\n\t *                  numbers mean that the finger/cursor is moving down the screen,\n\t *                  which means we want to scroll towards the top.\n\t */\n\tpublic void fling(int velocityY) {\n\t\tif (getChildCount() > 0) {\n\t\t\tif (mHorizontal) {\n\t\t\t\tint width = getWidth() - getPaddingRight() - getPaddingLeft();\n\t\t\t\tint right = getChildAt(0).getWidth();\n\n\t\t\t\tmScroller.fling(getScrollX(), getScrollY(), velocityY, 0,\n\t\t\t\t\t\t0, Math.max(0, right - width), 0, 0, width/2, 0);\n\t\t\t} else {\n\t\t\t\tint height = getHeight() - getPaddingBottom() - getPaddingTop();\n\t\t\t\tint bottom = getChildAt(0).getHeight();\n\n\t\t\t\tmScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, 0,\n\t\t\t\t\t\tMath.max(0, bottom - height), 0, height/2);\n\t\t\t}\n\t\t\tif (mFlingStrictSpan == null) {\n\t\t\t\tmFlingStrictSpan = enterCriticalSpan(\"ScrollView-fling\");\n\t\t\t}\n\n\t\t\tinvalidate();\n\t\t}\n\t}\n\n\tprivate void endDrag() {\n\t\tmIsBeingDragged = false;\n\t\tmIsOrthoDragged = false;\n\t\tmDownView = null;\n\t\trecycleVelocityTracker();\n\t\tif (mScrollStrictSpan != null) {\n\t\t\tmScrollStrictSpan.finish();\n\t\t\tmScrollStrictSpan = null;\n\t\t}\n\t}\n\n\tprivate void invalidateParentIfNeeded() {\n\t\tif (isHardwareAccelerated() && getParent() instanceof View) {\n\t\t\t((View) getParent()).invalidate();\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc}\n\t *\n\t * <p>This version also clamps the scrolling to the bounds of our child.\n\t */\n\t@Override\n\tpublic void scrollTo(int x, int y) {\n\t\t// we rely on the fact the View.scrollBy calls scrollTo.\n\t\tif (getChildCount() > 0) {\n\t\t\tView child = getChildAt(0);\n\t\t\tx = clamp(x, getWidth() - getPaddingRight() - getPaddingLeft(), child.getWidth());\n\t\t\ty = clamp(y, getHeight() - getPaddingBottom() - getPaddingTop(), child.getHeight());\n\t\t\tif (x != getScrollX() || y != getScrollY()) {\n\t\t\t\tsuper.scrollTo(x, y);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate int clamp(int n, int my, int child) {\n\t\tif (my >= child || n < 0) {\n\t\t\t/* my >= child is this case:\n\t\t\t *                    |--------------- me ---------------|\n\t\t\t *     |------ child ------|\n\t\t\t * or\n\t\t\t *     |--------------- me ---------------|\n\t\t\t *            |------ child ------|\n\t\t\t * or\n\t\t\t *     |--------------- me ---------------|\n\t\t\t *                                  |------ child ------|\n\t\t\t *\n\t\t\t * n < 0 is this case:\n\t\t\t *     |------ me ------|\n\t\t\t *                    |-------- child --------|\n\t\t\t *     |-- mScrollX --|\n\t\t\t */\n\t\t\treturn 0;\n\t\t}\n\t\tif ((my+n) > child) {\n\t\t\t/* this case:\n\t\t\t *                    |------ me ------|\n\t\t\t *     |------ child ------|\n\t\t\t *     |-- mScrollX --|\n\t\t\t */\n\t\t\treturn child-my;\n\t\t}\n\t\treturn n;\n\t}\n\n\tprivate static class Span {\n\t\tprivate String mName;\n\t\tprivate Span mNext;\n\t\tprivate Span mPrev;  // not used when in freeList, only active\n\t\tprivate final ThreadSpanState mContainerState;\n\n\t\tSpan(ThreadSpanState threadState) {\n\t\t\tmContainerState = threadState;\n\t\t}\n\n\t\tpublic void finish() {\n\n\t\t\tThreadSpanState state = mContainerState;\n\n\t\t\tsynchronized (state) {\n\t\t\t\tif (mName == null) {\n\t\t\t\t\t// Duplicate finish call.  Ignore.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remove ourselves from the active list.\n\t\t\t\tif (mPrev != null) {\n\t\t\t\t\tmPrev.mNext = mNext;\n\t\t\t\t}\n\n\t\t\t\tif (mNext != null) {\n\t\t\t\t\tmNext.mPrev = mPrev;\n\t\t\t\t}\n\n\t\t\t\tif (state.mActiveHead == this) {\n\t\t\t\t\tstate.mActiveHead = mNext;\n\t\t\t\t}\n\n\t\t\t\tthis.mName = null;\n\t\t\t\tthis.mPrev = null;\n\t\t\t\tthis.mNext = null;\n\n\t\t\t\t// Add ourselves to the freeList, if it's not already\n\t\t\t\t// too big.\n\t\t\t\tif (state.mFreeListSize < 5) {\n\t\t\t\t\tthis.mNext = state.mFreeListHead;\n\t\t\t\t\tstate.mFreeListHead = this;\n\t\t\t\t\tstate.mFreeListSize++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static class ThreadSpanState {\n\t\tpublic Span mActiveHead;    // doubly-linked list.\n\t\tpublic Span mFreeListHead;  // singly-linked list.  only changes at head.\n\t\tpublic int mFreeListSize;\n\t}\n\n\tprivate static Span enterCriticalSpan(String name) {    \t\n\t\tif (name == null || name.isEmpty()) {\n\t\t\tthrow new IllegalArgumentException(\"name must be non-null and non-empty\");\n\t\t}\n\t\tThreadSpanState state = sThisThreadSpanState.get();\n\n\t\tSpan span = null;\n\n\t\tsynchronized (state) {\n\t\t\tif (state.mFreeListHead != null) {\n\t\t\t\tspan = state.mFreeListHead;\n\t\t\t\tstate.mFreeListHead = span.mNext;\n\t\t\t\tstate.mFreeListSize--;\n\t\t\t} else {\n\t\t\t\t// Shouldn't have to do this often.\n\t\t\t\tspan = new Span(state);\n\t\t\t}\n\n\t\t\tspan.mName = name;\n\t\t\tspan.mNext = state.mActiveHead;\n\t\t\tspan.mPrev = null;\n\t\t\tstate.mActiveHead = span;\n\n\t\t\tif (span.mNext != null) {\n\t\t\t\tspan.mNext.mPrev = span;\n\t\t\t}\n\t\t}\n\n\t\treturn span;\n\t}\n\n\tprivate static final ThreadLocal<ThreadSpanState> sThisThreadSpanState = new ThreadLocal<ThreadSpanState>() {\n\t\t@Override\n\t\tprotected ThreadSpanState initialValue() {\n\t\t\treturn new ThreadSpanState();\n\t\t}\n\t};\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/views/TabView.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.views;\n\nimport org.tint.R;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Picture;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.text.Html;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\npublic class TabView extends LinearLayout {\n\n\tprivate ImageView mCloseView;\n\tprivate TextView mTitleView;\n\tprivate View mTitleBar;\n\tprivate ImageView mImage;\n\t\n\tprivate int mImageWidth;\n\tprivate int mImageHeight;\n\t\n\tprivate int mFaviconSize;\n\t\n\tprivate String mTitle;\n\tprivate boolean mSelected;\n\t\n\tprivate OnClickListener mClickListener;\n\n\tpublic TabView(Context context) {\n\t\tsuper(context);\n\t\tinit(context);\n\t}\n\n\tpublic TabView(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t\tinit(context);\n\t}    \n\n\tpublic TabView(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\tinit(context);\n\t}\n\n\tprivate void init(Context context) {\n\t\tLayoutInflater.from(context).inflate(R.layout.tab_view, this);\n\n\t\tmTitle = null;\n\t\tmSelected = false;\n\t\t\n\t\tmCloseView = (ImageView) findViewById(R.id.closetab);\n\t\tmTitleView = (TextView) findViewById(R.id.title);\n\t\tmTitleBar = findViewById(R.id.titlebar);\n\t\tmImage = (ImageView) findViewById(R.id.tab_view);\n\t\t\n\t\tfloat density = context.getResources().getDisplayMetrics().density;\n\t\t\n\t\tmImageWidth = (int) (200 * density);\n\t\tmImageHeight = (int) (120 * density);\n\t\tmFaviconSize = (int) (32 * density);\n\t}\n\n\tpublic boolean isClose(View v) {\n\t\treturn v == mCloseView;\n\t}\n\n\tpublic boolean isTitle(View v) {\n\t\treturn v == mTitleBar;\n\t}\n\n\tpublic boolean isWebView(View v) {\n\t\treturn v == mImage;\n\t}\n\t\n\tpublic void setImage(Picture picture) {\n\t\tBitmap bm = Bitmap.createBitmap(mImageWidth, mImageHeight, Bitmap.Config.ARGB_8888);\n\t\tCanvas canvas = new Canvas(bm);\n\t\t\n\t\tPaint p = new Paint(Paint.ANTI_ALIAS_FLAG);\n\t\tp.setColor(0xFFFFFFFF);\n\t\tcanvas.drawRect(0, 0, mImageWidth, mImageHeight, p);\n\t\t\n\t\tif (picture != null) {\n\t\t\tfloat scale = mImageWidth / (float) picture.getWidth();\n\t\t\tcanvas.scale(scale, scale);\n\n\t\t\tpicture.draw(canvas);\t\t\t\n\t\t}\n\t\t\n\t\tmImage.setImageBitmap(bm);\n\t}\n\t\n\tpublic void setImageResource(int resource) {\n\t\tmImage.setImageResource(resource);\n\t}\n\t\n\tpublic void setTitle(String title) {\n\t\tmTitle = title;\n\t\tupdateTitle();\n\t}\n\t\n\tpublic void setTitle(int title) {\n\t\tmTitle = getResources().getString(title);\n\t\tupdateTitle();\n\t}\n\t\n\tpublic void setSelected(boolean selected) {\n\t\tmSelected = selected;\n\t\tupdateTitle();\n\t}\n\t\n\tpublic void setFavicon(Bitmap icon) {\n\t\tBitmapDrawable bd;\n\t\tif (icon != null) {\n\t\t\tbd = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(icon, mFaviconSize, mFaviconSize, false));\n\t\t} else {\n\t\t\tbd = null;\n\t\t}\n\t\t\n\t\tmTitleView.setCompoundDrawablesWithIntrinsicBounds(bd, null, null, null);\n\t}\n\n\t@Override\n\tpublic void setOnClickListener(OnClickListener listener) {\n\t\tmClickListener = listener;\n\t\tmTitleBar.setOnClickListener(mClickListener);\n\t\tmCloseView.setOnClickListener(mClickListener);\n\t\tif (mImage != null) {\n\t\t\tmImage.setOnClickListener(mClickListener);\n\t\t}\n\t}\n\t\n\tprivate void updateTitle() {\n\t\tif (mTitle != null) {\n\t\t\tif (mSelected) {\n\t\t\t\tmTitleView.setText(Html.fromHtml(String.format(\"<b>%s</b>\", mTitle)));\n\t\t\t} else {\n\t\t\t\tmTitleView.setText(mTitle);\n\t\t\t}\n\t\t} else {\n\t\t\tmTitleView.setText(null);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/views/TabletUrlBar.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.ui.views;\n\nimport org.tint.R;\nimport org.tint.model.UrlSuggestionCursorAdapter;\nimport org.tint.model.UrlSuggestionCursorAdapter.QueryBuilderListener;\nimport org.tint.providers.BookmarksProvider;\nimport org.tint.providers.BookmarksWrapper;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.AdapterView;\nimport android.widget.AutoCompleteTextView;\nimport android.widget.FilterQueryProvider;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.SimpleCursorAdapter.CursorToStringConverter;\n\npublic class TabletUrlBar extends LinearLayout {\n\t\n\tpublic interface OnTabletUrlBarEventListener {\n\t\t\n\t\tvoid onBackClicked();\n\t\t\n\t\tvoid onForwardClicked();\n\t\t\n\t\tvoid onHomeClicked();\n\t\t\n\t\tvoid onBookmarksClicked();\n\t\t\n\t\tvoid onGoStopReloadClicked();\n\t\t\n\t\tvoid onUrlValidated();\n\t\t\n\t}\n\t\n\tprivate Context mContext;\n\t\n\tprivate AutoCompleteTextView mUrl;\t\n\t\n\tprivate ImageView mBack;\n\tprivate ImageView mForward;\n\t\n\tprivate ImageView mHome;\n\t\n\tprivate ImageView mGoStopReload;\n\tprivate ImageView mBookmarks;\n\t\n\tprivate TextWatcher mUrlTextWatcher;\n\t\n\tprivate boolean mIsUrlChangedByUser = false;\n\t\n\tprivate OnTabletUrlBarEventListener mEventListener = null;\n\n\tpublic TabletUrlBar(Context context) {\n\t\tthis(context, null);\n\t}\n\n\tpublic TabletUrlBar(Context context, AttributeSet attrs) {\n\t\tthis(context, attrs, 0);\n\t}\n\t\n\tpublic TabletUrlBar(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t\t\n\t\tmContext = context;\n\t\t\n\t\tLayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\tView v = layoutInflater.inflate(R.layout.tablet_url_bar, this);\n\t\t\n\t\tmUrl = (AutoCompleteTextView) v.findViewById(R.id.UrlBarUrlEdit);\n\t\t\n\t\tmUrl.setCompoundDrawablePadding(5);\n\t\t\n\t\tmBack = (ImageView) v.findViewById(R.id.UrlBarGoBack);\n\t\tmBack.setEnabled(false);\n\t\t\n\t\tmForward = (ImageView) v.findViewById(R.id.UrlBarGoForward);\n\t\tmForward.setEnabled(false);\n\t\t\n\t\tmHome = (ImageView) v.findViewById(R.id.UrlBarHome);\n\t\t\n\t\tmBookmarks = (ImageView) v.findViewById(R.id.UrlBarBookmarks);\n\t\t\n\t\tmGoStopReload = (ImageView) v.findViewById(R.id.UrlBarGoStopReload);\n\t\t\n\t\tString[] from = new String[] { BookmarksProvider.Columns.TITLE, BookmarksProvider.Columns.URL };\n    \tint[] to = new int[] {R.id.AutocompleteTitle, R.id.AutocompleteUrl};\n    \t\n\t\tUrlSuggestionCursorAdapter adapter = new UrlSuggestionCursorAdapter(\n\t\t\t\tmContext,\n\t\t\t\tR.layout.url_autocomplete_line,\n\t\t\t\tnull,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\t0,\n\t\t\t\tnew QueryBuilderListener() {\t\t\t\t\t\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onSuggestionSelected(String url) {\n\t\t\t\t\t\tsetUrl(url);\n\t\t\t\t\t\tmUrl.setSelection(url.length());\n\t\t\t\t\t}\n\t\t\t\t});\n    \t\n    \tadapter.setCursorToStringConverter(new CursorToStringConverter() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic CharSequence convertToString(Cursor cursor) {\n\t\t\t\tString aColumnString = cursor.getString(cursor.getColumnIndex(BookmarksProvider.Columns.URL));\n                return aColumnString;\n\t\t\t}\n\t\t});\n    \t\n    \tadapter.setFilterQueryProvider(new FilterQueryProvider() {\t\t\n\t\t\t@Override\n\t\t\tpublic Cursor runQuery(CharSequence constraint) {\n\t\t\t\tif ((constraint != null) &&\n\t\t\t\t\t\t(constraint.length() > 0)) {\n\t\t\t\t\treturn BookmarksWrapper.getUrlSuggestions(mContext.getContentResolver(),\n\t\t\t\t\t\t\tconstraint.toString());\n\t\t\t\t} else {\n\t\t\t\t\treturn BookmarksWrapper.getUrlSuggestions(mContext.getContentResolver(),\n\t\t\t\t\t\t\tnull);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n    \t\n    \tmUrl.setThreshold(1);\n    \tmUrl.setAdapter(adapter);\n    \t\n    \tmUrlTextWatcher = new TextWatcher() {\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onTextChanged(CharSequence s, int start, int before, int count) { }\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void beforeTextChanged(CharSequence s, int start, int count, \tint after) { }\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void afterTextChanged(Editable s) {\n\t\t\t\tmIsUrlChangedByUser = true;\t\t\n\t\t\t\tmGoStopReload.setImageResource(R.drawable.ic_go);\n\t\t\t}\n\t\t};\n\t\t\n\t\tmUrl.addTextChangedListener(mUrlTextWatcher);\n\t\t\n\t\tmUrl.setOnKeyListener(new OnKeyListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic boolean onKey(View v, int keyCode, KeyEvent event) {\n\t\t\t\tif ((event.getAction() == KeyEvent.ACTION_DOWN) &&\n\t\t\t\t\t\t(keyCode == KeyEvent.KEYCODE_ENTER)) {\t\t\t\t\t\n\t\t\t\t\ttriggerOnUrlValidated();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\t\n\t\tmUrl.setOnItemClickListener(new OnItemClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {\n\t\t\t\ttriggerOnUrlValidated();\n\t\t\t}\n\t\t});\n\t\t\n\t\tmBack.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\tmEventListener.onBackClicked();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tmForward.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\tmEventListener.onForwardClicked();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tmHome.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\tmEventListener.onHomeClicked();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tmBookmarks.setOnClickListener(new OnClickListener() {\t\t\t\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\tmEventListener.onBookmarksClicked();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tmGoStopReload.setOnClickListener(new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tif (mEventListener != null) {\n\t\t\t\t\tmEventListener.onGoStopReloadClicked();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tpublic void setBackEnabled(boolean enabled) {\n\t\tmBack.setEnabled(enabled);\n\t}\n\t\n\tpublic void setForwardEnabled(boolean enabled) {\n\t\tmForward.setEnabled(enabled);\n\t}\n\t\n\tpublic void setUrl(String url) {\n\t\tmUrl.removeTextChangedListener(mUrlTextWatcher);\n\t\tmUrl.setText(url);\n\t\tmUrl.addTextChangedListener(mUrlTextWatcher);\n\t\tmIsUrlChangedByUser = false;\n\t}\n\t\n\tpublic boolean isUrlChangedByUser() {\n\t\treturn mIsUrlChangedByUser;\n\t}\n\t\n\tpublic void setGoStopReloadImage(int resId) {\n\t\tmGoStopReload.setImageResource(resId);\n\t}\n\t\n\tpublic void setEventListener(OnTabletUrlBarEventListener listener) {\n\t\tmEventListener = listener;\n\t}\n\t\n\tpublic void setPrivateBrowsingIndicator(boolean value) {\n\t\tif (value) {\n\t\t\tmUrl.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_incognito_holo_dark, 0, 0, 0);\n\t\t} else {\n\t\t\tmUrl.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\n\t\t}\n\t}\n\t\n\tpublic void setFocusOnUrl() {\n\t\tmUrl.requestFocus();\n\t\t\n\t\tInputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);\n\t\tmgr.showSoftInput(mUrl, InputMethodManager.SHOW_IMPLICIT);\n\t}\n\t\n\tprivate void triggerOnUrlValidated() {\n\t\tif (mEventListener != null) {\n\t\t\tmEventListener.onUrlValidated();\n\t\t}\n\t}\n\n\tpublic String getUrl() {\n\t\treturn mUrl.getText().toString();\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/ui/views/TabsScroller.java",
    "content": "/*\n * Copyright (C) 2011 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\n/*\n * Class taken from the stock browser in AOSP.\n * Only slightly modified to meet Tint's needs.\n */\n\npackage org.tint.ui.views;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.database.DataSetObserver;\nimport android.graphics.Canvas;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.DecelerateInterpolator;\nimport android.widget.BaseAdapter;\nimport android.widget.LinearLayout;\n\n/**\n * custom view for displaying tabs in the nav screen\n */\npublic class TabsScroller extends ScrollerView {\n\n    static final int INVALID_POSITION = -1;\n    static final float[] PULL_FACTOR = { 2.5f, 0.9f };\n\n    public interface OnRemoveListener {\n        public void onRemovePosition(int position);\n    }\n\n    interface OnLayoutListener {\n        public void onLayout(int l, int t, int r, int b);\n    }\n\n    private ContentLayout mContentView;\n    private BaseAdapter mAdapter;\n    private OnRemoveListener mRemoveListener;\n    private OnLayoutListener mLayoutListener;\n    private int mGap;\n    private int mGapPosition;\n    private ObjectAnimator mGapAnimator;\n\n    // after drag animation velocity in pixels/sec\n    private static final float MIN_VELOCITY = 1500;\n    private AnimatorSet mAnimator;\n\n    private float mFlingVelocity;\n    private boolean mNeedsScroll;\n    private int mScrollPosition;\n\n    DecelerateInterpolator mCubic;\n    int mPullValue;\n\n    public TabsScroller(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        init(context);\n    }\n\n    public TabsScroller(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        init(context);\n    }\n\n    public TabsScroller(Context context) {\n        super(context);\n        init(context);\n    }\n\n    private void init(Context ctx) {\n        mCubic = new DecelerateInterpolator(1.5f);\n        mGapPosition = INVALID_POSITION;\n        setHorizontalScrollBarEnabled(false);\n        setVerticalScrollBarEnabled(false);\n        mContentView = new ContentLayout(ctx, this);\n        mContentView.setOrientation(LinearLayout.VERTICAL);\n        addView(mContentView);\n        mContentView.setLayoutParams(\n                new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));\n        // ProGuard !\n        setGap(getGap());\n        mFlingVelocity = getContext().getResources().getDisplayMetrics().density\n                * MIN_VELOCITY;\n    }\n\n    protected int getScrollValue() {\n        return mHorizontal ? getScrollX() : getScrollY();\n    }\n\n    protected void setScrollValue(int value) {\n        scrollTo(mHorizontal ? value : 0, mHorizontal ? 0 : value);\n    }\n\n    protected TabView getTabView(int pos) {\n        return (TabView) mContentView.getChildAt(pos);\n    }\n\n    protected boolean isHorizontal() {\n        return mHorizontal;\n    }\n\n    public void setOrientation(int orientation) {\n        mContentView.setOrientation(orientation);\n        if (orientation == LinearLayout.HORIZONTAL) {\n            mContentView.setLayoutParams(\n                    new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));\n        } else {\n            mContentView.setLayoutParams(\n                    new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n        }\n        super.setOrientation(orientation);\n    }\n\n    public void setAdapter(BaseAdapter adapter) {\n        setAdapter(adapter, 0);\n    }\n\n\n    public void setOnRemoveListener(OnRemoveListener l) {\n        mRemoveListener = l;\n    }\n\n    public void setOnLayoutListener(OnLayoutListener l) {\n        mLayoutListener = l;\n    }\n\n    protected void setAdapter(BaseAdapter adapter, int selection) {\n        mAdapter = adapter;\n        mAdapter.registerDataSetObserver(new DataSetObserver() {\n\n            @Override\n            public void onChanged() {\n                super.onChanged();\n                handleDataChanged();\n            }\n\n            @Override\n            public void onInvalidated() {\n                super.onInvalidated();\n            }\n        });\n        handleDataChanged(selection);\n    }\n\n    protected ViewGroup getContentView() {\n        return mContentView;\n    }\n\n    protected int getRelativeChildTop(int ix) {\n        return mContentView.getChildAt(ix).getTop() - getScrollY();\n    }\n\n    protected void handleDataChanged() {\n        handleDataChanged(INVALID_POSITION);\n    }\n\n    void handleDataChanged(int newscroll) {\n        int scroll = getScrollValue();\n        if (mGapAnimator != null) {\n            mGapAnimator.cancel();\n        }\n        mContentView.removeAllViews();\n        for (int i = 0; i < mAdapter.getCount(); i++) {\n            View v = mAdapter.getView(i, null, mContentView);\n            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(\n                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n            lp.gravity = (mHorizontal ? Gravity.CENTER_VERTICAL : Gravity.CENTER_HORIZONTAL);\n            mContentView.addView(v, lp);\n            if (mGapPosition > INVALID_POSITION){\n                adjustViewGap(v, i);\n            }\n        }\n        if (newscroll > INVALID_POSITION) {\n            newscroll = Math.min(mAdapter.getCount() - 1, newscroll);\n            mNeedsScroll = true;\n            mScrollPosition = newscroll;\n            requestLayout();\n        } else {\n            setScrollValue(scroll);\n        }\n    }\n\n    protected void finishScroller() {\n        mScroller.forceFinished(true);\n    }\n\n\t@SuppressLint(\"WrongCall\")\n\t@Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        super.onLayout(changed, l, t, r, b);\n        if (mNeedsScroll) {\n            mScroller.forceFinished(true);\n            snapToSelected(mScrollPosition, false);\n            mNeedsScroll = false;\n        }\n        if (mLayoutListener != null) {\n            mLayoutListener.onLayout(l, t, r, b);\n            mLayoutListener = null;\n        }\n    }\n\n    void clearTabs() {\n        mContentView.removeAllViews();\n    }\n\n    public void snapToSelected(int pos, boolean smooth) {\n        if (pos < 0) return;\n        View v = mContentView.getChildAt(pos);\n        if (v == null) return;\n        int sx = 0;\n        int sy = 0;\n        if (mHorizontal) {\n            sx = (v.getLeft() + v.getRight() - getWidth()) / 2;\n        } else {\n            sy = (v.getTop() + v.getBottom() - getHeight()) / 2;\n        }\n        if ((sx != getScrollX()) || (sy != getScaleY())) {\n            if (smooth) {\n                smoothScrollTo(sx,sy);\n            } else {\n                scrollTo(sx, sy);\n            }\n        }\n    }\n\n    public void animateOut(View v) {\n        if (v == null) return;\n        animateOut(v, -mFlingVelocity);\n    }\n\n    private void animateOut(final View v, float velocity) {\n        float start = mHorizontal ? v.getTranslationY() : v.getTranslationX();\n        animateOut(v, velocity, start);\n    }\n\n    private void animateOut(final View v, float velocity, float start) {\n        if ((v == null) || (mAnimator != null)) return;\n        final int position = mContentView.indexOfChild(v);\n        int target = 0;\n        if (velocity < 0) {\n            target = mHorizontal ? -getHeight() :  -getWidth();\n        } else {\n            target = mHorizontal ? getHeight() : getWidth();\n        }\n        int distance = target - (mHorizontal ? v.getTop() : v.getLeft());\n        long duration = (long) (Math.abs(distance) * 1000 / Math.abs(velocity));\n        int scroll = 0;\n        int translate = 0;\n        int gap = mHorizontal ? v.getWidth() : v.getHeight();\n        int centerView = getViewCenter(v);\n        int centerScreen = getScreenCenter();\n        int newpos = INVALID_POSITION;\n        if (centerView < centerScreen - gap / 2) {\n            // top view\n            scroll = - (centerScreen - centerView - gap);\n            translate = (position > 0) ? gap : 0;\n            newpos = position;\n        } else if (centerView > centerScreen + gap / 2) {\n            // bottom view\n            scroll = - (centerScreen + gap - centerView);\n            if (position < mAdapter.getCount() - 1) {\n                translate = -gap;\n            }\n        } else {\n            // center view\n            scroll = - (centerScreen - centerView);\n            if (position < mAdapter.getCount() - 1) {\n                translate = -gap;\n            } else {\n                scroll -= gap;\n            }\n        }\n        mGapPosition = position;\n        final int pos = newpos;\n        ObjectAnimator trans = ObjectAnimator.ofFloat(v,\n                (mHorizontal ? TRANSLATION_Y : TRANSLATION_X), start, target);\n        ObjectAnimator alpha = ObjectAnimator.ofFloat(v, ALPHA, getAlpha(v,start),\n                getAlpha(v,target));\n        AnimatorSet set1 = new AnimatorSet();\n        set1.playTogether(trans, alpha);\n        set1.setDuration(duration);\n        mAnimator = new AnimatorSet();\n        ObjectAnimator trans2 = null;\n        ObjectAnimator scroll1 = null;\n        if (scroll != 0) {\n            if (mHorizontal) {\n                scroll1 = ObjectAnimator.ofInt(this, \"scrollX\", getScrollX(), getScrollX() + scroll);\n            } else {\n                scroll1 = ObjectAnimator.ofInt(this, \"scrollY\", getScrollY(), getScrollY() + scroll);\n            }\n        }\n        if (translate != 0) {\n            trans2 = ObjectAnimator.ofInt(this, \"gap\", 0, translate);\n        }\n        final int duration2 = 200;\n        if (scroll1 != null) {\n            if (trans2 != null) {\n                AnimatorSet set2 = new AnimatorSet();\n                set2.playTogether(scroll1, trans2);\n                set2.setDuration(duration2);\n                mAnimator.playSequentially(set1, set2);\n            } else {\n                scroll1.setDuration(duration2);\n                mAnimator.playSequentially(set1, scroll1);\n            }\n        } else {\n            if (trans2 != null) {\n                trans2.setDuration(duration2);\n                mAnimator.playSequentially(set1, trans2);\n            }\n        }\n        mAnimator.addListener(new AnimatorListenerAdapter() {\n            public void onAnimationEnd(Animator a) {\n                if (mRemoveListener !=  null) {\n                    mRemoveListener.onRemovePosition(position);\n                    mAnimator = null;\n                    mGapPosition = INVALID_POSITION;\n                    mGap = 0;\n                    handleDataChanged(pos);\n                }\n            }\n        });\n        mAnimator.start();\n    }\n\n    public void setGap(int gap) {\n        if (mGapPosition != INVALID_POSITION) {\n            mGap = gap;\n            postInvalidate();\n        }\n    }\n\n    public int getGap() {\n        return mGap;\n    }\n\n    void adjustGap() {\n        for (int i = 0; i < mContentView.getChildCount(); i++) {\n            final View child = mContentView.getChildAt(i);\n            adjustViewGap(child, i);\n        }\n    }\n\n    private void adjustViewGap(View view, int pos) {\n        if ((mGap < 0 && pos > mGapPosition)\n                || (mGap > 0 && pos < mGapPosition)) {\n            if (mHorizontal) {\n                view.setTranslationX(mGap);\n            } else {\n                view.setTranslationY(mGap);\n            }\n        }\n    }\n\n    private int getViewCenter(View v) {\n        if (mHorizontal) {\n            return v.getLeft() + v.getWidth() / 2;\n        } else {\n            return v.getTop() + v.getHeight() / 2;\n        }\n    }\n\n    private int getScreenCenter() {\n        if (mHorizontal) {\n            return getScrollX() + getWidth() / 2;\n        } else {\n            return getScrollY() + getHeight() / 2;\n        }\n    }\n\n    @Override\n    public void draw(Canvas canvas) {\n        if (mGapPosition > INVALID_POSITION) {\n            adjustGap();\n        }\n        super.draw(canvas);\n    }\n\n    @Override\n    protected View findViewAt(int x, int y) {\n        x += getScrollX();\n        y += getScrollY();\n        final int count = mContentView.getChildCount();\n        for (int i = count - 1; i >= 0; i--) {\n            View child = mContentView.getChildAt(i);\n            if (child.getVisibility() == View.VISIBLE) {\n                if ((x >= child.getLeft()) && (x < child.getRight())\n                        && (y >= child.getTop()) && (y < child.getBottom())) {\n                    return child;\n                }\n            }\n        }\n        return null;\n    }\n\n    @Override\n    protected void onOrthoDrag(View v, float distance) {\n        if ((v != null) && (mAnimator == null)) {\n            offsetView(v, distance);\n        }\n    }\n\n    @Override\n    protected void onOrthoDragFinished(View downView) {\n        if (mAnimator != null) return;\n        if (mIsOrthoDragged && downView != null) {\n            // offset\n            float diff = mHorizontal ? downView.getTranslationY() : downView.getTranslationX();\n            if (Math.abs(diff) > (mHorizontal ? downView.getHeight() : downView.getWidth()) / 2) {\n                // remove it\n                animateOut(downView, Math.signum(diff) * mFlingVelocity, diff);\n            } else {\n                // snap back\n                offsetView(downView, 0);\n            }\n        }\n    }\n\n    @Override\n    protected void onOrthoFling(View v, float velocity) {\n        if (v == null) return;\n        if (mAnimator == null && Math.abs(velocity) > mFlingVelocity / 2) {\n            animateOut(v, velocity);\n        } else {\n            offsetView(v, 0);\n        }\n    }\n\n    private void offsetView(View v, float distance) {\n        v.setAlpha(getAlpha(v, distance));\n        if (mHorizontal) {\n            v.setTranslationY(distance);\n        } else {\n            v.setTranslationX(distance);\n        }\n    }\n\n    private float getAlpha(View v, float distance) {\n        return 1 - (float) Math.abs(distance) / (mHorizontal ? v.getHeight() : v.getWidth());\n    }\n\n    private float ease(DecelerateInterpolator inter, float value, float start,\n            float dist, float duration) {\n        return start + dist * inter.getInterpolation(value / duration);\n    }\n\n    @Override\n    protected void onPull(int delta) {\n        boolean layer = false;\n        int count = 2;\n        if (delta == 0 && mPullValue == 0) return;\n        if (delta == 0 && mPullValue != 0) {\n            // reset\n            for (int i = 0; i < count; i++) {\n                View child = mContentView.getChildAt((mPullValue < 0)\n                        ? i\n                        : mContentView.getChildCount() - 1 - i);\n                if (child == null) break;\n                ObjectAnimator trans = ObjectAnimator.ofFloat(child,\n                        mHorizontal ? \"translationX\" : \"translationY\",\n                                mHorizontal ? getTranslationX() : getTranslationY(),\n                                0);\n                ObjectAnimator rot = ObjectAnimator.ofFloat(child,\n                        mHorizontal ? \"rotationY\" : \"rotationX\",\n                                mHorizontal ? getRotationY() : getRotationX(),\n                                0);\n                AnimatorSet set = new AnimatorSet();\n                set.playTogether(trans, rot);\n                set.setDuration(100);\n                set.start();\n            }\n            mPullValue = 0;\n        } else {\n            if (mPullValue == 0) {\n                layer = true;\n            }\n            mPullValue += delta;\n        }\n        final int height = mHorizontal ? getWidth() : getHeight();\n        int oscroll = Math.abs(mPullValue);\n        int factor = (mPullValue <= 0) ? 1 : -1;\n        for (int i = 0; i < count; i++) {\n            View child = mContentView.getChildAt((mPullValue < 0)\n                    ? i\n                    : mContentView.getChildCount() - 1 - i);\n            if (child == null) break;\n            if (layer) {\n            }\n            float k = PULL_FACTOR[i];\n            float rot = -factor * ease(mCubic, oscroll, 0, k * 2, height);\n            int y =  factor * (int) ease(mCubic, oscroll, 0, k*20, height);\n            if (mHorizontal) {\n                child.setTranslationX(y);\n            } else {\n                child.setTranslationY(y);\n            }\n            if (mHorizontal) {\n                child.setRotationY(-rot);\n            } else {\n                child.setRotationX(rot);\n            }\n        }\n    }\n\n    static class ContentLayout extends LinearLayout {\n\n    \tTabsScroller mScroller;\n\n        public ContentLayout(Context context, TabsScroller scroller) {\n            super(context);\n            mScroller = scroller;\n        }\n\n        @Override\n        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n            super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n            if (mScroller.getGap() != 0) {\n                View v = getChildAt(0);\n                if (v != null) {\n                    if (mScroller.isHorizontal()) {\n                        int total = v.getMeasuredWidth() + getMeasuredWidth();\n                        setMeasuredDimension(total, getMeasuredHeight());\n                    } else {\n                        int total = v.getMeasuredHeight() + getMeasuredHeight();\n                        setMeasuredDimension(getMeasuredWidth(), total);\n                    }\n                }\n\n            }\n        }\n\n    }\n\n}"
  },
  {
    "path": "src/org/tint/utils/ApplicationUtils.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.utils;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\n\nimport org.tint.R;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.content.ClipData;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.ClipboardManager;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.graphics.Bitmap;\nimport android.graphics.Canvas;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class ApplicationUtils {\n\t\n\tprivate static int[] sBookmarksdimensions = null;\n\t\n\t/**\n\t * Get the application version code.\n\t * @param context The current context.\n\t * @return The application version code.\n\t */\n\tpublic static int getApplicationVersionCode(Context context) {\n    \t\n\t\tint result = -1;\n\t\t\n\t\ttry {\n\t\t\t\n\t\t\tPackageManager manager = context.getPackageManager();\n\t\t\tPackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);\n\t\t\t\n\t\t\tresult = info.versionCode;\n\t\t\t\n\t\t} catch (NameNotFoundException e) {\n\t\t\tLog.w(\"ApplicationUtils\", \"Unable to get application version: \" + e.getMessage());\n\t\t\tresult = -1;\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic static BitmapDrawable getApplicationButtonImage(Activity activity, Bitmap icon) {\n\t\tif (icon != null) {\n\t\t\tint buttonSize = activity.getResources().getInteger(R.integer.application_button_size);\n\t\t\tint size = activity.getResources().getInteger(R.integer.favicon_size);\n\t\t\t\n\t\t\tDrawable d = activity.getResources().getDrawable(R.drawable.bookmark_list_favicon_bg);\t\t\t\t\t\t\n\t\t\tBitmap bm = Bitmap.createBitmap(buttonSize, buttonSize, Bitmap.Config.ARGB_8888);\n\t\t\t\n\t\t\tCanvas canvas = new Canvas(bm);\n\t\t\td.setBounds(0, 0, buttonSize, buttonSize);\n\t\t\td.draw(canvas);\n\n\t\t\tBitmapDrawable favIcon = new BitmapDrawable(activity.getResources(), icon);\n\t\t\tfavIcon.setBounds((buttonSize / 2) - (size / 2), (buttonSize / 2) - (size / 2), (buttonSize / 2) + (size / 2), (buttonSize / 2) + (size / 2));\n\t\t\tfavIcon.draw(canvas);\n\t\t\t\n\t\t\treturn new BitmapDrawable(activity.getResources(), bm);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static int[] getBookmarksThumbnailsDimensions(Context context) {\n\t\tif (sBookmarksdimensions == null) {\n\t\t\tDrawable d = context.getResources().getDrawable(R.drawable.browser_thumbnail);\n\t\t\tsBookmarksdimensions = new int[] { d.getIntrinsicWidth(), d.getIntrinsicHeight() };\n\t\t}\n\t\t\n\t\treturn sBookmarksdimensions;\n\t}\n\t\n\t/**\n\t * Share a page.\n\t * @param activity The parent activity.\n\t * @param title The page title.\n\t * @param url The page url.\n\t */\n\tpublic static void sharePage(Activity activity, String title, String url) {\n    \tIntent shareIntent = new Intent(Intent.ACTION_SEND);\n    \t\n    \tshareIntent.setType(\"text/plain\");\n    \tshareIntent.putExtra(Intent.EXTRA_TEXT, url);\n    \tshareIntent.putExtra(Intent.EXTRA_SUBJECT, title);\n    \t\n    \ttry {\n    \t\tactivity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.ShareChooserTitle)));\n        } catch(android.content.ActivityNotFoundException ex) {\n            // if no app handles it, do nothing\n        }\n    }\n\t\n\t/**\n     * Copy a text to the clipboard.\n     * @param context The current context.\n     * @param text The text to copy.\n     * @param toastMessage The message to show in a Toast notification. If empty or null, does not display notification.\n     */\n    public static void copyTextToClipboard(Context context, String text, String toastMessage) {\n    \tClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE);\n    \tclipboard.setPrimaryClip(ClipData.newPlainText(text, text));\n    \t\n    \tif ((toastMessage != null) &&\n    \t\t\t(toastMessage.length() > 0)) {\n    \t\tToast.makeText(context, toastMessage, Toast.LENGTH_SHORT).show();\n    \t}\n    }\n\t\n\t/**\n\t * Display a standard yes / no dialog.\n\t * @param context The current context.\n\t * @param icon The dialog icon.\n\t * @param title The dialog title.\n\t * @param message The dialog message.\n\t * @param onYes The dialog listener for the yes button.\n\t */\n\tpublic static void showYesNoDialog(Context context, int icon, int title, int message, DialogInterface.OnClickListener onYes) {\n    \tshowYesNoDialog(context,\n    \t\t\ticon,\n    \t\t\ttitle,\n    \t\t\tcontext.getResources().getString(message),\n    \t\t\tonYes);\n\t}\n\t\n\t/**\n\t * Display a standard yes / no dialog.\n\t * @param context The current context.\n\t * @param icon The dialog icon.\n\t * @param title The dialog title.\n\t * @param message The dialog message.\n\t * @param onYes The dialog listener for the yes button.\n\t */\n\tpublic static void showYesNoDialog(Context context, int icon, int title, String message, DialogInterface.OnClickListener onYes) {\n\t\tAlertDialog.Builder builder = new AlertDialog.Builder(context);\n    \tbuilder.setCancelable(true);\n    \tbuilder.setIcon(icon);\n    \tbuilder.setTitle(context.getResources().getString(title));\n    \tbuilder.setMessage(message);\n\n    \tbuilder.setInverseBackgroundForced(true);\n    \tbuilder.setPositiveButton(context.getResources().getString(R.string.Yes), onYes);\n    \tbuilder.setNegativeButton(context.getResources().getString(R.string.No), new DialogInterface.OnClickListener() {\n    \t\t@Override\n    \t\tpublic void onClick(DialogInterface dialog, int which) {\n    \t\t\tdialog.dismiss();\n    \t\t}\n    \t});\n    \tAlertDialog alert = builder.create();\n    \talert.show();\n\t}\n\t\n\tpublic static void showErrorDialog(Context context, String title, String message) {\n\t\tnew AlertDialog.Builder(context)\n        .setTitle(title)\n        .setIcon(android.R.drawable.ic_dialog_alert)\n        .setMessage(message)\n        .setPositiveButton(R.string.OK, null)\n        .show();\n\t}\n\t\n\tpublic static void showMessageDialog(Context context, String title, String message) {\n\t\tnew AlertDialog.Builder(context)\n        .setTitle(title)\n        .setIcon(android.R.drawable.ic_dialog_info)\n        .setMessage(message)\n        .setPositiveButton(R.string.OK, null)\n        .show();\n\t}\n\t\n\t/**\n\t * Load a raw string resource.\n\t * @param context The current context.\n\t * @param resourceId The resource id.\n\t * @return The loaded string.\n\t */\n\tpublic static String getStringFromRawResource(Context context, int resourceId) {\n\t\tString result = null;\n\t\t\n\t\tInputStream is = context.getResources().openRawResource(resourceId);\n\t\tif (is != null) {\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tString line;\n\n\t\t\ttry {\n\t\t\t\tBufferedReader reader = new BufferedReader(new InputStreamReader(is, \"UTF-8\"));\n\t\t\t\twhile ((line = reader.readLine()) != null) {\t\t\t\t\t\n\t\t\t\t\tsb.append(line).append(\"\\n\");\n\t\t\t\t}\n\t\t\t} catch (IOException e) {\n\t\t\t\tLog.w(\"ApplicationUtils\", String.format(\"Unable to load resource %s: %s\", resourceId, e.getMessage()));\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tis.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\tLog.w(\"ApplicationUtils\", String.format(\"Unable to load resource %s: %s\", resourceId, e.getMessage()));\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult = sb.toString();\n\t\t} else {        \n\t\t\tresult = \"\";\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/utils/Constants.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.utils;\n\npublic class Constants {\n\t\n\t/**\n\t * Actions.\n\t */\n\tpublic static final String ACTION_BROWSER_CONTEXT_MENU = \"ACTION_BROWSER_OPEN\";\n\t\n\t/**\n\t * Extras.\n\t */\n\tpublic static final String EXTRA_ID = \"EXTRA_ID\";\n\tpublic static final String EXTRA_ACTION_ID = \"EXTRA_ACTION_ID\";\n\tpublic static final String EXTRA_NEW_TAB = \"EXTRA_NEW_TAB\";\n\tpublic static final String EXTRA_LABEL = \"EXTRA_LABEL\";\n\tpublic static final String EXTRA_URL = \"EXTRA_URL\";\n\tpublic static final String EXTRA_FOLDER_ID = \"EXTRA_FOLDER_ID\";\n\tpublic static final String EXTRA_HIT_TEST_RESULT = \"EXTRA_HIT_TEST_RESULT\";\n\tpublic static final String EXTRA_INCOGNITO = \"EXTRA_INCOGNITO\";\n\t\n\t/**\n\t * Specials urls.\n\t */\n\tpublic static final String URL_ABOUT_BLANK = \"about:blank\";\n\tpublic static final String URL_ABOUT_START = \"about:start\";\n\tpublic static final String URL_ABOUT_TUTORIAL = \"about:tutorial\";\n\t\n\t/**\n\t * User agents\n\t */\n\tpublic static final String USER_AGENT_ANDROID = \"\";\n\tpublic static final String USER_AGENT_DESKTOP = \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24\";\n\t\n\t/**\n\t * Preferences.\n\t */\n\tpublic static final String PREFERENCE_HOME_PAGE = \"PREFERENCE_HOME_PAGE\";\n\tpublic static final String PREFERENCE_SEARCH_URL = \"PREFERENCE_SEARCH_URL\";\n\tpublic static final String PREFERENCE_START_PAGE_LIMIT = \"PREFERENCE_START_PAGE_LIMIT\";\n\tpublic static final String PREFERENCE_BUBBLE_POSITION = \"PREFERENCE_BUBBLE_POSITION\";\n\tpublic static final String PREFERENCE_TOOLBARS_AUTOHIDE_DURATION = \"PREFERENCE_TOOLBARS_AUTOHIDE_DURATION\";\n\tpublic static final String PREFERENCES_SWITCH_TABS_METHOD = \"PREFERENCES_SWITCH_TABS_METHOD\";\n\t\n\tpublic static final String PREFERENCE_ENABLE_JAVASCRIPT = \"PREFERENCE_ENABLE_JAVASCRIPT\";\n\tpublic static final String PREFERENCE_ENABLE_IMAGES = \"PREFERENCE_ENABLE_IMAGES\";\n\tpublic static final String PREFERENCE_USE_WIDE_VIEWPORT = \"PREFERENCE_USE_WIDE_VIEWPORT\";\n\tpublic static final String PREFERENCE_LOAD_WITH_OVERVIEW = \"PREFERENCE_LOAD_WITH_OVERVIEW\";\n\tpublic static final String PREFERENCE_USER_AGENT = \"PREFERENCE_USER_AGENT\";\n\tpublic static final String PREFERENCE_PLUGINS = \"PREFERENCE_PLUGINS\";\n\t\n\tpublic static final String PREFERENCE_ACCEPT_COOKIES = \"PREFERENCE_ACCEPT_COOKIES\";\n\tpublic static final String PREFERENCE_ENABLE_GEOLOCATION = \"PREFERENCE_ENABLE_GEOLOCATION\";\n\tpublic static final String PREFERENCE_REMEMBER_FORM_DATA = \"PREFERENCE_REMEMBER_FORM_DATA\";\n\tpublic static final String PREFERENCE_REMEMBER_PASSWORDS = \"PREFERENCE_REMEMBER_PASSWORDS\";\n\t\t\n\tpublic static final String PREFERENCE_HISTORY_SIZE = \"PREFERENCE_HISTORY_SIZE\";\n\tpublic static final String PREFERENCE_CLEAR_CACHE = \"PREFERENCE_CLEAR_CACHE\";\n\tpublic static final String PREFERENCE_WEBSITES_SETTINGS = \"PREFERENCE_WEBSITES_SETTINGS\";\n\tpublic static final String PREFERENCE_SSL_EXCEPTIONS = \"PREFERENCE_SSL_EXCEPTIONS\";\n\tpublic static final String PREFERENCE_CLEAR_HISTORY = \"PREFERENCE_CLEAR_HISTORY\";\n\tpublic static final String PREFERENCE_CLEAR_COOKIES = \"PREFERENCE_CLEAR_COOKIES\";\n\tpublic static final String PREFERENCE_CLEAR_GEOLOCATION = \"PREFERENCE_CLEAR_GEOLOCATION\";\n\tpublic static final String PREFERENCE_CLEAR_FORM_DATA = \"PREFERENCE_CLEAR_FORM_DATA\";\n\tpublic static final String PREFERENCE_CLEAR_PASSWORDS = \"PREFERENCE_CLEAR_PASSWORDS\";\n\tpublic static final String PREFERENCE_INCOGNITO_BY_DEFAULT = \"PREFERENCE_INCOGNITO_BY_DEFAULT\";\n\t\n\tpublic static final String PREFERENCE_TEXT_SCALING = \"PREFERENCE_TEXT_SCALING\";\n\tpublic static final String PREFERENCE_MINIMUM_FONT_SIZE = \"PREFERENCE_MINIMUM_FONT_SIZE\";\n\tpublic static final String PREFERENCE_INVERTED_DISPLAY = \"PREFERENCE_INVERTED_DISPLAY\";\n\tpublic static final String PREFERENCE_INVERTED_DISPLAY_CONTRAST = \"PREFERENCE_INVERTED_DISPLAY_CONTRAST\";\n\t\n\tpublic static final String PREFERENCE_BOOKMARKS_SORT_MODE = \"PREFERENCE_BOOKMARKS_SORT_MODE\";\n\t\n\tpublic static final String PREFERENCE_FULL_SCREEN = \"PREFERENCE_FULL_SCREEN\";\n\t\n\tpublic static final String PREFERENCE_RESTORE_TABS = \"PREFERENCE_RESTORE_TABS\";\n\t\n\tpublic static final String PREFERENCE_UI_TYPE = \"PREFERENCE_UI_TYPE\";\n\tpublic static final String PREFERENCE_CLOSE_PANEL_ON_NEW_TAB = \"PREFERENCE_CLOSE_PANEL_ON_NEW_TAB\";\n\t\n\tpublic static final String PREFERENCE_JS_LOG_ON_LOGCAT = \"PREFERENCE_JS_LOG_ON_LOGCAT\";\n\t\n\t/**\n\t * Technical preferences.\n\t */\n\tpublic static final String TECHNICAL_PREFERENCE_LAST_HISTORY_TRUNCATION = \"TECHNICAL_PREFERENCE_LAST_HISTORY_TRUNCATION\";\n\tpublic static final String TECHNICAL_PREFERENCE_FIRST_RUN = \"TECHNICAL_PREFERENCE_FIRST_RUN\";\n\tpublic static final String TECHNICAL_PREFERENCE_LAST_RUN_VERSION_CODE = \"TECHNICAL_PREFERENCE_LAST_RUN_VERSION_CODE\";\n\tpublic static final String TECHNICAL_PREFERENCE_ADDON_ENABLED = \"TECHNICAL_PREFERENCE_ADDON_ENABLED_\";\n\tpublic static final String TECHNICAL_PREFERENCE_SAVED_TABS = \"TECHNICAL_PREFERENCE_SAVED_TABS\";\n\tpublic static final String TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED = \"TECHNICAL_PREFERENCE_HOMEPAGE_URL_UPDATE_NEEDED\";\n}\n"
  },
  {
    "path": "src/org/tint/utils/IOUtils.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.utils;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Locale;\n\nimport org.tint.R;\n\nimport android.content.Context;\nimport android.os.Environment;\n\npublic class IOUtils {\n\t\n\t/**\n\t * Get the list of xml files in the bookmark export folder.\n\t * @return The list of xml files in the bookmark export folder.\n\t */\n\tpublic static List<String> getExportedBookmarksFileList() {\n\t\tList<String> result = new ArrayList<String>();\n\t\t\n\t\tFile folder = Environment.getExternalStorageDirectory();\t\t\n\t\t\n\t\tif (folder != null) {\n\t\t\t\n\t\t\tFileFilter filter = new FileFilter() {\n\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic boolean accept(File pathname) {\n\t\t\t\t\tif ((pathname.isFile()) &&\n\t\t\t\t\t\t\t(pathname.getPath().toLowerCase(Locale.US).endsWith(\".xml\") ||\n\t\t\t\t\t\t\t pathname.getPath().toLowerCase(Locale.US).endsWith(\".json\"))) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\tFile[] files = folder.listFiles(filter);\n\t\t\t\n\t\t\tfor (File file : files) {\n\t\t\t\tresult.add(file.getName());\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\tCollections.sort(result, new Comparator<String>() {\n\n\t\t\t@Override\n\t\t\tpublic int compare(String arg0, String arg1) {\t\t\t\t\n\t\t\t\treturn arg1.compareTo(arg0);\n\t\t\t}    \t\t\n    \t});\n\t\t\n\t\treturn result;\n\t}\n\t\n\tpublic static String checkCardState(Context context) {\n\t\t// Check to see if we have an SDCard\n        String status = Environment.getExternalStorageState();\n        if (!status.equals(Environment.MEDIA_MOUNTED)) {\n        \t// Check to see if the SDCard is busy, same as the music app\n            if (status.equals(Environment.MEDIA_SHARED)) {\n                return context.getString(R.string.SDCardErrorSDUnavailable);\n            } else {\n                return context.getString(R.string.SDCardErrorNoSDMsg);\n            }\n        }\n\t\t\n\t\treturn null;\t\t\n\t}\n\n}\n"
  },
  {
    "path": "src/org/tint/utils/UrlUtils.java",
    "content": "/*\n * Tint Browser for Android\n * \n * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors.\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 3 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\npackage org.tint.utils;\n\nimport org.tint.R;\n\nimport android.content.Context;\nimport android.content.SharedPreferences.Editor;\nimport android.preference.PreferenceManager;\n\n/**\n * Url management utils.\n */\npublic class UrlUtils {\n\n\t/**\n\t * Check if a string is an url.\n\t * For now, just consider that if a string contains a dot, it is an url.\n\t * @param url The url to check.\n\t * @return True if the string is an url.\n\t */\n\tpublic static boolean isUrl(String url) {\n\t\treturn \n\t\t\turl.contains(\".\") ||\n\t\t\turl.equals(Constants.URL_ABOUT_BLANK) ||\n\t\t\turl.equals(Constants.URL_ABOUT_START) ||\n\t\t\turl.equals(Constants.URL_ABOUT_TUTORIAL);\n\t}\n\t\n\tpublic static String getRawSearchUrl(Context context) {\n\t\tString currentSearchUrl = PreferenceManager.getDefaultSharedPreferences(context).getString(Constants.PREFERENCE_SEARCH_URL, context.getString(R.string.SearchUrlGoogle));\n\t\tif (currentSearchUrl.contains(\"%s\")) {\n\t\t\tcurrentSearchUrl = currentSearchUrl.replaceAll(\"%s\", \"{searchTerms}\");\n\t\t\t\n\t\t\tEditor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();\n\t\t\teditor.putString(Constants.PREFERENCE_SEARCH_URL, currentSearchUrl);\n\t\t\teditor.commit();\n\t\t}\n\t\t\n\t\treturn currentSearchUrl;\n\t}\n\t\n\t/**\n\t * Get the current search url.\n\t * @param context The current context.\n\t * @param searchTerms The terms to search for.\n\t * @return The search url.\n\t */\n\tpublic static String getSearchUrl(Context context, String searchTerms) {\n\t\tString currentSearchUrl = getRawSearchUrl(context);\n\t\treturn currentSearchUrl.replaceAll(\"\\\\{searchTerms\\\\}\", searchTerms);\n\t}\n\t\n\t/**\n\t * Check en url. Add http:// before if missing.\n\t * @param url The url to check.\n\t * @return The modified url if necessary.\n\t */\n\tpublic static String checkUrl(String url) {\n\t\tif ((url != null) &&\n    \t\t\t(url.length() > 0)) {\n    \t\n    \t\tif ((!url.startsWith(\"http://\")) &&\n    \t\t\t\t(!url.startsWith(\"https://\")) &&\n    \t\t\t\t(!url.startsWith(\"file://\")) &&\n    \t\t\t\t(!url.startsWith(Constants.URL_ABOUT_BLANK)) &&\n    \t\t\t\t(!url.startsWith(Constants.URL_ABOUT_START)) &&\n    \t\t\t\t(!url.startsWith(Constants.URL_ABOUT_TUTORIAL))) {\n    \t\t\t\n    \t\t\turl = \"http://\" + url;\n    \t\t\t\n    \t\t}\n\t\t}\n\t\t\n\t\treturn url;\n\t}\t\t\n\t\n}\n"
  }
]