/**
* Copyright (c) 2017 LEAP Encryption Access Project and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see .
*/
package se.leap.bitmaskclient;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.widget.ListView;
import com.pedrogomez.renderers.Renderer;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.InjectView;
import butterknife.OnItemClick;
import se.leap.bitmaskclient.fragments.AboutFragment;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_ADD_PROVIDER;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;
import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SETTING_UP_PROVIDER;
import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SHOW_FAILED_DIALOG;
/**
* abstract base Activity that builds and shows the list of known available providers.
* The implementation of ProviderListBaseActivity differ in that they may or may not allow to bypass
* secure download mechanisms including certificate validation.
*
* It also allows the user to enter custom providers with a button.
*
* @author parmegv
* @author cyberta
*/
public abstract class ProviderListBaseActivity extends ProviderSetupBaseActivity {
@InjectView(R.id.provider_list)
protected ListView providerListView;
@Inject
protected ProviderListAdapter adapter;
final public static String TAG = ProviderListActivity.class.getSimpleName();
final protected static String EXTRAS_KEY_INVALID_URL = "INVALID_URL";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpInitialUI();
initProviderList();
restoreState(savedInstanceState);
}
public abstract void retrySetUpProvider(@NonNull Provider provider);
protected abstract void onItemSelectedLogic();
private void initProviderList() {
List> prototypes = new ArrayList<>();
prototypes.add(new ProviderRenderer(this));
ProviderRendererBuilder providerRendererBuilder = new ProviderRendererBuilder(prototypes);
adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, getProviderManager());
providerListView.setAdapter(adapter);
}
private void setUpInitialUI() {
setContentView(R.layout.a_provider_list);
setProviderHeaderText(R.string.setup_provider);
hideProgressBar();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) {
if (resultCode == RESULT_OK) {
setResult(resultCode, data);
finish();
}
} else if (requestCode == REQUEST_CODE_ADD_PROVIDER) {
if (resultCode == RESULT_OK) {
testNewURL = true;
String newUrl = data.getStringExtra(AddProviderActivity.EXTRAS_KEY_NEW_URL);
this.provider.setMainUrl(newUrl);
showAndSelectProvider(newUrl);
} else {
cancelSettingUpProvider();
}
}
}
public void showAndSelectProvider(String newURL) {
provider = new Provider(newURL, "", "");
autoSelectProvider();
}
private void autoSelectProvider() {
onItemSelectedLogic();
showProgressBar();
}
// ------- ProviderSetupInterface ---v
@Override
public void handleProviderSetUp(Provider handledProvider) {
this.provider = handledProvider;
adapter.add(provider);
adapter.saveProviders();
if (provider.allowsAnonymous()) {
//FIXME: providerApiBroadcastReceiver.getConfigState().putExtra(SERVICES_RETRIEVED, true); DEAD CODE???
downloadVpnCertificate();
} else {
showProviderDetails();
}
}
@Override
public void handleCorrectlyDownloadedCertificate(Provider handledProvider) {
this.provider = handledProvider;
showProviderDetails();
}
// -----------------------------------------
//TODO: only keep empty method for testing purposes
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
if (resultCode == AboutFragment.VIEWED) {
// Do nothing, right now
// I need this for CW to wait for the About activity to end before going back to Dashboard.
//FIXME: WEEEIRD!
}
}
@OnItemClick(R.id.provider_list)
void onItemSelected(int position) {
if (SETTING_UP_PROVIDER == getConfigState() ||
SHOW_FAILED_DIALOG == getConfigState()) {
return;
}
//TODO Code 2 pane view
provider = adapter.getItem(position);
if (provider != null && !provider.isDefault()) {
//TODO Code 2 pane view
providerConfigState = SETTING_UP_PROVIDER;
showProgressBar();
onItemSelectedLogic();
} else {
addAndSelectNewProvider();
}
}
@Override
public void onBackPressed() {
if (SETTING_UP_PROVIDER == providerConfigState ||
SHOW_FAILED_DIALOG == providerConfigState) {
cancelSettingUpProvider();
} else {
super.onBackPressed();
}
}
/**
* Open the new provider dialog
*/
public void addAndSelectNewProvider() {
Intent intent = new Intent(this, AddProviderActivity.class);
startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER);
}
/**
* Open the new provider dialog
*/
@Override
public void addAndSelectNewProvider(String url) {
testNewURL = false;
Intent intent = new Intent(this, AddProviderActivity.class);
intent.putExtra(EXTRAS_KEY_INVALID_URL, url);
startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER);
}
}