/*******************************************************************************
* This file is part of RedReader.
*
* RedReader 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.
*
* RedReader 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 RedReader. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package org.quantumbadger.redreader.activities;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.Toast;
import org.quantumbadger.redreader.R;
import org.quantumbadger.redreader.account.RedditAccount;
import org.quantumbadger.redreader.account.RedditAccountManager;
import org.quantumbadger.redreader.cache.CacheManager;
import org.quantumbadger.redreader.cache.CacheRequest;
import org.quantumbadger.redreader.common.AndroidApi;
import org.quantumbadger.redreader.common.General;
import org.quantumbadger.redreader.common.PrefsUtility;
import org.quantumbadger.redreader.common.RRError;
import org.quantumbadger.redreader.fragments.MarkdownPreviewDialog;
import org.quantumbadger.redreader.reddit.APIResponseHandler;
import org.quantumbadger.redreader.reddit.RedditAPI;
import java.util.ArrayList;
// TODO save draft as static var (as in comments)
public class PostSubmitActivity extends BaseActivity {
private Spinner typeSpinner, usernameSpinner;
private EditText subredditEdit, titleEdit, textEdit;
private CheckBox sendRepliesToInboxCheckbox;
private static final String[] postTypes = {"Link", "Self", "Upload to Imgur"};
private static final int
REQUEST_UPLOAD = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
PrefsUtility.applyTheme(this);
super.onCreate(savedInstanceState);
setTitle(R.string.submit_post_actionbar);
final LinearLayout layout = (LinearLayout) getLayoutInflater().inflate(R.layout.post_submit, null);
typeSpinner = (Spinner)layout.findViewById(R.id.post_submit_type);
usernameSpinner = (Spinner)layout.findViewById(R.id.post_submit_username);
subredditEdit = (EditText)layout.findViewById(R.id.post_submit_subreddit);
titleEdit = (EditText)layout.findViewById(R.id.post_submit_title);
textEdit = (EditText)layout.findViewById(R.id.post_submit_body);
sendRepliesToInboxCheckbox = (CheckBox)layout.findViewById(R.id.post_submit_send_replies_to_inbox);
final Intent intent = getIntent();
if(intent != null) {
if(intent.hasExtra("subreddit")) {
final String subreddit = intent.getStringExtra("subreddit");
if(subreddit != null && subreddit.length() > 0 && !subreddit.matches("/?(r/)?all/?") && subreddit.matches("/?(r/)?\\w+/?")) {
subredditEdit.setText(subreddit);
}
} else if(Intent.ACTION_SEND.equalsIgnoreCase(intent.getAction()) && intent.hasExtra(Intent.EXTRA_TEXT)){
final String url = intent.getStringExtra(Intent.EXTRA_TEXT);
textEdit.setText(url);
}
} else if(savedInstanceState != null && savedInstanceState.containsKey("post_title")) {
titleEdit.setText(savedInstanceState.getString("post_title"));
textEdit.setText(savedInstanceState.getString("post_body"));
subredditEdit.setText(savedInstanceState.getString("subreddit"));
typeSpinner.setSelection(savedInstanceState.getInt("post_type"));
}
final ArrayList<RedditAccount> accounts = RedditAccountManager.getInstance(this).getAccounts();
final ArrayList<String> usernames = new ArrayList<>();
for(RedditAccount account : accounts) {
if(!account.isAnonymous()) {
usernames.add(account.username);
}
}
if(usernames.size() == 0) {
General.quickToast(this, R.string.error_toast_notloggedin);
finish();
}
usernameSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, usernames));
typeSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, postTypes));
// TODO remove the duplicate code here
setHint();
typeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
setHint();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
final ScrollView sv = new ScrollView(this);
sv.addView(layout);
setBaseActivityContentView(sv);
}
private void setHint() {
final Object selected = typeSpinner.getSelectedItem();
if(selected.equals("Link") || selected.equals("Upload to Imgur")) {
textEdit.setHint(getString(R.string.submit_post_url_hint));
textEdit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);
textEdit.setSingleLine(true);
} else if(selected.equals("Self")) {
textEdit.setHint(getString(R.string.submit_post_self_text_hint));
textEdit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE | InputType.TYPE_TEXT_FLAG_MULTI_LINE);
textEdit.setSingleLine(false);
} else {
throw new RuntimeException("Unknown selection " + selected.toString());
}
if(selected.equals("Upload to Imgur")) {
typeSpinner.setSelection(0); // Link
final Intent intent = new Intent(this, ImgurUploadActivity.class);
startActivityForResult(intent, REQUEST_UPLOAD);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("post_title", titleEdit.getText().toString());
outState.putString("post_body", textEdit.getText().toString());
outState.putString("subreddit", subredditEdit.getText().toString());
outState.putInt("post_type", typeSpinner.getSelectedItemPosition());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
final MenuItem send = menu.add(R.string.comment_reply_send);
send.setIcon(R.drawable.ic_action_send_dark);
send.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(R.string.comment_reply_preview);
return true;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if(item.getTitle().equals(getString(R.string.comment_reply_send))) {
String subreddit = subredditEdit.getText().toString();
final String postTitle = titleEdit.getText().toString();
final String text = textEdit.getText().toString();
if (subreddit.isEmpty()) {
Toast.makeText(this, R.string.submit_post_specify_subreddit, Toast.LENGTH_SHORT).show();
subredditEdit.requestFocus();
} else if (postTitle.isEmpty()) {
Toast.makeText(this, R.string.submit_post_title_empty, Toast.LENGTH_SHORT).show();
titleEdit.requestFocus();
} else if (getString(R.string.submit_post_url_hint).equals(textEdit.getHint().toString()) && text.isEmpty()) {
Toast.makeText(this, R.string.submit_post_url_empty, Toast.LENGTH_SHORT).show();
textEdit.requestFocus();
} else {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle(getString(R.string.comment_reply_submitting_title));
progressDialog.setMessage(getString(R.string.comment_reply_submitting_message));
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(true);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(final DialogInterface dialogInterface) {
General.quickToast(PostSubmitActivity.this, getString(R.string.comment_reply_oncancel));
General.safeDismissDialog(progressDialog);
}
});
progressDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
public boolean onKey(final DialogInterface dialogInterface, final int keyCode, final KeyEvent keyEvent) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
General.quickToast(PostSubmitActivity.this, getString(R.string.comment_reply_oncancel));
General.safeDismissDialog(progressDialog);
}
return true;
}
});
final CacheManager cm = CacheManager.getInstance(this);
final APIResponseHandler.ActionResponseHandler handler = new APIResponseHandler.ActionResponseHandler(this) {
@Override
protected void onSuccess() {
AndroidApi.UI_THREAD_HANDLER.post(new Runnable() {
@Override
public void run() {
General.safeDismissDialog(progressDialog);
General.quickToast(PostSubmitActivity.this, getString(R.string.post_submit_done));
finish();
}
});
}
@Override
protected void onCallbackException(Throwable t) {
BugReportActivity.handleGlobalError(PostSubmitActivity.this, t);
}
@Override
protected void onFailure(@CacheRequest.RequestFailureType int type, Throwable t, Integer status, String readableMessage) {
final RRError error = General.getGeneralErrorForFailure(context, type, t, status, null);
AndroidApi.UI_THREAD_HANDLER.post(new Runnable() {
@Override
public void run() {
General.showResultDialog(PostSubmitActivity.this, error);
General.safeDismissDialog(progressDialog);
}
});
}
@Override
protected void onFailure(final APIFailureType type) {
final RRError error = General.getGeneralErrorForFailure(context, type);
AndroidApi.UI_THREAD_HANDLER.post(new Runnable() {
@Override
public void run() {
General.showResultDialog(PostSubmitActivity.this, error);
General.safeDismissDialog(progressDialog);
}
});
}
};
final boolean is_self = typeSpinner.getSelectedItem().equals("Self");
final RedditAccount selectedAccount = RedditAccountManager.getInstance(this).getAccount((String)usernameSpinner.getSelectedItem());
while(subreddit.startsWith("/")) subreddit = subreddit.substring(1);
while(subreddit.startsWith("r/")) subreddit = subreddit.substring(2);
while(subreddit.endsWith("/")) subreddit = subreddit.substring(0, subreddit.length() - 1);
final boolean sendRepliesToInbox = sendRepliesToInboxCheckbox.isChecked();
RedditAPI.submit(cm, handler, selectedAccount, is_self, subreddit, postTitle, text,
sendRepliesToInbox, this);
progressDialog.show();
}
return true;
} else if(item.getTitle().equals(getString(R.string.comment_reply_preview))) {
MarkdownPreviewDialog.newInstance(textEdit.getText().toString()).show(getSupportFragmentManager(), null);
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
if(requestCode == REQUEST_UPLOAD) {
if(data != null && data.getData() != null) {
textEdit.setText(data.getData().toString());
}
}
}
@Override
public void onBackPressed() {
if(General.onBackPressed()) super.onBackPressed();
}
}