1
0
Fork 0
mirror of https://github.com/gsantner/dandelion synced 2025-09-10 10:49:42 +02:00

- Added AMOLED mode

- Use opoc/AdBlock
- Improve NavDrawer
This commit is contained in:
Gregor Santner 2017-06-08 02:33:00 +02:00
parent 544e86073a
commit 2d7d898bfe
No known key found for this signature in database
GPG key ID: 7E83A7834AECB009
16 changed files with 2621 additions and 24 deletions

View file

@ -34,6 +34,8 @@ import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.AppSettings;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import io.github.gsantner.opoc.util.AdBlock;
public class App extends Application {
private volatile static App app;
private AppSettings appSettings;
@ -69,6 +71,7 @@ public class App extends Application {
}
cookieManager.setAcceptCookie(true);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
AdBlock.getInstance().loadHostsFromRawAssetsAsync(this);
}
public void resetPodData(@Nullable WebView webView) {

View file

@ -25,6 +25,8 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.LayerDrawable;
import android.net.Uri;
import android.os.Bundle;
@ -424,6 +426,14 @@ public class MainActivity extends ThemedActivity
navheaderImage.setImageResource(R.drawable.ic_launcher_test);
}
updateNavigationViewEntryVisibilities();
if (appSettings.isAmoledColorMode()) {
navView.setItemTextColor(ColorStateList.valueOf(Color.LTGRAY));
navView.setItemIconTintList(ColorStateList.valueOf(Color.LTGRAY));
navView.setBackgroundColor(Color.BLACK);
navheaderTitle.setTextColor(Color.LTGRAY);
navheaderDescription.setTextColor(Color.GRAY);
}
}
protected void updateNavigationViewEntryVisibilities() {

View file

@ -22,6 +22,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
@ -176,10 +177,18 @@ public class PodSelectionFragment extends ThemedFragment implements SearchView.O
listedPodsList.add(pod.getPodUrl().getHost());
}
listViewPodAdapter = new ArrayAdapter<>(
listViewPodAdapter = new ArrayAdapter<String>(
getContext(),
android.R.layout.simple_list_item_1,
listedPodsList);
listedPodsList) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView textView = (TextView) view.findViewById(android.R.id.text1);
textView.setTextColor(Color.BLACK);
return view;
}
};
// save index and top position
int index = listViewPod.getFirstVisiblePosition();

View file

@ -17,6 +17,7 @@ package com.github.dfa.diaspora_android.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.BuildConfig;
@ -394,8 +395,12 @@ public class AppSettings extends AppSettingsBase {
@SuppressWarnings("ConstantConditions")
public int getPrimaryColor() {
return getInt(prefApp, R.string.pref_key__primary_color_shade, rcolor(
BuildConfig.IS_TEST_BUILD ? R.color.md_brown_800 : R.color.primary));
if (isAmoledColorMode()) {
return Color.BLACK;
} else {
return getInt(prefApp, R.string.pref_key__primary_color_shade, rcolor(
BuildConfig.IS_TEST_BUILD ? R.color.md_brown_800 : R.color.primary));
}
}
public void setAccentColorSettings(int base, int shade) {
@ -417,4 +422,12 @@ public class AppSettings extends AppSettingsBase {
public boolean isExtendedNotificationsActivated() {
return getBool(prefApp, R.string.pref_key__extended_notifications, false);
}
public boolean isAmoledColorMode() {
return getBool(prefApp, R.string.pref_key__primary_color__amoled_mode, false);
}
public boolean isAdBlockEnabled() {
return getBool(prefApp, R.string.pref_key__adblock_enable, true);
}
}

View file

@ -18,9 +18,13 @@
*/
package com.github.dfa.diaspora_android.web;
import android.annotation.TargetApi;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;
import android.support.v4.content.LocalBroadcastManager;
import android.webkit.CookieManager;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@ -29,12 +33,16 @@ import com.github.dfa.diaspora_android.activity.MainActivity;
import com.github.dfa.diaspora_android.data.DiasporaPodList;
import com.github.dfa.diaspora_android.util.AppSettings;
import io.github.gsantner.opoc.util.AdBlock;
public class CustomWebViewClient extends WebViewClient {
private final App app;
private String lastLoadUrl = "";
private boolean isAdBlockEnabled = false;
public CustomWebViewClient(App app, WebView webView) {
this.app = app;
isAdBlockEnabled = AppSettings.get().isAdBlockEnabled();
}
//Open non-diaspora links in customtab/external browser
@ -77,4 +85,15 @@ public class CustomWebViewClient extends WebViewClient {
}
}
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (isAdBlockEnabled && AdBlock.getInstance().isAdHost(url)) {
return AdBlock.createEmptyResponse();
}
return super.shouldInterceptRequest(view, url);
}
}

View file

@ -0,0 +1,171 @@
/*
* ---------------------------------------------------------------------------- *
* Gregor Santner <gsantner.github.io> wrote this file. You can do whatever
* you want with this stuff. If we meet some day, and you think this stuff is
* worth it, you can buy me a coke in return. Provided as is without any kind
* of warranty. No attribution required. - Gregor Santner
*
* License: Creative Commons Zero (CC0 1.0)
* http://creativecommons.org/publicdomain/zero/1.0/
* ----------------------------------------------------------------------------
*/
/*
* Place adblock hosts file in raw: src/main/res/raw/adblock_domains__xyz.txt
* Always blocks both, www and non www
* Load hosts (call e.g. via Application-Object)
AdBlock.getInstance().loadHostsFromRawAssetsAsync(context);
* Override inside a WebViewClient:
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return AdBlock.getInstance().isAdHost(url)
? AdBlock.createEmptyResponse()
: super.shouldInterceptRequest(view, url);
}
*/
package io.github.gsantner.opoc.util;
import android.content.Context;
import android.util.Log;
import android.webkit.WebResourceResponse;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.github.dfa.diaspora_android.R;
/**
* Simple Host-Based AdBlocker
*/
public class AdBlock {
private static final AdBlock instance = new AdBlock();
public static AdBlock getInstance() {
return instance;
}
//########################
//##
//## Members
//##
//########################
private final Set<String> adblockHostsFromRaw = new HashSet<>();
private final Set<String> adblockHosts = new HashSet<>();
private boolean isLoaded;
//########################
//##
//## Methods
//##
//########################
private AdBlock() {
}
public boolean isAdHost(String urlS) {
if (urlS != null && !urlS.isEmpty() && urlS.startsWith("http")) {
try {
URI url = new URI(urlS);
String host = url.getHost().trim();
if (host.startsWith("www.") && host.length() >= 4) {
host = host.substring(4);
}
return adblockHosts.contains(host) || adblockHosts.contains("www." + host);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
return false;
}
public AdBlock reset() {
adblockHosts.clear();
adblockHosts.addAll(adblockHostsFromRaw);
return this;
}
public static WebResourceResponse createEmptyResponse() {
return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
}
public void addBlockedHosts(String... hosts) {
for (String host : hosts) {
if (host != null) {
host = host.trim();
if (host.startsWith("www.") && host.length() >= 4) {
host = host.substring(4);
}
if (!host.startsWith("#") && !host.startsWith("\"")) {
adblockHosts.add(host);
}
}
}
}
public void loadHostsFromRawAssetsAsync(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
try {
loadHostsFromRawAssets(context);
isLoaded = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void loadHostsFromRawAssets(Context context) throws IOException {
BufferedReader br = null;
String host;
adblockHosts.clear();
for (int rawId : getAdblockIdsInRaw()) {
try {
br = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(rawId)));
while ((host = br.readLine()) != null) {
addBlockedHosts(host);
}
} catch (Exception e) {
Log.d(AdBlock.class.getName(), "Error: Cannot read adblock res " + rawId);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException ignored) {
}
}
}
}
adblockHostsFromRaw.clear();
adblockHostsFromRaw.addAll(adblockHosts);
}
private List<Integer> getAdblockIdsInRaw() {
ArrayList<Integer> adblockResIds = new ArrayList<>();
Field[] fields = R.raw.class.getFields();
for (Field field : fields) {
try {
int resId = field.getInt(field);
String resFilename = field.getName();
if (resFilename.startsWith("adblock_domains__")) {
adblockResIds.add(resId);
}
} catch (IllegalAccessException ignored) {
}
}
return adblockResIds;
}
}