Skip to content

Commit

Permalink
Merge pull request #1710 from dedis/work-fe2-matteo-automatic-sign-wi…
Browse files Browse the repository at this point in the history
…tnessing

Added automatic signature mechanism for organiser
  • Loading branch information
pierluca authored Nov 30, 2023
2 parents f325a91 + 5b36834 commit 4fb9bbf
Show file tree
Hide file tree
Showing 14 changed files with 316 additions and 159 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.github.dedis.popstellar.ui.home;

import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import com.github.dedis.popstellar.R;
import com.github.dedis.popstellar.databinding.ConnectingActivityBinding;
import com.github.dedis.popstellar.model.network.method.message.data.lao.CreateLao;
Expand All @@ -19,29 +19,46 @@
import com.github.dedis.popstellar.utility.error.ErrorUtils;
import com.github.dedis.popstellar.utility.security.KeyManager;
import com.tinder.scarlet.WebSocket;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import dagger.hilt.android.AndroidEntryPoint;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.observables.ConnectableObservable;
import java.util.*;
import java.util.stream.Collectors;
import javax.inject.Inject;
import timber.log.Timber;

import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;

@AndroidEntryPoint
public class ConnectingActivity extends AppCompatActivity {
public static final String TAG = ConnectingActivity.class.getSimpleName();

private final CompositeDisposable disposables = new CompositeDisposable();
private ConnectingActivityBinding binding;

@Inject GlobalNetworkManager networkManager;
@Inject KeyManager keyManager;
private ConnectingActivityBinding binding;

public static Intent newIntentForJoiningDetail(Context ctx, String laoId) {
Intent intent = new Intent(ctx, ConnectingActivity.class);
intent.putExtra(Constants.LAO_ID_EXTRA, laoId);
intent.putExtra(Constants.CONNECTION_PURPOSE_EXTRA, Constants.JOINING_EXTRA);
intent.putExtra(Constants.ACTIVITY_TO_OPEN_EXTRA, Constants.LAO_DETAIL_EXTRA);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
return intent;
}

public static Intent newIntentForCreatingDetail(
Context ctx, String laoName, List<PublicKey> witnesses, boolean isWitnessingEnabled) {
Intent intent = new Intent(ctx, ConnectingActivity.class);
intent.putExtra(Constants.LAO_NAME, laoName);
intent.putStringArrayListExtra(
Constants.WITNESSES,
new ArrayList<>(
witnesses.stream().map(PublicKey::getEncoded).collect(Collectors.toList())));
intent.putExtra(Constants.CONNECTION_PURPOSE_EXTRA, Constants.CREATING_EXTRA);
intent.putExtra(Constants.ACTIVITY_TO_OPEN_EXTRA, Constants.LAO_DETAIL_EXTRA);
intent.putExtra(Constants.WITNESSING_FLAG_EXTRA, isWitnessingEnabled);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
return intent;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -126,11 +143,17 @@ private void handleConnecting(boolean isDestinationHome) {
if (isCreation) {
String laoName = getIntent().getExtras().getString(Constants.LAO_NAME);
List<String> witnessesList = getIntent().getStringArrayListExtra(Constants.WITNESSES);
List<PublicKey> witnesses =
witnessesList.stream().map(PublicKey::new).collect(Collectors.toList());

// Add the organizer to the list of witnesses
witnesses.add(keyManager.getMainPublicKey());
boolean isWitnessingEnabled =
getIntent().getExtras().getBoolean(Constants.WITNESSING_FLAG_EXTRA);

List<PublicKey> witnesses;
if (isWitnessingEnabled) {
witnesses = witnessesList.stream().map(PublicKey::new).collect(Collectors.toList());
// Add the organizer to the list of witnesses
witnesses.add(keyManager.getMainPublicKey());
} else {
witnesses = Collections.emptyList();
}

CreateLao createLao = new CreateLao(laoName, keyManager.getMainPublicKey(), witnesses);
Lao lao = new Lao(createLao.getId());
Expand Down Expand Up @@ -179,27 +202,4 @@ private void setupCancelButton() {
finish();
});
}

public static Intent newIntentForJoiningDetail(Context ctx, String laoId) {
Intent intent = new Intent(ctx, ConnectingActivity.class);
intent.putExtra(Constants.LAO_ID_EXTRA, laoId);
intent.putExtra(Constants.CONNECTION_PURPOSE_EXTRA, Constants.JOINING_EXTRA);
intent.putExtra(Constants.ACTIVITY_TO_OPEN_EXTRA, Constants.LAO_DETAIL_EXTRA);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
return intent;
}

public static Intent newIntentForCreatingDetail(
Context ctx, String laoName, List<PublicKey> witnesses) {
Intent intent = new Intent(ctx, ConnectingActivity.class);
intent.putExtra(Constants.LAO_NAME, laoName);
intent.putStringArrayListExtra(
Constants.WITNESSES,
new ArrayList<>(
witnesses.stream().map(PublicKey::getEncoded).collect(Collectors.toList())));
intent.putExtra(Constants.CONNECTION_PURPOSE_EXTRA, Constants.CREATING_EXTRA);
intent.putExtra(Constants.ACTIVITY_TO_OPEN_EXTRA, Constants.LAO_DETAIL_EXTRA);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
return intent;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import android.app.Application;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.lifecycle.*;

import com.github.dedis.popstellar.R;
import com.github.dedis.popstellar.model.objects.Wallet;
import com.github.dedis.popstellar.model.objects.view.LaoView;
Expand All @@ -22,18 +20,15 @@
import com.github.dedis.popstellar.utility.error.keys.SeedValidationException;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;

import dagger.hilt.android.lifecycle.HiltViewModel;
import io.reactivex.BackpressureStrategy;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import java.security.GeneralSecurityException;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.inject.Inject;

import dagger.hilt.android.lifecycle.HiltViewModel;
import io.reactivex.BackpressureStrategy;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import timber.log.Timber;

@HiltViewModel
Expand All @@ -51,6 +46,8 @@ public class HomeViewModel extends AndroidViewModel
/** This LiveData boolean is used to indicate whether the HomeFragment is displayed */
private final MutableLiveData<Boolean> isHome = new MutableLiveData<>(Boolean.TRUE);

private final MutableLiveData<Boolean> isWitnessingEnabled = new MutableLiveData<>(Boolean.FALSE);

/**
* This atomic flag is used to avoid the scanner fragment to open multiple connecting activities,
* as in few seconds it scans the same qr code multiple times. This flag signals when a connecting
Expand Down Expand Up @@ -215,6 +212,10 @@ public MutableLiveData<Boolean> isHome() {
return isHome;
}

public MutableLiveData<Boolean> isWitnessingEnabled() {
return isWitnessingEnabled;
}

/**
* Function to set the liveData isHome.
*
Expand All @@ -226,6 +227,17 @@ public void setIsHome(boolean isHome) {
}
}

/**
* Function to set the liveData isWitnessingEnabled.
*
* @param isWitnessingEnabled true if we want to enable witnessing, false otherwise
*/
public void setIsWitnessingEnabled(boolean isWitnessingEnabled) {
if (!Boolean.valueOf(isWitnessingEnabled).equals(this.isWitnessingEnabled.getValue())) {
this.isWitnessingEnabled.setValue(isWitnessingEnabled);
}
}

/** Set to false the connecting flag when the connecting activity has finished */
public void disableConnectingFlag() {
connecting.set(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,20 @@
import android.text.TextWatcher;
import android.view.*;
import android.widget.ArrayAdapter;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.github.dedis.popstellar.R;
import com.github.dedis.popstellar.databinding.LaoCreateFragmentBinding;
import com.github.dedis.popstellar.model.objects.security.PublicKey;
import com.github.dedis.popstellar.repository.remote.GlobalNetworkManager;
import com.github.dedis.popstellar.ui.lao.witness.WitnessingViewModel;
import com.github.dedis.popstellar.ui.qrcode.QrScannerFragment;
import com.github.dedis.popstellar.ui.qrcode.ScanningAction;

import java.util.List;
import java.util.Objects;
import dagger.hilt.android.AndroidEntryPoint;
import java.util.*;
import java.util.stream.Collectors;

import javax.inject.Inject;

import dagger.hilt.android.AndroidEntryPoint;
import timber.log.Timber;

/** Fragment used to display the Launch UI */
Expand Down Expand Up @@ -56,10 +50,11 @@ public View onCreateView(
viewModel = HomeActivity.obtainViewModel(requireActivity());
witnessingViewModel = HomeActivity.obtainWitnessingViewModel(requireActivity());

setupCancelButton();
setupClearButton();
setupTextFields();
setupAddWitnesses();
setupCreateButton();
setupWitnessingSwitch();

handleBackNav();
return binding.getRoot();
Expand Down Expand Up @@ -124,11 +119,6 @@ private void setupAddWitnesses() {
.map(PublicKey::getEncoded)
.collect(Collectors.toList());

// Show the witnesses title only if there's at least one witness
if (!witnesses.isEmpty()) {
binding.witnessesTitle.setVisibility(View.VISIBLE);
}

ArrayAdapter<String> witnessesListAdapter =
new ArrayAdapter<>(requireContext(), android.R.layout.simple_list_item_1, witnesses);
binding.witnessesList.setAdapter(witnessesListAdapter);
Expand All @@ -141,24 +131,48 @@ private void setupCreateButton() {
Objects.requireNonNull(binding.serverUrlEntryEditText.getText()).toString();
String laoName =
Objects.requireNonNull(binding.laoNameEntryEditText.getText()).toString();
boolean isWitnessingEnabled =
Boolean.TRUE.equals(viewModel.isWitnessingEnabled().getValue());
Timber.tag(TAG).d("creating lao with name %s", laoName);
List<PublicKey> witnesses = witnessingViewModel.getScannedWitnesses();

networkManager.connect(serverAddress);
requireActivity()
.startActivity(
ConnectingActivity.newIntentForCreatingDetail(
requireContext(), laoName, witnesses));
requireContext(), laoName, witnesses, isWitnessingEnabled));
});
}

private void setupCancelButton() {
binding.buttonCancelLaunch.setOnClickListener(
private void setupClearButton() {
binding.buttonClearLaunch.setOnClickListener(
v -> {
Objects.requireNonNull(binding.laoNameEntryEditText.getText()).clear();
HomeActivity.setCurrentFragment(
getParentFragmentManager(), R.id.fragment_home, HomeFragment::newInstance);
Objects.requireNonNull(binding.serverUrlEntryEditText.getText()).clear();
binding.enableWitnessingSwitch.setChecked(false);
witnessingViewModel.setWitnesses(Collections.emptyList());
});
}

private void setupWitnessingSwitch() {
binding.enableWitnessingSwitch.setOnCheckedChangeListener(
(button, isChecked) -> {
viewModel.setIsWitnessingEnabled(isChecked);
if (isChecked) {
binding.addWitnessButton.setVisibility(View.VISIBLE);
if (!witnessingViewModel.getScannedWitnesses().isEmpty()) {
binding.witnessesTitle.setVisibility(View.VISIBLE);
binding.witnessesList.setVisibility(View.VISIBLE);
}
} else {
binding.addWitnessButton.setVisibility(View.GONE);
binding.witnessesTitle.setVisibility(View.GONE);
binding.witnessesList.setVisibility(View.GONE);
}
});
// Use this to save the preference after opening and closing the QR code
binding.enableWitnessingSwitch.setChecked(
Boolean.TRUE.equals(viewModel.isWitnessingEnabled().getValue()));
}

private void handleBackNav() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,16 @@
import android.os.Bundle;
import android.view.*;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.SwitchPreference;

import com.github.dedis.popstellar.R;
import com.github.dedis.popstellar.utility.MessageValidator;
import com.github.dedis.popstellar.utility.NetworkLogger;
import com.takisoft.preferencex.EditTextPreference;
import com.takisoft.preferencex.PreferenceFragmentCompat;

import java.util.Objects;

import dagger.hilt.android.AndroidEntryPoint;
import java.util.Objects;

@AndroidEntryPoint
public class SettingsFragment extends PreferenceFragmentCompat {
Expand All @@ -43,6 +39,7 @@ public void onCreatePreferencesFix(@Nullable Bundle savedInstanceState, String r
setDebuggingPreferences();
}

@NonNull
@Override
public View onCreateView(
@NonNull LayoutInflater inflater,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import androidx.activity.OnBackPressedCallback;
import androidx.annotation.IdRes;
import androidx.annotation.Nullable;
Expand All @@ -13,7 +12,6 @@
import androidx.fragment.app.*;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;

import com.github.dedis.popstellar.R;
import com.github.dedis.popstellar.databinding.LaoActivityBinding;
import com.github.dedis.popstellar.model.Role;
Expand All @@ -36,11 +34,9 @@
import com.github.dedis.popstellar.utility.error.UnknownLaoException;
import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;

import dagger.hilt.android.AndroidEntryPoint;
import java.util.*;
import java.util.function.Supplier;

import dagger.hilt.android.AndroidEntryPoint;
import timber.log.Timber;

@AndroidEntryPoint
Expand Down Expand Up @@ -367,7 +363,13 @@ public static WitnessingViewModel obtainWitnessingViewModel(
FragmentActivity activity, String laoId) {
WitnessingViewModel witnessingViewModel =
new ViewModelProvider(activity).get(WitnessingViewModel.class);
witnessingViewModel.initialize(laoId);
try {
witnessingViewModel.initialize(laoId);
} catch (UnknownLaoException e) {
Timber.tag(TAG)
.e(e, "Unable to initialize the witnessing model: not found lao with lao id=%s", laoId);
return witnessingViewModel;
}
return witnessingViewModel;
}

Expand Down
Loading

0 comments on commit 4fb9bbf

Please sign in to comment.