diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f3b4b077..f98a6a24 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -161,7 +161,10 @@ android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation" /> + android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|keyboard|keyboardHidden|navigation" /> + diff --git a/app/src/main/java/org/mian/gitnex/activities/WikiActivity.java b/app/src/main/java/org/mian/gitnex/activities/WikiActivity.java new file mode 100644 index 00000000..cfc4a3be --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/activities/WikiActivity.java @@ -0,0 +1,169 @@ +package org.mian.gitnex.activities; + +import android.os.Bundle; +import android.text.method.ScrollingMovementMethod; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import androidx.annotation.NonNull; +import com.vdurmont.emoji.EmojiParser; +import org.gitnex.tea4j.v2.models.WikiPage; +import org.mian.gitnex.R; +import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.databinding.ActivityWikiBinding; +import org.mian.gitnex.helpers.AlertDialogs; +import org.mian.gitnex.helpers.AppUtil; +import org.mian.gitnex.helpers.Markdown; +import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; +import retrofit2.Call; +import retrofit2.Callback; + +/** + * @author M M Arif + */ + +public class WikiActivity extends BaseActivity { + + private ActivityWikiBinding binding; + private String pageName; + private RepositoryContext repository; + private boolean renderMd = true; + + @Override + public void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + + binding = ActivityWikiBinding.inflate(getLayoutInflater()); + repository = RepositoryContext.fromIntent(getIntent()); + + setContentView(binding.getRoot()); + setSupportActionBar(binding.toolbar); + + pageName = getIntent().getStringExtra("pageName"); + binding.close.setOnClickListener(view -> finish()); + + binding.toolbarTitle.setMovementMethod(new ScrollingMovementMethod()); + binding.toolbarTitle.setText(pageName); + + getWikiPageContents(); + } + + private void getWikiPageContents() { + + Call call = RetrofitClient + .getApiInterface(ctx) + .repoGetWikiPage(repository.getOwner(), repository.getName(), pageName); + + call.enqueue(new Callback<>() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + if(response.isSuccessful()) { + if(response.code() == 200) { + + WikiPage wikiPage = response.body(); + + runOnUiThread(() -> { + + assert wikiPage != null; + String pageContents = AppUtil.decodeBase64(wikiPage.getContentBase64()); + binding.contents.setContent(pageContents, "md"); + + if(renderMd) { + Markdown.render(ctx, EmojiParser.parseToUnicode(pageContents), binding.markdown, repository); + + binding.markdownFrame.setVisibility(View.VISIBLE); + binding.contents.setVisibility(View.GONE); + } + else { + binding.markdownFrame.setVisibility(View.GONE); + binding.contents.setVisibility(View.VISIBLE); + } + }); + } + else { + + switch(response.code()) { + + case 401: + runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx)); + break; + case 403: + runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError))); + break; + case 404: + runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound))); + break; + default: + runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError))); + } + } + + binding.progressBar.setVisibility(View.GONE); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError)); + } + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.edit_menu, menu); + inflater.inflate(R.menu.files_view_menu, menu); + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + int id = item.getItemId(); + + if(id == android.R.id.home) { + + finish(); + return true; + } + else if(id == R.id.edit) { + + return true; + } + else if(id == R.id.markdown) { + + if(!renderMd) { + + if(binding.markdown.getAdapter() == null) { + Markdown.render(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown, repository); + } + + binding.contents.setVisibility(View.GONE); + binding.markdownFrame.setVisibility(View.VISIBLE); + + renderMd = true; + } + else { + binding.markdownFrame.setVisibility(View.GONE); + binding.contents.setVisibility(View.VISIBLE); + + renderMd = false; + } + + return true; + } + else { + return super.onOptionsItemSelected(item); + } + } +} diff --git a/app/src/main/java/org/mian/gitnex/adapters/WikiListAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/WikiListAdapter.java index aaa84b93..1963214c 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/WikiListAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/WikiListAdapter.java @@ -2,6 +2,7 @@ package org.mian.gitnex.adapters; import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.graphics.Typeface; import android.view.LayoutInflater; import android.view.View; @@ -15,8 +16,11 @@ import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.util.ColorGenerator; import org.gitnex.tea4j.v2.models.WikiPageMetaData; import org.mian.gitnex.R; +import org.mian.gitnex.activities.RepoDetailActivity; +import org.mian.gitnex.activities.WikiActivity; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.TimeHelper; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; /** @@ -78,6 +82,10 @@ public class WikiListAdapter extends RecyclerView.Adapter { + Intent intent = new Intent(ctx, WikiActivity.class); + intent.putExtra("pageName", wikiPageMeta.getTitle()); + intent.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) itemView.getContext()).repository); + ctx.startActivity(intent); }); } diff --git a/app/src/main/res/layout/activity_wiki.xml b/app/src/main/res/layout/activity_wiki.xml new file mode 100644 index 00000000..d3995d21 --- /dev/null +++ b/app/src/main/res/layout/activity_wiki.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/edit_menu.xml b/app/src/main/res/menu/edit_menu.xml new file mode 100644 index 00000000..e18f811a --- /dev/null +++ b/app/src/main/res/menu/edit_menu.xml @@ -0,0 +1,13 @@ + + + + + +