| Index: src/org/adblockplus/android/configurators/CyanogenProxyConfigurator.java | 
| diff --git a/src/org/adblockplus/android/configurators/CyanogenProxyConfigurator.java b/src/org/adblockplus/android/configurators/CyanogenProxyConfigurator.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..1209f6163fea945ccb9eef6901d1cf4f60f2a19d | 
| --- /dev/null | 
| +++ b/src/org/adblockplus/android/configurators/CyanogenProxyConfigurator.java | 
| @@ -0,0 +1,145 @@ | 
| +/* | 
| + * This file is part of Adblock Plus <http://adblockplus.org/>, | 
| + * Copyright (C) 2006-2014 Eyeo GmbH | 
| + * | 
| + * Adblock Plus is free software: you can redistribute it and/or modify | 
| + * it under the terms of the GNU General Public License version 3 as | 
| + * published by the Free Software Foundation. | 
| + * | 
| + * Adblock Plus is distributed in the hope that it will be useful, | 
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| + * GNU General Public License for more details. | 
| + * | 
| + * You should have received a copy of the GNU General Public License | 
| + * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| + */ | 
| + | 
| +package org.adblockplus.android.configurators; | 
| + | 
| +import java.net.InetAddress; | 
| + | 
| +import org.adblockplus.android.Utils; | 
| +import org.adblockplus.android.compat.CmGlobalProxyManager; | 
| +import org.adblockplus.android.compat.ProxyProperties; | 
| + | 
| +import android.content.BroadcastReceiver; | 
| +import android.content.Context; | 
| +import android.content.Intent; | 
| +import android.content.IntentFilter; | 
| +import android.util.Log; | 
| + | 
| +public class CyanogenProxyConfigurator implements ProxyConfigurator | 
| +{ | 
| +  private static final String TAG = Utils.getTag(CyanogenProxyConfigurator.class); | 
| + | 
| +  private final Context context; | 
| +  private ProxyProperties proxyProperties = null; | 
| +  private final GlobalProxyReceiver globalProxyReceiver; | 
| +  private volatile boolean isRegistered = false; | 
| + | 
| +  public CyanogenProxyConfigurator(final Context context) | 
| +  { | 
| +    this.context = context; | 
| +    this.globalProxyReceiver = new GlobalProxyReceiver(this); | 
| +  } | 
| + | 
| +  @Override | 
| +  public boolean initialize() | 
| +  { | 
| +    try | 
| +    { | 
| +      final boolean success = new ProxyProperties("localhost", 8080, "").toCmProxyProperties() != null; | 
| + | 
| +      if (success) | 
| +      { | 
| +        this.context.registerReceiver(this.globalProxyReceiver, new IntentFilter(CmGlobalProxyManager.GLOBAL_PROXY_STATE_CHANGE_ACTION)); | 
| +      } | 
| + | 
| +      return success; | 
| +    } | 
| +    catch (final Throwable t) | 
| +    { | 
| +      return false; | 
| +    } | 
| +  } | 
| + | 
| +  @Override | 
| +  public boolean registerProxy(final InetAddress address, final int port) | 
| +  { | 
| +    try | 
| +    { | 
| +      final CmGlobalProxyManager globalProxyManager = new CmGlobalProxyManager(this.context); | 
| +      globalProxyManager.setGlobalProxy(this.proxyProperties = new ProxyProperties(address.getHostName(), port)); | 
| +      return this.isRegistered = true; | 
| +    } | 
| +    catch (final Throwable t) | 
| +    { | 
| +      Log.d(TAG, "Failed to register proxy using CMapi", t); | 
| +      return false; | 
| +    } | 
| +  } | 
| + | 
| +  @Override | 
| +  public void unregisterProxy() | 
| +  { | 
| +    // TODO Do we need to do something here? | 
| +  } | 
| + | 
| +  @Override | 
| +  public void shutdown() | 
| +  { | 
| +    this.context.unregisterReceiver(this.globalProxyReceiver); | 
| +  } | 
| + | 
| +  @Override | 
| +  public ProxyRegistrationType getType() | 
| +  { | 
| +    return ProxyRegistrationType.CYANOGENMOD; | 
| +  } | 
| + | 
| +  @Override | 
| +  public boolean isRegistered() | 
| +  { | 
| +    return this.isRegistered; | 
| +  } | 
| + | 
| +  @Override | 
| +  public boolean isSticky() | 
| +  { | 
| +    return true; | 
| +  } | 
| + | 
| +  @Override | 
| +  public String toString() | 
| +  { | 
| +    return "[ProxyConfigurator: " + this.getType() + "]"; | 
| +  } | 
| + | 
| +  private static class GlobalProxyReceiver extends BroadcastReceiver | 
| +  { | 
| +    private final CyanogenProxyConfigurator cyanogenProxyConfigurator; | 
| + | 
| +    public GlobalProxyReceiver(final CyanogenProxyConfigurator cyanogenProxyConfigurator) | 
| +    { | 
| +      this.cyanogenProxyConfigurator = cyanogenProxyConfigurator; | 
| +    } | 
| + | 
| +    @Override | 
| +    public void onReceive(final Context context, final Intent intent) | 
| +    { | 
| +      if (intent != null && CmGlobalProxyManager.GLOBAL_PROXY_STATE_CHANGE_ACTION.equals(intent.getAction())) | 
| +      { | 
| +        try | 
| +        { | 
| +          final CmGlobalProxyManager globalProxyManager = new CmGlobalProxyManager(this.cyanogenProxyConfigurator.context); | 
| +          globalProxyManager.setGlobalProxy(this.cyanogenProxyConfigurator.proxyProperties); | 
| +        } | 
| +        catch (final Throwable t) | 
| +        { | 
| +          Log.d(TAG, "GlobalProxyReceiver failed to register proxy", t); | 
| +        } | 
| +      } | 
| +    } | 
| +  } | 
| +} | 
|  |