2019-06-17 09:49:09 +02:00
|
|
|
package lu.circl.mispbump.activities;
|
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
import android.content.Intent;
|
2019-06-17 09:49:09 +02:00
|
|
|
import android.os.Bundle;
|
|
|
|
import android.view.MenuItem;
|
|
|
|
import android.view.View;
|
|
|
|
|
2019-07-04 14:01:43 +02:00
|
|
|
import androidx.annotation.Nullable;
|
2019-06-17 09:49:09 +02:00
|
|
|
import androidx.appcompat.app.ActionBar;
|
|
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
|
|
import androidx.appcompat.widget.Toolbar;
|
|
|
|
|
2019-07-04 14:01:43 +02:00
|
|
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
2019-06-17 09:49:09 +02:00
|
|
|
|
|
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
import lu.circl.mispbump.R;
|
2019-07-03 23:13:25 +02:00
|
|
|
import lu.circl.mispbump.auxiliary.MispRestClient;
|
2019-06-17 09:49:09 +02:00
|
|
|
import lu.circl.mispbump.auxiliary.PreferenceManager;
|
2019-06-19 20:01:49 +02:00
|
|
|
import lu.circl.mispbump.customViews.UploadAction;
|
2019-06-17 09:49:09 +02:00
|
|
|
import lu.circl.mispbump.models.UploadInformation;
|
2019-06-19 20:01:49 +02:00
|
|
|
import lu.circl.mispbump.models.restModels.Organisation;
|
|
|
|
import lu.circl.mispbump.models.restModels.Server;
|
|
|
|
import lu.circl.mispbump.models.restModels.User;
|
2019-06-17 09:49:09 +02:00
|
|
|
|
|
|
|
public class UploadActivity extends AppCompatActivity {
|
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
public static String EXTRA_UPLOAD_INFO = "uploadInformation";
|
2019-06-17 09:49:09 +02:00
|
|
|
|
|
|
|
private PreferenceManager preferenceManager;
|
|
|
|
private UploadInformation uploadInformation;
|
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
private MispRestClient restClient;
|
2019-06-17 09:49:09 +02:00
|
|
|
private UploadAction availableAction, orgAction, userAction, serverAction;
|
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private MispRestClient.AvailableCallback availableCallback = new MispRestClient.AvailableCallback() {
|
|
|
|
@Override
|
|
|
|
public void available() {
|
|
|
|
mispAvailable(true, null);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void unavailable(String error) {
|
|
|
|
mispAvailable(false, error);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private MispRestClient.OrganisationCallback organisationCallback = new MispRestClient.OrganisationCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(Organisation organisation) {
|
|
|
|
organisationAdded(organisation);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void failure(String error) {
|
|
|
|
organisationAdded(null);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private MispRestClient.UserCallback userCallback = new MispRestClient.UserCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(User user) {
|
|
|
|
userAdded(user);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void failure(String error) {
|
|
|
|
userAdded(null);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private MispRestClient.AllServersCallback allServersCallback = new MispRestClient.AllServersCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(Server[] servers) {
|
|
|
|
allServersReceived(servers);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void failure(String error) {
|
|
|
|
allServersReceived(null);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
private MispRestClient.ServerCallback serverCallback = new MispRestClient.ServerCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(Server server) {
|
|
|
|
serverAdded(server);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void failure(String error) {
|
|
|
|
serverAdded(null);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-07-04 14:01:43 +02:00
|
|
|
private FloatingActionButton fab;
|
2019-07-03 23:13:25 +02:00
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
private boolean errorWhileUpload;
|
|
|
|
|
2019-06-17 09:49:09 +02:00
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
setContentView(R.layout.activity_upload);
|
2019-07-02 13:34:36 +02:00
|
|
|
|
|
|
|
preferenceManager = PreferenceManager.getInstance(UploadActivity.this);
|
2019-07-14 18:18:54 +02:00
|
|
|
restClient = MispRestClient.getInstance(preferenceManager.getServerUrl(), preferenceManager.getAuthKey());
|
2019-07-02 13:34:36 +02:00
|
|
|
|
2019-06-17 09:49:09 +02:00
|
|
|
parseExtra();
|
2019-07-02 13:34:36 +02:00
|
|
|
initViews();
|
|
|
|
startUpload();
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
@Override
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
|
|
|
|
|
if (item.getItemId() == android.R.id.home) {
|
|
|
|
saveCurrentState();
|
|
|
|
finish();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return super.onOptionsItemSelected(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onBackPressed() {
|
|
|
|
super.onBackPressed();
|
|
|
|
saveCurrentState();
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
|
|
|
|
2019-06-19 17:24:00 +02:00
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
private void parseExtra() {
|
|
|
|
Intent i = getIntent();
|
|
|
|
|
|
|
|
UUID currentUUID = (UUID) i.getSerializableExtra(EXTRA_UPLOAD_INFO);
|
|
|
|
|
|
|
|
for (UploadInformation ui : preferenceManager.getUploadInformationList()) {
|
|
|
|
if (ui.getUuid().compareTo(currentUUID) == 0) {
|
|
|
|
uploadInformation = ui;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (uploadInformation == null) {
|
|
|
|
throw new RuntimeException("Could not find UploadInfo with UUID {" + currentUUID.toString() + "}");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initViews() {
|
2019-07-04 14:01:43 +02:00
|
|
|
getWindow().setStatusBarColor(getColor(R.color.colorPrimary));
|
|
|
|
|
|
|
|
fab = findViewById(R.id.fab);
|
|
|
|
fab.hide();
|
2019-06-17 09:49:09 +02:00
|
|
|
|
|
|
|
// toolbar
|
|
|
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
|
|
|
setSupportActionBar(toolbar);
|
|
|
|
ActionBar ab = getSupportActionBar();
|
|
|
|
assert ab != null;
|
2019-07-04 14:01:43 +02:00
|
|
|
|
|
|
|
ab.setDisplayShowTitleEnabled(false);
|
2019-06-17 09:49:09 +02:00
|
|
|
ab.setDisplayHomeAsUpEnabled(true);
|
|
|
|
ab.setHomeAsUpIndicator(R.drawable.ic_close);
|
|
|
|
|
|
|
|
availableAction = findViewById(R.id.availableAction);
|
|
|
|
orgAction = findViewById(R.id.orgAction);
|
|
|
|
userAction = findViewById(R.id.userAction);
|
|
|
|
serverAction = findViewById(R.id.serverAction);
|
|
|
|
}
|
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
private void saveCurrentState() {
|
|
|
|
if (errorWhileUpload) {
|
|
|
|
uploadInformation.setCurrentSyncStatus(UploadInformation.SyncStatus.FAILURE);
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
2019-07-02 13:34:36 +02:00
|
|
|
preferenceManager.addUploadInformation(uploadInformation);
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
|
|
|
|
2019-07-04 14:01:43 +02:00
|
|
|
private void setUploadActionState(UploadAction uploadAction, UploadAction.UploadState state, @Nullable String error) {
|
|
|
|
uploadAction.setCurrentUploadState(state);
|
|
|
|
uploadAction.setError(error);
|
|
|
|
|
|
|
|
switch (state) {
|
|
|
|
case PENDING:
|
|
|
|
if (fab.isShown()) {
|
|
|
|
fab.hide();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LOADING:
|
|
|
|
errorWhileUpload = false;
|
|
|
|
if (fab.isShown()) {
|
|
|
|
fab.hide();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case DONE:
|
|
|
|
errorWhileUpload = false;
|
|
|
|
break;
|
|
|
|
case ERROR:
|
|
|
|
uploadInformation.setCurrentSyncStatus(UploadInformation.SyncStatus.FAILURE);
|
|
|
|
|
|
|
|
fab.setImageResource(R.drawable.ic_autorenew);
|
|
|
|
fab.setOnClickListener(new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(View v) {
|
|
|
|
setUploadActionState(availableAction, UploadAction.UploadState.LOADING, null);
|
|
|
|
startUpload();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (!fab.isShown()) {
|
|
|
|
fab.show();
|
|
|
|
}
|
|
|
|
errorWhileUpload = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
|
2019-06-17 09:49:09 +02:00
|
|
|
private User generateSyncUser(Organisation organisation) {
|
|
|
|
User syncUser = new User();
|
|
|
|
syncUser.org_id = organisation.id;
|
|
|
|
syncUser.role_id = User.ROLE_SYNC_USER;
|
2019-06-17 12:02:05 +02:00
|
|
|
syncUser.email = uploadInformation.getRemote().syncUserEmail;
|
2019-06-17 09:49:09 +02:00
|
|
|
syncUser.password = uploadInformation.getRemote().syncUserPassword;
|
|
|
|
syncUser.authkey = uploadInformation.getRemote().syncUserAuthkey;
|
|
|
|
syncUser.termsaccepted = true;
|
|
|
|
|
|
|
|
return syncUser;
|
|
|
|
}
|
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private Server generateSyncServer() {
|
|
|
|
Server server = new Server();
|
|
|
|
server.name = uploadInformation.getRemote().organisation.name + "'s Sync Server";
|
|
|
|
server.url = uploadInformation.getRemote().baseUrl;
|
|
|
|
server.remote_org_id = uploadInformation.getRemote().organisation.id;
|
|
|
|
server.authkey = uploadInformation.getLocal().syncUserAuthkey;
|
|
|
|
server.pull = uploadInformation.isPull();
|
|
|
|
server.push = uploadInformation.isPush();
|
|
|
|
server.caching_enabled = uploadInformation.isCached();
|
|
|
|
server.self_signed = uploadInformation.isAllowSelfSigned();
|
|
|
|
return server;
|
|
|
|
}
|
|
|
|
|
2019-07-02 13:34:36 +02:00
|
|
|
|
2019-07-04 10:43:05 +02:00
|
|
|
/**
|
|
|
|
* Start upload to misp instance.
|
|
|
|
*/
|
|
|
|
private void startUpload() {
|
|
|
|
availableAction.setCurrentUploadState(UploadAction.UploadState.LOADING);
|
|
|
|
restClient.isAvailable(availableCallback);
|
|
|
|
}
|
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private void mispAvailable(boolean available, String error) {
|
|
|
|
if (available) {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(availableAction, UploadAction.UploadState.DONE, null);
|
2019-07-03 23:13:25 +02:00
|
|
|
restClient.addOrganisation(uploadInformation.getRemote().organisation, organisationCallback);
|
|
|
|
} else {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(availableAction, UploadAction.UploadState.ERROR, error);
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
2019-06-17 09:49:09 +02:00
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private void organisationAdded(Organisation organisation) {
|
|
|
|
if (organisation != null) {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(orgAction, UploadAction.UploadState.DONE, null);
|
2019-06-17 09:49:09 +02:00
|
|
|
uploadInformation.getRemote().organisation.id = organisation.id;
|
|
|
|
restClient.addUser(generateSyncUser(organisation), userCallback);
|
2019-07-03 23:13:25 +02:00
|
|
|
} else {
|
2019-07-04 10:43:05 +02:00
|
|
|
// search by UUID because the error does not give the actual ID
|
2019-07-03 23:13:25 +02:00
|
|
|
restClient.getOrganisation(uploadInformation.getRemote().organisation.uuid, new MispRestClient.OrganisationCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(Organisation organisation) {
|
|
|
|
organisationAdded(organisation);
|
|
|
|
}
|
2019-06-17 12:02:05 +02:00
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
@Override
|
|
|
|
public void failure(String error) {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(orgAction, UploadAction.UploadState.ERROR, error);
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
|
|
|
});
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
2019-06-17 09:49:09 +02:00
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private void userAdded(User user) {
|
|
|
|
if (user != null) {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(userAction, UploadAction.UploadState.DONE, null);
|
2019-07-03 23:13:25 +02:00
|
|
|
restClient.getAllServers(allServersCallback);
|
|
|
|
} else {
|
|
|
|
restClient.getUser(uploadInformation.getRemote().syncUserEmail, new MispRestClient.UserCallback() {
|
|
|
|
@Override
|
|
|
|
public void success(User user) {
|
|
|
|
userAdded(user);
|
|
|
|
}
|
2019-06-17 09:49:09 +02:00
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
@Override
|
|
|
|
public void failure(String error) {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(userAction, UploadAction.UploadState.ERROR, error);
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
|
|
|
});
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
2019-06-17 09:49:09 +02:00
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private void allServersReceived(Server[] servers) {
|
2019-07-04 10:43:05 +02:00
|
|
|
if (servers != null) {
|
|
|
|
Server serverToUpload = generateSyncServer();
|
|
|
|
|
|
|
|
for (Server server : servers) {
|
|
|
|
if (server.remote_org_id.equals(serverToUpload.remote_org_id)) {
|
|
|
|
// server already exists: override id to update instead
|
|
|
|
serverToUpload.id = server.id;
|
|
|
|
break;
|
|
|
|
}
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
2019-06-17 09:49:09 +02:00
|
|
|
|
2019-07-04 10:43:05 +02:00
|
|
|
restClient.addServer(serverToUpload, serverCallback);
|
|
|
|
} else {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(serverAction, UploadAction.UploadState.ERROR, "Could not retrieve server information");
|
2019-07-04 10:43:05 +02:00
|
|
|
}
|
2019-07-03 23:13:25 +02:00
|
|
|
}
|
2019-06-17 09:49:09 +02:00
|
|
|
|
2019-07-03 23:13:25 +02:00
|
|
|
private void serverAdded(Server server) {
|
|
|
|
if (server != null) {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(serverAction, UploadAction.UploadState.DONE, null);
|
2019-06-17 09:49:09 +02:00
|
|
|
uploadInformation.setCurrentSyncStatus(UploadInformation.SyncStatus.COMPLETE);
|
2019-07-02 13:34:36 +02:00
|
|
|
saveCurrentState();
|
2019-07-04 14:01:43 +02:00
|
|
|
|
|
|
|
fab.setImageResource(R.drawable.ic_check);
|
|
|
|
fab.setOnClickListener(new View.OnClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onClick(View v) {
|
|
|
|
finish();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
fab.show();
|
2019-07-03 23:13:25 +02:00
|
|
|
} else {
|
2019-07-04 14:01:43 +02:00
|
|
|
setUploadActionState(serverAction, UploadAction.UploadState.ERROR, "Could not add server");
|
2019-06-17 09:49:09 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|