diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cd4582c4..3b37c299 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,6 +20,7 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java index 0aaa1525..c2541c7a 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/board/BoardActivity.java @@ -1,9 +1,11 @@ package gr.thmmy.mthmmy.activities.board; +import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; +import android.support.v7.app.AlertDialog; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -20,6 +22,8 @@ import java.util.ArrayList; import java.util.Objects; import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.activities.create_content.CreateContentActivity; +import gr.thmmy.mthmmy.activities.LoginActivity; import gr.thmmy.mthmmy.base.BaseActivity; import gr.thmmy.mthmmy.model.Board; import gr.thmmy.mthmmy.model.Bookmark; @@ -51,6 +55,7 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo private String boardUrl; private String boardTitle; private String parsedTitle; + private String newTopicUrl; private int numberOfPages = -1; private int pagesLoaded = 0; @@ -95,37 +100,31 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo progressBar = findViewById(R.id.progressBar); newTopicFAB = findViewById(R.id.board_fab); - newTopicFAB.setEnabled(false); - newTopicFAB.hide(); - /*if (!sessionManager.isLoggedIn()) newTopicFAB.hide(); + if (!sessionManager.isLoggedIn()) newTopicFAB.hide(); else { - newTopicFAB.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (sessionManager.isLoggedIn()) { - //TODO create topic - } else { - new AlertDialog.Builder(BoardActivity.this) - .setMessage("You need to be logged in to create a new topic!") - .setPositiveButton("Login", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(BoardActivity.this, LoginActivity.class); - startActivity(intent); - finish(); - overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - } - }) - .show(); + newTopicFAB.setOnClickListener(view -> { + if (sessionManager.isLoggedIn()) { + //TODO create topic + if (newTopicUrl != null) { + Intent intent = new Intent(this, CreateContentActivity.class); + intent.putExtra(CreateContentActivity.EXTRA_NEW_TOPIC_URL, newTopicUrl); + startActivity(intent); } + } else { + new AlertDialog.Builder(BoardActivity.this) + .setMessage("You need to be logged in to create a new topic!") + .setPositiveButton("Login", (dialogInterface, i) -> { + Intent intent = new Intent(BoardActivity.this, LoginActivity.class); + startActivity(intent); + finish(); + overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out); + }) + .setNegativeButton("Cancel", (dialogInterface, i) -> { + }) + .show(); } }); - }*/ + } boardAdapter = new BoardAdapter(getApplicationContext(), parsedSubBoards, parsedTopics); RecyclerView mainContent = findViewById(R.id.board_recycler_view); @@ -214,6 +213,13 @@ public class BoardActivity extends BaseActivity implements BoardAdapter.OnLoadMo //It just means this board has only one page of topics. } } + + //Finds the url needed to create a new topic + Element newTopicButton = boardPage.select("a:has(img[alt=Start new topic])").first(); + if (newTopicButton == null) + newTopicButton = boardPage.select("a:has(img[alt=Νέο θέμα])").first(); + if (newTopicButton != null) newTopicUrl = newTopicButton.attr("href"); + { //Finds sub boards Elements subBoardRows = boardPage.select("div.tborder>table>tbody>tr"); if (subBoardRows != null && !subBoardRows.isEmpty()) { diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/CreateContentActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/CreateContentActivity.java new file mode 100644 index 00000000..781bb9f3 --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/CreateContentActivity.java @@ -0,0 +1,115 @@ +package gr.thmmy.mthmmy.activities.create_content; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.design.widget.TextInputLayout; +import android.view.View; +import android.view.inputmethod.InputConnection; +import android.widget.Toast; + +import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.activities.settings.SettingsActivity; +import gr.thmmy.mthmmy.base.BaseActivity; +import gr.thmmy.mthmmy.editorview.EditorView; +import gr.thmmy.mthmmy.editorview.EmojiKeyboard; +import gr.thmmy.mthmmy.session.SessionManager; +import me.zhanghai.android.materialprogressbar.MaterialProgressBar; +import timber.log.Timber; + +public class CreateContentActivity extends BaseActivity implements EmojiKeyboard.EmojiKeyboardOwner, + NewTopicTask.NewTopicTaskCallbacks { + + public final static String EXTRA_NEW_TOPIC_URL = "new-topic-extra"; + + private EditorView contentEditor; + private EmojiKeyboard emojiKeyboard; + private TextInputLayout subjectInput; + private MaterialProgressBar progressBar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_create_content); + + //Initialize toolbar + toolbar = findViewById(R.id.toolbar); + toolbar.setTitle("Create topic"); + setSupportActionBar(toolbar); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + + progressBar = findViewById(R.id.progressBar); + + Intent callingIntent = getIntent(); + String newTopicUrl = callingIntent.getStringExtra(EXTRA_NEW_TOPIC_URL); + + emojiKeyboard = findViewById(R.id.emoji_keyboard); + + subjectInput = findViewById(R.id.subject_input); + + contentEditor = findViewById(R.id.main_content_editorview); + setEmojiKeyboardInputConnection(contentEditor.getInputConnection()); + contentEditor.setEmojiKeyboardOwner(this); + contentEditor.setOnSubmitListener(v -> { + if (newTopicUrl != null) { + boolean includeAppSignature = true; + SessionManager sessionManager = BaseActivity.getSessionManager(); + if (sessionManager.isLoggedIn()) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + includeAppSignature = prefs.getBoolean(SettingsActivity.POSTING_APP_SIGNATURE_ENABLE_KEY, true); + } + + new NewTopicTask(this, includeAppSignature).execute(newTopicUrl, subjectInput.getEditText().getText().toString(), + contentEditor.getText().toString()); + } + }); + } + + @Override + public void setEmojiKeyboardVisible(boolean visible) { + emojiKeyboard.setVisibility(visible ? View.VISIBLE : View.GONE); + } + + @Override + public boolean isEmojiKeyboardVisible() { + return emojiKeyboard.getVisibility() == View.VISIBLE; + } + + @Override + public void setEmojiKeyboardInputConnection(InputConnection ic) { + emojiKeyboard.setInputConnection(ic); + } + + @Override + public void onBackPressed() { + if (emojiKeyboard.getVisibility() == View.VISIBLE) { + emojiKeyboard.setVisibility(View.GONE); + contentEditor.updateEmojiKeyboardVisibility(); + } else { + super.onBackPressed(); + } + } + + @Override + public void onNewTopicTaskStarted() { + Timber.i("New topic creation started"); + progressBar.setVisibility(View.VISIBLE); + } + + @Override + public void onNewTopicTaskFinished(boolean success) { + progressBar.setVisibility(View.INVISIBLE); + if (success) { + Timber.i("New topic created successfully"); + finish(); + } else { + Timber.w("New topic creation failed"); + Toast.makeText(getBaseContext(), "Failed to create new topic!", Toast.LENGTH_LONG).show(); + finish(); + } + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/NewTopicTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/NewTopicTask.java new file mode 100644 index 00000000..253280eb --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/create_content/NewTopicTask.java @@ -0,0 +1,100 @@ +package gr.thmmy.mthmmy.activities.create_content; + +import android.os.AsyncTask; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import gr.thmmy.mthmmy.base.BaseApplication; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import timber.log.Timber; + +import static gr.thmmy.mthmmy.activities.topic.Posting.replyStatus; + +public class NewTopicTask extends AsyncTask { + + private NewTopicTaskCallbacks listener; + private boolean includeAppSignature; + + public NewTopicTask(NewTopicTaskCallbacks listener, boolean includeAppSignature){ + this.listener = listener; + this.includeAppSignature = includeAppSignature; + } + + @Override + protected void onPreExecute() { + listener.onNewTopicTaskStarted(); + } + + @Override + protected Boolean doInBackground(String... strings) { + Request request = new Request.Builder() + .url(strings[0] + ";wap2") + .build(); + + OkHttpClient client = BaseApplication.getInstance().getClient(); + + Document document; + String seqnum, sc, topic, createTopicUrl; + try { + Response response = client.newCall(request).execute(); + document = Jsoup.parse(response.body().string()); + + seqnum = document.select("input[name=seqnum]").first().attr("value"); + sc = document.select("input[name=sc]").first().attr("value"); + topic = document.select("input[name=topic]").first().attr("value"); + createTopicUrl = document.select("form").first().attr("action"); + + final String appSignature = "\n[right][size=7pt][i]sent from [url=https://play.google.com/store/apps/" + + "details?id=gr.thmmy.mthmmy]mTHMMY[/url][/i][/size][/right]"; + + RequestBody postBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("message", strings[2] + (includeAppSignature ? appSignature : "")) + .addFormDataPart("seqnum", seqnum) + .addFormDataPart("sc", sc) + .addFormDataPart("subject", strings[1]) + .addFormDataPart("topic", topic) + .build(); + + Request post = new Request.Builder() + .url(createTopicUrl) + .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") + .post(postBody) + .build(); + + try { + client.newCall(post).execute(); + Response response2 = client.newCall(post).execute(); + switch (replyStatus(response2)) { + case SUCCESSFUL: + BaseApplication.getInstance().logFirebaseAnalyticsEvent("new_topic_creation", null); + return true; + default: + Timber.e("Malformed post. Request string: %s", post.toString()); + return false; + } + } catch (IOException e) { + return false; + } + } catch (IOException e) { + return false; + } + } + + @Override + protected void onPostExecute(Boolean success) { + listener.onNewTopicTaskFinished(success); + } + + public interface NewTopicTaskCallbacks { + void onNewTopicTaskStarted(); + void onNewTopicTaskFinished(boolean success); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java index 63c2955b..033316d2 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/ReplyTask.java @@ -31,7 +31,7 @@ public class ReplyTask extends AsyncTask { @Override protected Boolean doInBackground(String... args) { final String sentFrommTHMMY = includeAppSignature - ? "\n[right][size=7pt][i]sent from [url=https://play.google.com/store/apps/details?id=gr.thmmy.mthmmy]mTHMMY[/url][/i] [/size][/right]" + ? "\n[right][size=7pt][i]sent from [url=https://play.google.com/store/apps/details?id=gr.thmmy.mthmmy]mTHMMY[/url][/i][/size][/right]" : ""; RequestBody postBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) diff --git a/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java b/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java index 44b649a9..37fea85b 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java +++ b/app/src/main/java/gr/thmmy/mthmmy/editorview/EditorView.java @@ -205,7 +205,7 @@ public class EditorView extends LinearLayout { linkText.getEditText().setText( editText.getText().toString().substring(editText.getSelectionStart(), editText.getSelectionEnd())); } - new AlertDialog.Builder(context, R.style.AppCompatAlertDialogStyleAccent) + new AlertDialog.Builder(context, R.style.AppTheme_Dark_Dialog) .setTitle(R.string.dialog_create_link_title) .setView(dialogBody) .setPositiveButton(R.string.ok, (dialog, which) -> { diff --git a/app/src/main/res/layout/activity_create_content.xml b/app/src/main/res/layout/activity_create_content.xml new file mode 100644 index 00000000..60028c0c --- /dev/null +++ b/app/src/main/res/layout/activity_create_content.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e8d9ad4..c52cf546 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,4 +180,8 @@ Link URL Link text Required + + + New topic + Create topic