Merge pull request #5236 from osmandapp/PaulsBranchLinks
Added abilyty to open article links internally
This commit is contained in:
commit
f237d1bc0c
4 changed files with 95 additions and 0 deletions
|
@ -9,6 +9,7 @@
|
||||||
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
|
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
|
||||||
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
|
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
|
||||||
-->
|
-->
|
||||||
|
<string name="online_webpage_warning">This page is only available online. Do you wish to open it in a web browser?</string>
|
||||||
<string name="images_cache">Images cache</string>
|
<string name="images_cache">Images cache</string>
|
||||||
<string name="delete_search_history">Delete search history</string>
|
<string name="delete_search_history">Delete search history</string>
|
||||||
<string name="show_images">Show images</string>
|
<string name="show_images">Show images</string>
|
||||||
|
|
|
@ -26,6 +26,7 @@ import net.osmand.IndexConstants;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.R;
|
import net.osmand.plus.R;
|
||||||
import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment;
|
import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment;
|
||||||
|
import net.osmand.plus.wikivoyage.data.CustomWebViewClient;
|
||||||
import net.osmand.plus.wikivoyage.data.WikivoyageArticle;
|
import net.osmand.plus.wikivoyage.data.WikivoyageArticle;
|
||||||
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper;
|
import net.osmand.plus.wikivoyage.data.WikivoyageLocalDataHelper;
|
||||||
import net.osmand.util.Algorithms;
|
import net.osmand.util.Algorithms;
|
||||||
|
@ -122,6 +123,7 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
|
||||||
contentWebView = (WebView) mainView.findViewById(R.id.content_web_view);
|
contentWebView = (WebView) mainView.findViewById(R.id.content_web_view);
|
||||||
contentWebView.getSettings().setJavaScriptEnabled(true);
|
contentWebView.getSettings().setJavaScriptEnabled(true);
|
||||||
contentWebView.getSettings().setCacheMode(showImages ? WebSettings.LOAD_DEFAULT : WebSettings.LOAD_CACHE_ONLY);
|
contentWebView.getSettings().setCacheMode(showImages ? WebSettings.LOAD_DEFAULT : WebSettings.LOAD_CACHE_ONLY);
|
||||||
|
contentWebView.setWebViewClient(new CustomWebViewClient(getActivity(), getFragmentManager()));
|
||||||
|
|
||||||
return mainView;
|
return mainView;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
package net.osmand.plus.wikivoyage.data;
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.support.v4.app.FragmentActivity;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.webkit.WebView;
|
||||||
|
import android.webkit.WebViewClient;
|
||||||
|
|
||||||
|
import net.osmand.plus.OsmandApplication;
|
||||||
|
import net.osmand.plus.R;
|
||||||
|
import net.osmand.plus.wikivoyage.article.WikivoyageArticleDialogFragment;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom WebView client to handle the internal links.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CustomWebViewClient extends WebViewClient {
|
||||||
|
|
||||||
|
private OsmandApplication app;
|
||||||
|
private FragmentManager mFragmentManager;
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
|
private static final String PAGE_PREFIX = "https://";
|
||||||
|
private static final String WEB_DOMAIN = ".wikivoyage.com/wiki/";
|
||||||
|
|
||||||
|
public CustomWebViewClient(FragmentActivity context, FragmentManager fm) {
|
||||||
|
app = (OsmandApplication) context.getApplication();
|
||||||
|
mFragmentManager = fm;
|
||||||
|
mContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
||||||
|
if (url.contains(WEB_DOMAIN)) {
|
||||||
|
String lang = url.substring(url.startsWith(PAGE_PREFIX) ? PAGE_PREFIX.length() : 0, url.indexOf("."));
|
||||||
|
String articleName = url.replace(PAGE_PREFIX + lang + WEB_DOMAIN, "")
|
||||||
|
.replaceAll("_", " ");
|
||||||
|
try {
|
||||||
|
articleName = URLDecoder.decode(articleName, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
long articleId = app.getWikivoyageDbHelper().getArticleId(articleName, lang);
|
||||||
|
if (articleId != 0) {
|
||||||
|
WikivoyageArticleDialogFragment.showInstance(app, mFragmentManager,
|
||||||
|
articleId, lang);
|
||||||
|
} else {
|
||||||
|
warnAboutExternalLoad(url);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
warnAboutExternalLoad(url);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void warnAboutExternalLoad(final String url) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
||||||
|
builder.setMessage(R.string.online_webpage_warning);
|
||||||
|
builder.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||||
|
mContext.startActivity(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setNegativeButton(R.string.shared_string_cancel, null);
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
}
|
|
@ -223,6 +223,21 @@ public class WikivoyageDbHelper {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getArticleId(String title, String lang) {
|
||||||
|
long res = 0;
|
||||||
|
SQLiteConnection conn = openConnection();
|
||||||
|
if (conn != null) {
|
||||||
|
SQLiteCursor cursor = conn.rawQuery("SELECT " + ARTICLES_COL_CITY_ID + " FROM "
|
||||||
|
+ ARTICLES_TABLE_NAME + " WHERE " + ARTICLES_COL_TITLE + " = ? AND "
|
||||||
|
+ ARTICLES_COL_LANG + " = ?", new String[]{title, lang});
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
res = cursor.getLong(0);
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public ArrayList<String> getArticleLangs(long cityId) {
|
public ArrayList<String> getArticleLangs(long cityId) {
|
||||||
ArrayList<String> res = new ArrayList<>();
|
ArrayList<String> res = new ArrayList<>();
|
||||||
|
|
Loading…
Reference in a new issue