mini-cards/app/src/main/java/com/codigoparallevar/minicards/DeckPreviewActivity.java

306 lines
12 KiB
Java
Raw Normal View History

2018-01-21 11:05:54 +00:00
package com.codigoparallevar.minicards;
2018-01-22 23:59:28 +00:00
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
2020-03-02 20:01:11 +00:00
import android.os.AsyncTask;
2018-01-21 11:05:54 +00:00
import android.os.Bundle;
import com.codigoparallevar.minicards.types.functional.Function;
import com.codigoparallevar.minicards.types.functional.Tuple2;
import com.codigoparallevar.minicards.types.functional.Tuple3;
2020-03-02 21:10:22 +00:00
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
2018-01-22 00:03:17 +00:00
import android.util.Log;
2018-01-22 23:59:28 +00:00
import android.view.LayoutInflater;
2018-01-21 11:05:54 +00:00
import android.view.View;
2020-03-02 20:01:11 +00:00
import android.widget.Button;
2018-01-22 23:59:28 +00:00
import android.widget.EditText;
2018-01-21 11:05:54 +00:00
import android.widget.ListView;
2020-03-02 21:10:22 +00:00
import android.widget.TextView;
2018-01-22 23:59:28 +00:00
import android.widget.Toast;
2018-01-22 00:03:17 +00:00
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Vector;
2020-03-02 20:01:11 +00:00
import com.programaker.api.ProgramakerApi;
public class DeckPreviewActivity extends ReloadableAppCompatActivity {
private static final String TOKEN_KEY = "PROGRAMAKER_API_TOKEN";
private static final String PREFERENCES_NAME = "MINICARDS_PREFERENCES";
2018-01-21 11:05:54 +00:00
public static final String INTENT = "com.codigoparallevar.minicards.DECK";
private ListView listView;
private CardPreviewArrayAdapter cardArrayAdapter;
2020-03-02 20:01:11 +00:00
private ProgramakerApi ProgramakerApi = new ProgramakerApi();
2020-03-02 21:10:22 +00:00
protected void openLoginDialog(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View loginDialog = (LayoutInflater.from(this)
.inflate(R.layout.login_dialog_view, null));
final EditText loginUsernameText = loginDialog.findViewById(R.id.login_username_text);
final EditText loginPasswordText = loginDialog.findViewById(R.id.login_password_text);
final Button loginButton = loginDialog.findViewById(R.id.login_dialog_login_button);
final Button cancelButton = loginDialog.findViewById(R.id.login_dialog_cancel_button);
final TextView messageLabel = loginDialog.findViewById(R.id.login_message_label);
2020-03-02 21:10:22 +00:00
builder.setTitle("Login").setView(loginDialog);
final Dialog dialog = builder.create();
dialog.show();
cancelButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
dialog.cancel();
}
});
final TextWatcher watcher = (new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if ((messageLabel.getVisibility() != View.VISIBLE) &&
(loginUsernameText.getText().length() > 0) &&
(loginPasswordText.getText().length() > 0)) {
loginButton.setEnabled(true);
} else {
loginButton.setEnabled(false);
}
}
});
2020-03-02 20:01:11 +00:00
2020-03-02 21:10:22 +00:00
loginButton.setEnabled(false);
loginUsernameText.addTextChangedListener(watcher);
loginPasswordText.addTextChangedListener(watcher);
loginButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
messageLabel.setVisibility(View.VISIBLE);
messageLabel.setText(R.string.loading);
new CheckLogin().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
new Tuple3<>(
loginUsernameText.getText().toString(),
loginPasswordText.getText().toString(),
new Function<String>() {
public void apply(String token) {
if (token == null) {
messageLabel.setText(R.string.invalid_user_pass);
} else {
DeckPreviewActivity.this.setToken(token);
final Button loginToProgramakerButton = findViewById(R.id.login_in_programaker_button);
loginToProgramakerButton.setVisibility(View.GONE);
// Re-check... just in case
new CheckNeededLoginButton().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
new Tuple2<>(DeckPreviewActivity.this.ProgramakerApi,
loginToProgramakerButton));
dialog.cancel();
}
}
}));
2020-03-02 21:10:22 +00:00
}
});
2020-03-02 20:01:11 +00:00
}
2018-01-21 11:05:54 +00:00
private void setToken(String token) {
SharedPreferences preferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
SharedPreferences.Editor edit = preferences.edit();
edit.putString(TOKEN_KEY, token);
edit.commit();
this.ProgramakerApi.setToken(token);
}
private String getToken() {
SharedPreferences preferences = getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE);
if (!preferences.contains(TOKEN_KEY)) {
return null;
}
else {
return preferences.getString(TOKEN_KEY, null);
}
}
static class CheckLogin extends AsyncTask<Tuple3<String, String, Function<String>>,
Void, Tuple2<String, Function<String>>>{
@Override
protected Tuple2<String, Function<String>> doInBackground(Tuple3<String, String, Function<String>>... tuples) {
ProgramakerApi api = new ProgramakerApi();
boolean logged = false;
String token = null;
try {
token = api.login(tuples[0]._x, tuples[0]._y);
}
catch (Exception e) {
Log.e("Login to PrograMaker", e.toString());
}
return new Tuple2<String, Function<String>>(token, tuples[0]._z);
}
@Override
protected void onPostExecute(Tuple2<String, Function<String>> result) {
result.item2.apply(result.item1);
}
}
static class CheckNeededLoginButton extends AsyncTask<Tuple2<ProgramakerApi, Button>, Void, Tuple2<Boolean, Button>>{
@Override
protected Tuple2<Boolean, Button> doInBackground(Tuple2<ProgramakerApi, Button>... tuples) {
return new Tuple2<>(tuples[0].item1.check(), tuples[0].item2);
}
@Override
protected void onPostExecute(Tuple2<Boolean, Button> result) {
if (!result.item1) {
result.item2.setVisibility(View.VISIBLE);
}
}
}
2018-01-21 11:05:54 +00:00
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deck_preview);
Toolbar toolbar = findViewById(R.id.toolbar);
2018-01-21 11:05:54 +00:00
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.create_new_card_fab);
2018-01-21 11:05:54 +00:00
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
2018-01-22 23:59:28 +00:00
createOpenCardDialog();
2018-01-21 11:05:54 +00:00
}
});
final Button loginButton = findViewById(R.id.login_in_programaker_button);
2020-03-02 20:01:11 +00:00
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
2020-03-02 21:10:22 +00:00
DeckPreviewActivity.this.openLoginDialog(v);
2020-03-02 20:01:11 +00:00
}
});
listView = findViewById(R.id.card_deck_list);
String token = getToken();
if (token == null) {
loginButton.setVisibility(View.VISIBLE);
}
else {
loginButton.setVisibility(View.GONE);
this.ProgramakerApi.setToken(token);
// Double check that is not needed
new CheckNeededLoginButton().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
new Tuple2<>(this.ProgramakerApi, loginButton));
}
}
@Override
protected void onResume() {
super.onResume();
2018-01-21 11:05:54 +00:00
reload();
}
public void reload() {
cardArrayAdapter = new CardPreviewArrayAdapter(this, listAvailableCards());
2018-01-21 11:05:54 +00:00
listView.setAdapter(cardArrayAdapter);
}
2018-01-22 23:59:28 +00:00
private void createOpenCardDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View openCardOptions = (LayoutInflater.from(this)
.inflate(R.layout.create_new_card_view, null));
final EditText cardNameEditText = openCardOptions.findViewById(R.id.card_name_edit_text);
2018-01-22 23:59:28 +00:00
builder.setTitle("Create a new card")
.setView(openCardOptions)
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
CardFile cardfile = new CardFile(CardFile.getDefaultCardStorage(DeckPreviewActivity.this));
cardfile.setName(cardNameEditText.getText().toString());
cardfile.setBackgroundColor(CardFile.DEFAULT_BACKGROUND_COLOR);
2018-01-22 23:59:28 +00:00
try {
cardfile.save(DeckPreviewActivity.this);
} catch (IOException e) {
Log.e("Minicards DeckPreview", "Error creating card "+ e, e);
Toast.makeText(DeckPreviewActivity.this,
"Error creating card " + e,
Toast.LENGTH_LONG).show();
2018-01-22 23:59:28 +00:00
return;
}
CardActivity.openCard(DeckPreviewActivity.this, cardfile,
CardActivity.DEVELOPER_VISUALIZATION_MODE);
2018-01-22 23:59:28 +00:00
}
});
Dialog dialog = builder.create();
dialog.show();
}
2018-01-22 00:03:17 +00:00
private PreviewCard[] listAvailableCards() {
String cardsPath = CardFile.getDefaultCardStorage(this);
File cardsDir = new File(cardsPath);
if (!cardsDir.exists()) {
cardsDir.mkdir();
}
File[] cardFiles = cardsDir.listFiles();
if (cardFiles.length == 0){
try {
CardFile.createDefaultCards(cardsDir);
} catch (IOException e) {
Log.e("Minicards Deck preview",
"IOException when creating default cards", e);
}
cardFiles = cardsDir.listFiles();
}
List<PreviewCard> cards = new Vector<>(cardFiles.length);
for (File cardFile : cardFiles) {
try {
CardFile card = CardFile.load(cardFile.getAbsolutePath(), new StubPartGrid());
cards.add(new PreviewCard(card.getName(), card.getBackgroundColor(), card.getPath()));
} catch (ErrorLoadingCardException e) {
Log.e("Minicards Deck preview",
"Error loading card, [reason=" + e.getReason()
+ "; path=" + cardFile.getAbsolutePath(),
e);
} catch (IOException e) {
Log.e("Minicards Deck preview",
"IOException loading card, [msg=" + e.getMessage()
+ "; path=" + cardFile.getAbsolutePath(),
e);
}
}
return cards.toArray(new PreviewCard[cards.size()]);
}
2018-01-21 11:05:54 +00:00
}