diff options
Diffstat (limited to 'app')
23 files changed, 160 insertions, 241 deletions
| diff --git a/app/build.gradle b/app/build.gradle index e613cb35..3e4862ca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,6 +118,7 @@ dependencies {    implementation 'com.android.support:design:27.0.2'    implementation 'com.android.support:support-fragment:27.0.2'    implementation 'com.android.support.constraint:constraint-layout:1.0.2' +  implementation 'com.android.support:multidex:1.0.2'  }  // Ensure the no-op dependency is always used in JVM tests. diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java index 034c9752..823b5635 100644 --- a/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java @@ -117,7 +117,6 @@ public class ProviderListActivity extends ProviderListBaseActivity {              addAndSelectNewProvider(ProviderAPI.lastProviderMainUrl(), ProviderAPI.lastDangerOn());          } else {              showProgressBar(); -            adapter.hideAllBut(adapter.indexOf(provider));              Intent providerAPICommand = new Intent(this, ProviderAPI.class); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2ffb54f4..6a1d40aa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -90,7 +90,8 @@          <activity              android:name=".MainActivity" -            android:label="@string/title_activity_main" /> +            android:label="@string/title_activity_main" +            android:launchMode="singleTop" />          <activity              android:name=".ProviderListActivity" diff --git a/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java b/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java index f9e45b79..15fd85f8 100644 --- a/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java +++ b/app/src/main/java/se/leap/bitmaskclient/BitmaskApp.java @@ -1,7 +1,7 @@  package se.leap.bitmaskclient; -import android.app.Application;  import android.content.Context; +import android.support.multidex.MultiDexApplication;  import com.squareup.leakcanary.LeakCanary;  import com.squareup.leakcanary.RefWatcher; @@ -10,7 +10,7 @@ import com.squareup.leakcanary.RefWatcher;   * Created by cyberta on 24.10.17.   */ -public class BitmaskApp extends Application { +public class BitmaskApp extends MultiDexApplication {      private RefWatcher refWatcher; diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index a4db5f84..78ec3fd2 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -459,11 +459,11 @@ public class Dashboard extends ButterKnifeActivity {                  String password = resultData.getString(SessionDialog.PASSWORD);                  dashboard.user_status_fragment.logIn(username, password);              } else if (resultCode == ProviderAPI.FAILED_SIGNUP) { -                MainActivity.sessionDialog(resultData); +                //MainActivity.sessionDialog(resultData);              } else if (resultCode == ProviderAPI.SUCCESSFUL_LOGIN) {                  Dashboard.downloadVpnCertificate();              } else if (resultCode == ProviderAPI.FAILED_LOGIN) { -                MainActivity.sessionDialog(resultData); +                //MainActivity.sessionDialog(resultData);              } else if (resultCode == ProviderAPI.SUCCESSFUL_LOGOUT) {                  if (switching_provider) dashboard.switchProvider();              } else if (resultCode == ProviderAPI.LOGOUT_FAILED) { diff --git a/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java b/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java index 52c797a4..57ff1fd8 100644 --- a/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java +++ b/app/src/main/java/se/leap/bitmaskclient/DefaultedURL.java @@ -1,6 +1,7 @@  package se.leap.bitmaskclient; -import java.net.*; +import java.net.MalformedURLException; +import java.net.URL;  public class DefaultedURL {      private URL DEFAULT_URL; @@ -8,7 +9,7 @@ public class DefaultedURL {      private URL url; -    public DefaultedURL() { +    DefaultedURL() {          try {              DEFAULT_URL = new URL(default_url);              url = DEFAULT_URL; diff --git a/app/src/main/java/se/leap/bitmaskclient/DownloadFailedDialog.java b/app/src/main/java/se/leap/bitmaskclient/DownloadFailedDialog.java index 527ce1a7..dde71642 100644 --- a/app/src/main/java/se/leap/bitmaskclient/DownloadFailedDialog.java +++ b/app/src/main/java/se/leap/bitmaskclient/DownloadFailedDialog.java @@ -16,12 +16,12 @@   */  package se.leap.bitmaskclient; -import android.app.Activity;  import android.app.AlertDialog;  import android.app.Dialog; -import android.support.v4.app.DialogFragment; +import android.content.Context;  import android.content.DialogInterface;  import android.os.Bundle; +import android.support.v4.app.DialogFragment;  import org.json.JSONObject; @@ -134,12 +134,12 @@ public class DownloadFailedDialog extends DialogFragment {      DownloadFailedDialogInterface interface_with_ConfigurationWizard;      @Override -    public void onAttach(Activity activity) { -        super.onAttach(activity); +    public void onAttach(Context context) { +        super.onAttach(context);          try { -            interface_with_ConfigurationWizard = (DownloadFailedDialogInterface) activity; +            interface_with_ConfigurationWizard = (DownloadFailedDialogInterface) context;          } catch (ClassCastException e) { -            throw new ClassCastException(activity.toString() +            throw new ClassCastException(context.toString()                      + " must implement NoticeDialogListener");          }      } diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index 414b1f2a..c0e2c21e 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -53,6 +53,7 @@ import de.blinkt.openvpn.core.VpnStatus;  import se.leap.bitmaskclient.eip.EIP;  import se.leap.bitmaskclient.eip.EipStatus;  import se.leap.bitmaskclient.eip.VoidVpnService; +import se.leap.bitmaskclient.userstatus.SessionDialog;  import static android.view.View.GONE;  import static android.view.View.VISIBLE; @@ -73,10 +74,12 @@ import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;  public class EipFragment extends Fragment implements Observer { -    public static String TAG = EipFragment.class.getSimpleName(); +    public final static String TAG = EipFragment.class.getSimpleName();      protected static final String IS_CONNECTED = TAG + ".is_connected";      public static final String START_EIP_ON_BOOT = "start on boot"; +    public static final String ASK_TO_CANCEL_VPN = "ask_to_cancel_vpn"; +      private SharedPreferences preferences; @@ -121,6 +124,7 @@ public class EipFragment extends Fragment implements Observer {      }; +    @Override      public void onAttach(Context context) {          super.onAttach(context);          downloadEIPServiceConfig(); @@ -130,19 +134,23 @@ public class EipFragment extends Fragment implements Observer {      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          eipStatus = EipStatus.getInstance(); -        eipStatus.addObserver(this);          eipReceiver = new EIPReceiver(new Handler());          preferences = getActivity().getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);      }      @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { +        eipStatus.addObserver(this);          View view = inflater.inflate(R.layout.eip_service_fragment, container, false);          ButterKnife.inject(this, view);          Bundle arguments = getArguments(); -        if (arguments != null && arguments.containsKey(START_EIP_ON_BOOT) && arguments.getBoolean(START_EIP_ON_BOOT)) { -            startEipFromScratch(); +        if (arguments != null) { +            if (arguments.containsKey(START_EIP_ON_BOOT) && arguments.getBoolean(START_EIP_ON_BOOT)) { +                startEipFromScratch(); +            } else if (arguments.containsKey(ASK_TO_CANCEL_VPN) && arguments.getBoolean(ASK_TO_CANCEL_VPN)) { +                askToStopEIP(); +            }          }          return view;      } @@ -163,6 +171,12 @@ public class EipFragment extends Fragment implements Observer {      }      @Override +    public void onDestroyView() { +        super.onDestroyView(); +        eipStatus.deleteObserver(this); +    } + +    @Override      public void onSaveInstanceState(Bundle outState) {          outState.putBoolean(IS_CONNECTED, eipStatus.isConnected());          super.onSaveInstanceState(outState); @@ -199,8 +213,10 @@ public class EipFragment extends Fragment implements Observer {              startEipFromScratch();          else if (canLogInToStartEIP()) {              wantsToConnect = true; -            Bundle bundle = new Bundle(); -            MainActivity.sessionDialog(bundle); +            /*Bundle bundle = new Bundle(); +            seionDialogCallback.onSessionDialog(bundle);*/ +            Log.w(TAG, "TODO: implement login from here"); +            //FIXME: implement login from here          } else {              Log.d(TAG, "WHAT IS GOING ON HERE?!");              // TODO: implement a fallback: check if vpncertificate was not downloaded properly or give diff --git a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java index 7629f0b7..186c2928 100644 --- a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java @@ -15,12 +15,11 @@ import se.leap.bitmaskclient.userstatus.SessionDialog;  import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;  import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; +import static se.leap.bitmaskclient.EipFragment.ASK_TO_CANCEL_VPN;  public class MainActivity extends AppCompatActivity { -    private static Provider provider = new Provider(); -    private static FragmentManagerEnhanced fragmentManager;      private SharedPreferences preferences;      public final static String ACTION_SHOW_VPN_FRAGMENT = "action_show_vpn_fragment"; @@ -40,7 +39,6 @@ public class MainActivity extends AppCompatActivity {                  getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);          preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); -        fragmentManager = new FragmentManagerEnhanced(getSupportFragmentManager());          // Set up the drawer.          navigationDrawerFragment.setUp(                  R.id.navigation_drawer, @@ -49,15 +47,6 @@ public class MainActivity extends AppCompatActivity {          handleIntentAction(getIntent());      } -    public static void sessionDialog(Bundle resultData) { -        try { -            FragmentTransaction transaction = fragmentManager.removePreviousFragment(SessionDialog.TAG); -            SessionDialog.getInstance(provider, resultData).show(transaction, SessionDialog.TAG); -        } catch (IllegalStateException e) { -            e.printStackTrace(); -        } -    } -      @Override      protected void onNewIntent(Intent intent) {          super.onNewIntent(intent); @@ -71,17 +60,21 @@ public class MainActivity extends AppCompatActivity {          }          Fragment fragment = null; -          switch (intent.getAction()) {              case ACTION_SHOW_VPN_FRAGMENT:                  fragment = new EipFragment(); +                if (intent.hasExtra(ASK_TO_CANCEL_VPN)) { +                    Bundle bundle = new Bundle(); +                    bundle.putBoolean(ASK_TO_CANCEL_VPN, true); +                    fragment.setArguments(bundle); +                }                  break;              default:                  break;          }          if (fragment != null) { -            fragmentManager.beginTransaction() +            new FragmentManagerEnhanced(getSupportFragmentManager()).beginTransaction()                      .replace(R.id.container, fragment)                      .commit();          } @@ -100,5 +93,4 @@ public class MainActivity extends AppCompatActivity {              }          }      } -  } diff --git a/app/src/main/java/se/leap/bitmaskclient/Provider.java b/app/src/main/java/se/leap/bitmaskclient/Provider.java index ae329cd1..5ff1949c 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Provider.java +++ b/app/src/main/java/se/leap/bitmaskclient/Provider.java @@ -309,4 +309,12 @@ public final class Provider implements Parcelable {          this.caCert = cert;      } +    public boolean isDefault() { +        return getMainUrl().isDefault() && +                getApiUrl().isDefault() && +                certificatePin.isEmpty() && +                certificatePinEncoding.isEmpty() && +                caCert.isEmpty(); +    } +  } diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java b/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java index cfc6e49d..8117fb99 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java @@ -163,12 +163,16 @@ public abstract class ProviderApiManagerBase {          if (action.equals(UPDATE_PROVIDER_DETAILS)) {              resetProviderDetails();              Bundle task = new Bundle(); -            task.putString(MAIN_URL, lastProviderMainUrl); +            String mainUrl = parameters.getString(Provider.MAIN_URL); +            if (mainUrl == null) { +                mainUrl = lastProviderMainUrl; +            } +            task.putString(MAIN_URL, mainUrl);              Bundle result = setUpProvider(task);              if (result.getBoolean(RESULT_KEY)) { -                receiver.send(PROVIDER_OK, result); +                sendToReceiverOrBroadcast(receiver, PROVIDER_OK, result);              } else { -                receiver.send(PROVIDER_NOK, result); +                sendToReceiverOrBroadcast(receiver, PROVIDER_NOK, result);              }          } else if (action.equalsIgnoreCase(SET_UP_PROVIDER)) {              Bundle result = setUpProvider(parameters); @@ -222,7 +226,7 @@ public abstract class ProviderApiManagerBase {          } else if (action.equalsIgnoreCase(PROVIDER_SET_UP)) {              if(EIP_SERVICE_JSON_DOWNLOADED && CA_CERT_DOWNLOADED && PROVIDER_JSON_DOWNLOADED ) {                  if(receiver!= null) { -                    receiver.send(PROVIDER_OK, Bundle.EMPTY); +                    sendToReceiverOrBroadcast(receiver, PROVIDER_OK, Bundle.EMPTY);                  }              }          } diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderListAdapter.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListAdapter.java index 4a34caa0..6672c575 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderListAdapter.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderListAdapter.java @@ -1,119 +1,15 @@  package se.leap.bitmaskclient; -import android.view.*; +import android.view.LayoutInflater; -import com.pedrogomez.renderers.*; - -import java.util.*; +import com.pedrogomez.renderers.AdapteeCollection; +import com.pedrogomez.renderers.RendererAdapter; +import com.pedrogomez.renderers.RendererBuilder;  public class ProviderListAdapter extends RendererAdapter<Provider> { -    private static boolean[] hidden = null; - -    public void hide(int position) { -        hidden[getRealPosition(position)] = true; -        notifyDataSetChanged(); -        notifyDataSetInvalidated(); -    } - -    public void unHide(int position) { -        hidden[getRealPosition(position)] = false; -        notifyDataSetChanged(); -        notifyDataSetInvalidated(); -    } - -    public void showAllProviders() { -        for (int i = 0; i < hidden.length; i++) -            hidden[i] = false; -        notifyDataSetChanged(); -        notifyDataSetInvalidated(); -    } - -    public void hideAllBut(int position) { -        for (int i = 0; i < hidden.length; i++) { -            if (i != position) -                hidden[i] = true; -            else -                hidden[i] = false; -        } -        notifyDataSetChanged(); -        notifyDataSetInvalidated(); -    } - -    private int getRealPosition(int position) { -        int hElements = getHiddenCountUpTo(position); -        int diff = 0; -        for (int i = 0; i < hElements; i++) { -            diff++; -            if (hidden[position + diff]) -                i--; -        } -        return (position + diff); -    } - -    private int getHiddenCount() { -        int count = 0; -        for (int i = 0; i < hidden.length; i++) -            if (hidden[i]) -                count++; -        return count; -    } - -    private int getHiddenCountUpTo(int location) { -        int count = 0; -        for (int i = 0; i <= location; i++) { -            if (hidden[i]) -                count++; -        } -        return count; -    } - -    @Override -    public int getCount() { -        return (hidden.length - getHiddenCount()); -    } -      public ProviderListAdapter(LayoutInflater layoutInflater, RendererBuilder rendererBuilder,                                 AdapteeCollection<Provider> collection) {          super(layoutInflater, rendererBuilder, collection); -        hidden = new boolean[collection.size()]; -        for (int i = 0; i < collection.size(); i++) -            hidden[i] = false; -    } - -    @Override -    public void add(Provider item) { -        super.add(item); -        if (getCollection().size() > hidden.length) { -            boolean[] new_hidden = new boolean[hidden.length + 1]; -            System.arraycopy(hidden, 0, new_hidden, 0, hidden.length); -            new_hidden[hidden.length] = false; -            hidden = new_hidden; -        } -    } - -    @Override -    public void remove(Provider item) { -        super.remove(item); -        boolean[] new_hidden = new boolean[hidden.length - 1]; -        System.arraycopy(hidden, 0, new_hidden, 0, hidden.length - 1); -        hidden = new_hidden; -    } - -    protected int indexOf(Provider item) { -        int index = 0; -        ProviderManager provider_manager = (ProviderManager) getCollection(); -        Set<Provider> providers = provider_manager.providers(); -        for (Provider provider : providers) { -            if (provider.equals(item)) { -                break; -            } else index++; -        } -        return index; -    } - -    @Override -    public View getView(int position, View convertView, ViewGroup parent) { -        return super.getView(getRealPosition(position), convertView, parent);      }      public void saveProviders() { diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java index bab8aa47..fdf8df3c 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java @@ -27,7 +27,6 @@ import android.support.v4.app.DialogFragment;  import android.support.v4.app.FragmentTransaction;  import android.util.Log;  import android.view.Menu; -import android.view.MenuItem;  import android.widget.ListView;  import com.pedrogomez.renderers.Renderer; @@ -168,7 +167,6 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity          isActivityShowing = true;          if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) {              showProgressBar(); -            adapter.hideAllBut(adapter.indexOf(provider));              checkProviderSetUp();          } else if (PENDING_SHOW_FAILED_DIALOG.equals(mConfigState.getAction())) {              showDownloadFailedDialog(); @@ -210,7 +208,6 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity      private void setUpProviderAPIResultReceiver() {          providerAPIResultReceiver = new ProviderAPIResultReceiver(new Handler(), this);          providerAPIBroadcastReceiver = new ProviderAPIBroadcastReceiver(); -          IntentFilter updateIntentFilter = new IntentFilter(PROVIDER_API_EVENT);          updateIntentFilter.addCategory(Intent.CATEGORY_DEFAULT);          registerReceiver(providerAPIBroadcastReceiver, updateIntentFilter); @@ -274,10 +271,15 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity          }          //TODO Code 2 pane view -        mConfigState.setAction(SETTING_UP_PROVIDER);          provider = adapter.getItem(position); -        showProgressBar(); -        onItemSelectedLogic(); +        if (provider != null && !provider.isDefault()) { +            //TODO Code 2 pane view +            mConfigState.setAction(SETTING_UP_PROVIDER); +            showProgressBar(); +            onItemSelectedLogic(); +        } else { +            addAndSelectNewProvider(); +        }      }      @Override @@ -302,7 +304,6 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity      public void cancelSettingUpProvider() {          hideProgressBar();          mConfigState.setAction(PROVIDER_NOT_SET); -        adapter.showAllProviders();          preferences.edit().remove(Provider.KEY).remove(PROVIDER_ALLOW_ANONYMOUS).remove(PROVIDER_KEY).apply();      } @@ -410,24 +411,9 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity          return true;      } -    @Override -    public boolean onOptionsItemSelected(MenuItem item) { -        switch (item.getItemId()) { -            case R.id.about_leap: -                startActivityForResult(new Intent(this, AboutFragment.class), 0); -                return true; -            case R.id.new_provider: -                addAndSelectNewProvider(); -                return true; -            default: -                return super.onOptionsItemSelected(item); -        } -    } -      public void cancelAndShowAllProviders() {          mConfigState.setAction(PROVIDER_NOT_SET);          provider = null; -        adapter.showAllProviders();      }      public class ProviderAPIBroadcastReceiver extends BroadcastReceiver { @@ -452,31 +438,35 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity                  String providerDomain = ConfigHelper.getProviderDomain(handledProvider);                  //FIXME: remove that lines as soon as Provider gets sent via broadcast +                // and make sure providers are the same - remove providersMatch                  if (resultCode == PROVIDER_OK && handledProvider == null) {                      providerName = ConfigHelper.getProviderName(preferences);                      providerDomain = ConfigHelper.getProviderDomain(preferences);                  } +                boolean providersMatch = true; +                if (providerDomain != null) { +                    providersMatch = providerDomain.equalsIgnoreCase(provider.getDomain()); +                } +                if (providerName != null && !providersMatch) { +                    providersMatch = providerName.equalsIgnoreCase(provider.getName()); +                } + -                if (providerName != null && providerName.equalsIgnoreCase(provider.getName()) && -                        providerDomain != null && -                        providerDomain.equalsIgnoreCase(provider.getDomain())) { -                    switch (resultCode) { -                        case PROVIDER_OK: +                switch (resultCode) { +                    case PROVIDER_OK: +                        if (providersMatch)                              handleProviderSetUp(); -                            break; -                        case PROVIDER_NOK: +                        break; +                    case PROVIDER_NOK: +                        if(providersMatch)                              handleProviderSetupFailed(resultData); -                            break; -                    } -                } else { -                    switch (resultCode) { -                        case CORRECTLY_DOWNLOADED_CERTIFICATE: -                            handleCorrectlyDownloadedCertificate(); -                            break; -                        case INCORRECTLY_DOWNLOADED_CERTIFICATE: -                            handleIncorrectlyDownloadedCertificate(); -                            break; -                    } +                        break; +                    case CORRECTLY_DOWNLOADED_CERTIFICATE: +                        handleCorrectlyDownloadedCertificate(); +                        break; +                    case INCORRECTLY_DOWNLOADED_CERTIFICATE: +                        handleIncorrectlyDownloadedCertificate(); +                        break;                  }              }          } diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java b/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java index 62c04c1a..ed41be67 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderManager.java @@ -15,9 +15,11 @@ import java.io.IOException;  import java.io.InputStream;  import java.net.MalformedURLException;  import java.net.URL; +import java.util.ArrayList;  import java.util.Collection;  import java.util.HashSet;  import java.util.Iterator; +import java.util.List;  import java.util.Set;  /** @@ -25,15 +27,14 @@ import java.util.Set;   */  public class ProviderManager implements AdapteeCollection<Provider> { -    private static final String TAG = ProviderManager.class.getName(); -    private AssetManager assets_manager; +    private AssetManager assetsManager;      private File externalFilesDir;      private Set<Provider> defaultProviders;      private Set<Provider> customProviders;      private static ProviderManager instance; -    final protected static String URLS = "urls"; +    final private static String URLS = "urls";      public static ProviderManager getInstance(AssetManager assetsManager, File externalFilesDir) {          if (instance == null) @@ -42,8 +43,8 @@ public class ProviderManager implements AdapteeCollection<Provider> {          return instance;      } -    public ProviderManager(AssetManager assetManager, File externalFilesDir) { -        this.assets_manager = assetManager; +    private ProviderManager(AssetManager assetManager, File externalFilesDir) { +        this.assetsManager = assetManager;          addDefaultProviders(assetManager);          addCustomProviders(externalFilesDir);      } @@ -57,7 +58,7 @@ public class ProviderManager implements AdapteeCollection<Provider> {      }      private Set<Provider> providersFromAssets(String directory, String[] relativeFilePaths) { -        Set<Provider> providers = new HashSet<Provider>(); +        Set<Provider> providers = new HashSet<>();              for (String file : relativeFilePaths) {                  String mainUrl = null; @@ -65,10 +66,10 @@ public class ProviderManager implements AdapteeCollection<Provider> {                  String providerDefinition = null;                  try {                      String provider = file.substring(0, file.length() - ".url".length()); -                    InputStream provider_file = assets_manager.open(directory + "/" + file); +                    InputStream provider_file = assetsManager.open(directory + "/" + file);                      mainUrl = extractMainUrlFromInputStream(provider_file); -                    certificate = ConfigHelper.loadInputStreamAsString(assets_manager.open(provider + ".pem")); -                    providerDefinition = ConfigHelper.loadInputStreamAsString(assets_manager.open(provider + ".json")); +                    certificate = ConfigHelper.loadInputStreamAsString(assetsManager.open(provider + ".pem")); +                    providerDefinition = ConfigHelper.loadInputStreamAsString(assetsManager.open(provider + ".json"));                  } catch (IOException e) {                      e.printStackTrace();                  } @@ -91,11 +92,11 @@ public class ProviderManager implements AdapteeCollection<Provider> {      }      private Set<Provider> providersFromFiles(String[] files) { -        Set<Provider> providers = new HashSet<Provider>(); +        Set<Provider> providers = new HashSet<>();          try {              for (String file : files) { -                String main_url = extractMainUrlFromInputStream(new FileInputStream(externalFilesDir.getAbsolutePath() + "/" + file)); -                providers.add(new Provider(new URL(main_url))); +                String mainUrl = extractMainUrlFromInputStream(new FileInputStream(externalFilesDir.getAbsolutePath() + "/" + file)); +                providers.add(new Provider(new URL(mainUrl)));              }          } catch (MalformedURLException | FileNotFoundException e) {              e.printStackTrace(); @@ -104,12 +105,12 @@ public class ProviderManager implements AdapteeCollection<Provider> {          return providers;      } -    private String extractMainUrlFromInputStream(InputStream input_stream) { +    private String extractMainUrlFromInputStream(InputStream inputStream) {          String mainUrl = ""; -        JSONObject file_contents = inputStreamToJson(input_stream); -        if (file_contents != null) -            mainUrl = file_contents.optString(Provider.MAIN_URL); +        JSONObject fileContents = inputStreamToJson(inputStream); +        if (fileContents != null) +            mainUrl = fileContents.optString(Provider.MAIN_URL);          return mainUrl;      } @@ -126,12 +127,13 @@ public class ProviderManager implements AdapteeCollection<Provider> {          return json;      } -    public Set<Provider> providers() { -        Set<Provider> all_providers = new HashSet<Provider>(); -        all_providers.addAll(defaultProviders); +    public List<Provider> providers() { +        List<Provider> allProviders = new ArrayList<>(); +        allProviders.addAll(defaultProviders);          if(customProviders != null) -            all_providers.addAll(customProviders); -        return all_providers; +            allProviders.addAll(customProviders); +        allProviders.add(new Provider()); +        return allProviders;      }      @Override @@ -151,9 +153,7 @@ public class ProviderManager implements AdapteeCollection<Provider> {      @Override      public boolean add(Provider element) { -        if (!defaultProviders.contains(element)) -            return customProviders.add(element); -        else return true; +        return !defaultProviders.contains(element) || customProviders.add(element);      }      @Override @@ -179,7 +179,7 @@ public class ProviderManager implements AdapteeCollection<Provider> {          customProviders.clear();      } -    protected void saveCustomProvidersToFile() { +    void saveCustomProvidersToFile() {          try {              for (Provider provider : customProviders) {                  File providerFile = new File(externalFilesDir, provider.getName() + ".json"); diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java b/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java index 4a5d0db1..5b3e5728 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java @@ -45,7 +45,11 @@ public class ProviderRenderer extends Renderer<Provider> {      @Override      public void render() {          Provider provider = getContent(); -        name.setText(provider.getName()); -        domain.setText(provider.getDomain()); +        if (!provider.isDefault()) { +            name.setText(provider.getName()); +            domain.setText(provider.getDomain()); +        } else { +            domain.setText(R.string.add_provider); +        }      }  } diff --git a/app/src/main/java/se/leap/bitmaskclient/StartActivity.java b/app/src/main/java/se/leap/bitmaskclient/StartActivity.java index f5991538..2d107c27 100644 --- a/app/src/main/java/se/leap/bitmaskclient/StartActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/StartActivity.java @@ -15,6 +15,7 @@ import java.lang.annotation.RetentionPolicy;  import de.blinkt.openvpn.core.VpnStatus;  import se.leap.bitmaskclient.userstatus.User; +import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;  import static se.leap.bitmaskclient.Constants.APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE;  import static se.leap.bitmaskclient.Constants.PREFERENCES_APP_VERSION;  import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; @@ -187,6 +188,7 @@ public class StartActivity extends Activity {      private void showMainActivity() {          Intent intent = new Intent(this, MainActivity.class); +        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);          intent.setAction(MainActivity.ACTION_SHOW_VPN_FRAGMENT);          startActivity(intent);          finish(); diff --git a/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java b/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java index 5b089524..459f337b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java +++ b/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java @@ -44,6 +44,8 @@ import static android.text.TextUtils.isEmpty;  import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_NONETWORK;  import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT;  import static se.leap.bitmaskclient.Constants.EIP_ACTION_STOP_BLOCKING_VPN; +import static se.leap.bitmaskclient.EipFragment.ASK_TO_CANCEL_VPN; +import static se.leap.bitmaskclient.MainActivity.ACTION_SHOW_VPN_FRAGMENT;  /**   * Created by cyberta on 14.01.18. @@ -86,7 +88,7 @@ public class VpnNotificationManager {                  VoidVpnService.NOTIFICATION_CHANNEL_NEWSTATUS_ID,                  PRIORITY_MAX,                  0, -                getDashboardIntent(), +                getMainActivityIntent(),                  actionBuilder.build());      } @@ -122,7 +124,7 @@ public class VpnNotificationManager {          if (status == LEVEL_WAITING_FOR_USER_INPUT)              contentIntent = getUserInputIntent(msg);          else -            contentIntent = getDashboardIntent(); +            contentIntent = getMainActivityIntent();          int priority;          if (OpenVPNService.NOTIFICATION_CHANNEL_NEWSTATUS_ID.equals(notificationChannelNewstatusId)) { @@ -254,11 +256,9 @@ public class VpnNotificationManager {          lastNotificationChannel = notificationChannelNewstatusId;      } -    private PendingIntent getDashboardIntent() { -        Intent startDashboard = new Intent(context, Dashboard.class); -        startDashboard.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | -                Intent.FLAG_ACTIVITY_SINGLE_TOP); -        return PendingIntent.getActivity(context, 0, startDashboard, PendingIntent.FLAG_CANCEL_CURRENT); +    private PendingIntent getMainActivityIntent() { +        Intent startActivity = new Intent(context, StartActivity.class); +        return PendingIntent.getActivity(context, 0, startActivity, PendingIntent.FLAG_CANCEL_CURRENT);      }      private PendingIntent getStopVoidVpnIntent() { @@ -268,10 +268,10 @@ public class VpnNotificationManager {      }      private PendingIntent getDisconnectIntent() { -        Intent disconnectVPN = new Intent(context, Dashboard.class); -        disconnectVPN.setAction(Intent.ACTION_MAIN); //needs to be set that actual action can get triggered -        disconnectVPN.putExtra(Dashboard.ACTION_ASK_TO_CANCEL_VPN, true); -        disconnectVPN.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); +        Intent disconnectVPN = new Intent(context, MainActivity.class); +        disconnectVPN.setAction(ACTION_SHOW_VPN_FRAGMENT); +        disconnectVPN.putExtra(ASK_TO_CANCEL_VPN, true); +        disconnectVPN.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);          return PendingIntent.getActivity(context, 0, disconnectVPN, PendingIntent.FLAG_CANCEL_CURRENT);      } diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java index eca5b881..23b4f2de 100644 --- a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java +++ b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java @@ -27,6 +27,8 @@ import android.util.Log;  import org.json.JSONException;  import org.json.JSONObject; +import java.lang.ref.WeakReference; +  import de.blinkt.openvpn.LaunchVPN;  import se.leap.bitmaskclient.OnBootReceiver; @@ -57,12 +59,12 @@ public final class EIP extends IntentService {      public final static String TAG = EIP.class.getSimpleName();      public final static String SERVICE_API_PATH = "config/eip-service.json"; -    private static ResultReceiver mReceiver; -    private static SharedPreferences preferences; +    private WeakReference<ResultReceiver> mReceiverRef = new WeakReference<>(null); +    private SharedPreferences preferences; -    private static JSONObject eipDefinition; +    private JSONObject eipDefinition;      private GatewaysManager gatewaysManager = new GatewaysManager(); -    private static Gateway gateway; +    private Gateway gateway;      public EIP() {          super(TAG); @@ -80,7 +82,9 @@ public final class EIP extends IntentService {      @Override      protected void onHandleIntent(Intent intent) {          String action = intent.getAction(); -        mReceiver = intent.getParcelableExtra(EIP_RECEIVER); +        if (intent.getParcelableExtra(EIP_RECEIVER) != null) { +            mReceiverRef = new WeakReference<>((ResultReceiver) intent.getParcelableExtra(EIP_RECEIVER)); +        }          if (action == null) {              return; @@ -241,10 +245,10 @@ public final class EIP extends IntentService {      }      private void tellToReceiver(String action, int resultCode) { -        if (mReceiver != null) { -            Bundle resultData = new Bundle(); -            resultData.putString(EIP_REQUEST, action); -            mReceiver.send(resultCode, resultData); +        Bundle resultData = new Bundle(); +        resultData.putString(EIP_REQUEST, action); +        if (mReceiverRef.get() != null) { +            mReceiverRef.get().send(resultCode, resultData);          }      }  } diff --git a/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java b/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java index 0f1d0cdb..4b8ce55d 100644 --- a/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/userstatus/UserStatusFragment.java @@ -3,6 +3,7 @@ package se.leap.bitmaskclient.userstatus;  import android.content.Context;  import android.os.Bundle;  import android.support.v4.app.Fragment; +import android.util.Log;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup; @@ -26,7 +27,7 @@ import se.leap.bitmaskclient.R;  public class UserStatusFragment extends Fragment implements Observer, SessionDialog.SessionDialogInterface { -    public static String TAG = UserStatusFragment.class.getSimpleName(); +    public final static String TAG = UserStatusFragment.class.getSimpleName();      private ProviderAPIResultReceiver providerAPI_result_receiver;      @InjectView(R.id.user_status_username) @@ -88,7 +89,8 @@ public class UserStatusFragment extends Fragment implements Observer, SessionDia          if(status.isLoggedIn())              logOut();          else if(status.isLoggedOut()) -            MainActivity.sessionDialog(Bundle.EMPTY); +            Log.w(TAG, "implement login from here?"); +            //MainActivity.sessionDialog(Bundle.EMPTY);          else if(status.inProgress())              cancelLoginOrSignup();      } diff --git a/app/src/main/res/menu/configuration_wizard_activity.xml b/app/src/main/res/menu/configuration_wizard_activity.xml index 9936b6dc..21591547 100644 --- a/app/src/main/res/menu/configuration_wizard_activity.xml +++ b/app/src/main/res/menu/configuration_wizard_activity.xml @@ -8,7 +8,7 @@      <item          android:id="@+id/new_provider"          android:orderInCategory="210" -        android:title="@string/new_provider_button" +        android:title="@string/add_provider"          android:showAsAction="ifRoom|withText"          android:icon="@drawable/ic_menu_add"          /> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b5955a95..46b0ceda 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -18,7 +18,7 @@      <string name="status_unknown">Estado no definido.</string>      <string name="eip_service_label">Acceso a Internet Encriptado con VPN</string>      <string name="configuration_wizard_title">Elige un proveedor</string> -    <string name="new_provider_button">Nuevo proveedor</string> +    <string name="add_provider">Nuevo proveedor</string>      <string name="introduce_new_provider">AƱadir un nuevo proveedor</string>      <string name="save">Guardar</string>      <string name="new_provider_uri">Dominio</string> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1443138..515e1f37 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,7 @@      <string name="status_unknown">Status unknown.</string>      <string name="eip_service_label">Encrypted VPN Internet Access</string>      <string name="configuration_wizard_title">Select a service provider</string> -    <string name="new_provider_button">Add new Provider</string> +    <string name="add_provider">Add new Provider</string>      <string name="introduce_new_provider">Add a new service provider</string>      <string name="save">Save</string>      <string name="new_provider_uri">Domain name</string> @@ -103,4 +103,5 @@      <string name="warning_corrupted_provider_details">Stored provider details are corrupted. You can either update Bitmask (recommended) or update the provider details using a commercial CA certificate.</string>      <string name="warning_corrupted_provider_cert">Stored provider certificate is invalid. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.</string>      <string name="warning_expired_provider_cert">Stored provider certificate is expired. You can either update Bitmask (recommended) or update the provider certificate using a commercial CA certificate.</string> +  </resources> diff --git a/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java b/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java index 8c008024..8403b046 100644 --- a/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java +++ b/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java @@ -87,8 +87,6 @@ public class ProviderListActivity extends ProviderListBaseActivity {              addAndSelectNewProvider(ProviderAPI.lastProviderMainUrl());          } else {              showProgressBar(); -            adapter.hideAllBut(adapter.indexOf(provider)); -              Intent providerApiCommand = new Intent(this, ProviderAPI.class);              providerApiCommand.setAction(ProviderAPI.SET_UP_PROVIDER); | 
