From 0caaa63b06164ec2b6cd7fb0ef3456a63f31a6fb Mon Sep 17 00:00:00 2001 From: M M Arif Date: Wed, 8 Apr 2020 23:31:27 +0500 Subject: [PATCH 1/4] Close/reopen milestone --- .../mian/gitnex/actions/MilestoneActions.java | 143 ++++++++++++++++++ .../activities/IssueDetailActivity.java | 5 - .../gitnex/adapters/MilestonesAdapter.java | 132 +++++++++------- .../mian/gitnex/interfaces/ApiInterface.java | 3 + .../org/mian/gitnex/models/Milestones.java | 4 + .../bottom_sheet_milestones_in_list.xml | 48 ++++++ app/src/main/res/layout/list_milestones.xml | 52 +++++-- app/src/main/res/values/strings.xml | 6 +- 8 files changed, 326 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java create mode 100644 app/src/main/res/layout/bottom_sheet_milestones_in_list.xml diff --git a/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java b/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java new file mode 100644 index 00000000..bf7a909e --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java @@ -0,0 +1,143 @@ +package org.mian.gitnex.actions; + +import android.content.Context; +import android.util.Log; +import androidx.annotation.NonNull; +import com.google.gson.JsonElement; +import org.mian.gitnex.R; +import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.helpers.AlertDialogs; +import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.models.Milestones; +import org.mian.gitnex.util.TinyDB; +import org.mian.gitnex.viewmodels.MilestonesViewModel; +import retrofit2.Call; +import retrofit2.Callback; + +/** + * Author M M Arif + */ + +public class MilestoneActions { + + static final private String TAG = "MilestoneActions : "; + + public static void closeMilestone(final Context ctx, int milestoneId_) { + + final TinyDB tinyDB = new TinyDB(ctx); + + final String instanceUrl = tinyDB.getString("instanceUrl"); + String repoFullName = tinyDB.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; + final String loginUid = tinyDB.getString("loginUid"); + final String token = "token " + tinyDB.getString(loginUid + "-token"); + + Milestones milestoneStateJson = new Milestones("closed"); + Call call; + + call = RetrofitClient + .getInstance(instanceUrl, ctx) + .getApiInterface() + .closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson); + + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + if(response.isSuccessful()) { + + Toasty.info(ctx, ctx.getString(R.string.milestoneStatusUpdate)); + MilestonesViewModel.loadMilestonesList(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, token), repoOwner, repoName, "all", ctx); + + } + else if(response.code() == 401) { + + AlertDialogs.authorizationTokenRevokedDialog(ctx, ctx.getResources().getString(R.string.alertDialogTokenRevokedTitle), + ctx.getResources().getString(R.string.alertDialogTokenRevokedMessage), + ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), + ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + + } + else { + + Toasty.info(ctx, ctx.getString(R.string.genericError)); + + } + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Log.e(TAG, t.toString()); + + } + + }); + + + } + + public static void openMilestone(final Context ctx, int milestoneId_) { + + final TinyDB tinyDB = new TinyDB(ctx); + + final String instanceUrl = tinyDB.getString("instanceUrl"); + String repoFullName = tinyDB.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; + final String loginUid = tinyDB.getString("loginUid"); + final String token = "token " + tinyDB.getString(loginUid + "-token"); + + Milestones milestoneStateJson = new Milestones("open"); + Call call; + + call = RetrofitClient + .getInstance(instanceUrl, ctx) + .getApiInterface() + .closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson); + + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + if(response.isSuccessful()) { + + Toasty.info(ctx, ctx.getString(R.string.milestoneStatusUpdate)); + MilestonesViewModel.loadMilestonesList(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, token), repoOwner, repoName, "all", ctx); + + } + else if(response.code() == 401) { + + AlertDialogs.authorizationTokenRevokedDialog(ctx, ctx.getResources().getString(R.string.alertDialogTokenRevokedTitle), + ctx.getResources().getString(R.string.alertDialogTokenRevokedMessage), + ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), + ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + + } + else { + + Toasty.info(ctx, ctx.getString(R.string.genericError)); + + } + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Log.e(TAG, t.toString()); + + } + + }); + + } + +} diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 13c2406b..70d7a8bf 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -68,7 +68,6 @@ import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.viewmodels.IssueCommentsViewModel; -import org.ocpsoft.prettytime.PrettyTime; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; @@ -199,10 +198,6 @@ public class IssueDetailActivity extends BaseActivity { switch(tinyDb.getInt("customFontId")) { - case 0: - myTypeface = Typeface.createFromAsset(Objects.requireNonNull(getApplicationContext()).getAssets(), "fonts/roboto.ttf"); - break; - case 1: myTypeface = Typeface.createFromAsset(Objects.requireNonNull(getApplicationContext()).getAssets(), "fonts/manroperegular.ttf"); break; diff --git a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java index b1c5af01..79d990c8 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java @@ -15,8 +15,10 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.amulyakhare.textdrawable.TextDrawable; +import com.google.android.material.bottomsheet.BottomSheetDialog; import com.vdurmont.emoji.EmojiParser; import org.mian.gitnex.R; +import org.mian.gitnex.actions.MilestoneActions; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.models.Milestones; @@ -32,7 +34,6 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import io.noties.markwon.AbstractMarkwonPlugin; import io.noties.markwon.Markwon; @@ -42,7 +43,6 @@ import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListPlugin; import io.noties.markwon.html.HtmlPlugin; -import io.noties.markwon.image.AsyncDrawable; import io.noties.markwon.image.DefaultMediaDecoder; import io.noties.markwon.image.ImageItem; import io.noties.markwon.image.ImagesPlugin; @@ -63,6 +63,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter { - Context context = v.getContext(); - Log.i("issueNumber", issueNumber.getText().toString()); + Context ctx = v.getContext(); + int milestoneId_ = Integer.parseInt(milestoneId.getText().toString()); - Intent intent = new Intent(context, IssueDetailActivity.class); - intent.putExtra("issueNumber", issueNumber.getText()); + @SuppressLint("InflateParams") View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_milestones_in_list, null); - TinyDB tinyDb = new TinyDB(context); - tinyDb.putString("issueNumber", issueNumber.getText().toString()); - context.startActivity(intent); + TextView closeMilestone = view.findViewById(R.id.closeMilestone); + TextView openMilestone = view.findViewById(R.id.openMilestone); + + BottomSheetDialog dialog = new BottomSheetDialog(ctx); + dialog.setContentView(view); + dialog.show(); + + if(milestoneStatus.getText().toString().equals("open")) { + + closeMilestone.setVisibility(View.VISIBLE); + openMilestone.setVisibility(View.GONE); + + } + else { + + closeMilestone.setVisibility(View.GONE); + openMilestone.setVisibility(View.VISIBLE); + + } + + closeMilestone.setOnClickListener(v12 -> { + + MilestoneActions.closeMilestone(ctx, milestoneId_); + dialog.dismiss(); + + }); + + openMilestone.setOnClickListener(v12 -> { + + MilestoneActions.openMilestone(ctx, milestoneId_); + dialog.dismiss(); + + }); + + }); - } - });*/ } } @@ -123,46 +155,40 @@ public class MilestonesAdapter extends RecyclerView.Adapter { + plugin.addSchemeHandler(new SchemeHandler() { + @NonNull + @Override + public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { - final int resourceId = mCtx.getResources().getIdentifier( - raw.substring("drawable://".length()), - "drawable", - mCtx.getPackageName()); + final int resourceId = mCtx.getResources().getIdentifier( + raw.substring("drawable://".length()), + "drawable", + mCtx.getPackageName()); - final Drawable drawable = mCtx.getDrawable(resourceId); + final Drawable drawable = mCtx.getDrawable(resourceId); - assert drawable != null; - return ImageItem.withResult(drawable); - } + assert drawable != null; + return ImageItem.withResult(drawable); + } - @NonNull - @Override - public Collection supportedSchemes() { - return Collections.singleton("drawable"); - } - }); - plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() { - @Nullable - @Override - public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) { - return null; - } - }); - plugin.addMediaDecoder(GifMediaDecoder.create(false)); - plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources())); - plugin.addMediaDecoder(SvgMediaDecoder.create()); - plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources())); - plugin.defaultMediaDecoder(DefaultMediaDecoder.create()); - } + @NonNull + @Override + public Collection supportedSchemes() { + return Collections.singleton("drawable"); + } + }); + plugin.placeholderProvider(drawable -> null); + plugin.addMediaDecoder(GifMediaDecoder.create(false)); + plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources())); + plugin.addMediaDecoder(SvgMediaDecoder.create()); + plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources())); + plugin.defaultMediaDecoder(DefaultMediaDecoder.create()); })) .usePlugin(new AbstractMarkwonPlugin() { @Override @@ -182,7 +208,6 @@ public class MilestonesAdapter extends RecyclerView.Adapter filteredList = new ArrayList<>(); @@ -328,6 +355,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter> getRepositoryCommits(@Header("Authorization") String token, @Path("owner") String owner, @Path("repo") String repo, @Query("page") int page, @Query("sha") String branchName); + + @PATCH("repos/{owner}/{repo}/milestones/{index}") // close / reopen milestone + Call closeReopenMilestone(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("index") int index, @Body Milestones jsonStr); } diff --git a/app/src/main/java/org/mian/gitnex/models/Milestones.java b/app/src/main/java/org/mian/gitnex/models/Milestones.java index 91ed30c3..0a16f2c2 100644 --- a/app/src/main/java/org/mian/gitnex/models/Milestones.java +++ b/app/src/main/java/org/mian/gitnex/models/Milestones.java @@ -25,6 +25,10 @@ public class Milestones { this.title = title; } + public Milestones(String state) { + this.state = state; + } + public int getId() { return id; } diff --git a/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml b/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml new file mode 100644 index 00000000..e28f62ea --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet_milestones_in_list.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_milestones.xml b/app/src/main/res/layout/list_milestones.xml index c2089961..fd869b15 100644 --- a/app/src/main/res/layout/list_milestones.xml +++ b/app/src/main/res/layout/list_milestones.xml @@ -8,6 +8,18 @@ android:background="?attr/primaryBackgroundColor" android:orientation="vertical"> + + + + @@ -87,18 +100,39 @@ - + android:id="@+id/dueDateFrame" + android:orientation="horizontal" + android:layout_marginTop="3dp"> + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 259a9123..d2929776 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,7 +183,7 @@ Commenter:\u0020 #%1$d %2$s Milestone %1$s - Due %1$s + Due on %1$s Opened %1$s Assigned to: %1$s Comment @@ -602,4 +602,8 @@ Issue Subscription failed Issue Unsubscribed Issue Un-Subscription failed + + Close Milestone + Open Milestone + Milestone status updated successfully From f5d5264ef7da2c090be4455a781029228c912421 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Sat, 11 Apr 2020 06:06:39 +0000 Subject: [PATCH 2/4] Implement auto switcher for light and dark theme (#388) Remove import and add author Implement auto switcher for light and dark theme. other ui fixes Reviewed-on: https://gitea.com/gitnex/GitNex/pulls/388 Reviewed-by: 6543 <6543@noreply.gitea.io> --- .../mian/gitnex/activities/BaseActivity.java | 13 ++++++++ .../gitnex/fragments/SettingsFragment.java | 2 +- .../org/mian/gitnex/helpers/TimeHelper.java | 30 +++++++++++++++++++ .../res/layout/layout_settings_fileview.xml | 5 ++-- .../res/layout/layout_settings_languages.xml | 2 +- .../res/layout/layout_settings_security.xml | 4 +-- 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java index 731bfd44..65f2dc43 100644 --- a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import org.mian.gitnex.R; import org.mian.gitnex.helpers.FontsOverride; +import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.util.TinyDB; /** @@ -20,6 +21,18 @@ public abstract class BaseActivity extends AppCompatActivity { if(tinyDb.getInt("themeId") == 1) { setTheme(R.style.AppThemeLight); } + else if(tinyDb.getInt("themeId") == 2) { + + boolean timeSetterFlag = TimeHelper.timeBetweenHours(18, 6); // 6pm to 6am + + if(timeSetterFlag) { + setTheme(R.style.AppTheme); + } + else { + setTheme(R.style.AppThemeLight); + } + + } else { setTheme(R.style.AppTheme); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java index c84ac9c4..74b7893a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java @@ -44,7 +44,7 @@ public class SettingsFragment extends Fragment { private static String[] customFontList = {"Roboto", "Manrope", "Source Code Pro"}; private static int customFontSelectedChoice = 0; - private static String[] themeList = {"Dark", "Light"}; + private static String[] themeList = {"Dark", "Light", "Auto (Day/Night)"}; private static int themeSelectedChoice = 0; @Nullable diff --git a/app/src/main/java/org/mian/gitnex/helpers/TimeHelper.java b/app/src/main/java/org/mian/gitnex/helpers/TimeHelper.java index b1e6419e..90eceb27 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/TimeHelper.java +++ b/app/src/main/java/org/mian/gitnex/helpers/TimeHelper.java @@ -6,9 +6,14 @@ import org.ocpsoft.prettytime.PrettyTime; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; import java.util.Locale; +/** + * Author M M Arif + */ + public class TimeHelper { public static String customDateFormatForToast(String customDate) { @@ -59,4 +64,29 @@ public class TimeHelper { } + public static boolean timeBetweenHours(int fromHour, int toHour) { + + Calendar cal = Calendar.getInstance(); + + Calendar from = Calendar.getInstance(); + from.set(Calendar.HOUR_OF_DAY, fromHour); + from.set(Calendar.MINUTE, 0); + + Calendar to = Calendar.getInstance(); + to.set(Calendar.HOUR_OF_DAY, toHour); + to.set(Calendar.MINUTE, 0); + + if(to.before(from)) { + if (cal.after(to)) { + to.add(Calendar.DATE, 1); + } + else { + from.add(Calendar.DATE, -1); + } + } + + return cal.after(from) && cal.before(to); + + } + } diff --git a/app/src/main/res/layout/layout_settings_fileview.xml b/app/src/main/res/layout/layout_settings_fileview.xml index 42b86b8d..54ae9a83 100644 --- a/app/src/main/res/layout/layout_settings_fileview.xml +++ b/app/src/main/res/layout/layout_settings_fileview.xml @@ -23,14 +23,15 @@ android:id="@+id/pdfMode" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="20dp" - android:orientation="horizontal"> + android:layout_marginTop="10dp" + android:orientation="vertical"> + android:layout_marginTop="10dp" + android:orientation="vertical"> Date: Sat, 11 Apr 2020 20:17:24 +0000 Subject: [PATCH 3/4] Fix fab hide scroll issue and clean up (#381) Merge branch 'fix-fab-scroll-issue' of gitea.com:gitnex/GitNex into fix-fab-scroll-issue Merge branch 'master' into fix-fab-scroll-issue Merge branch 'master' into fix-fab-scroll-issue Fix fab hide scroll issue and clean up Co-authored-by: 6543 <6543@noreply.gitea.io> Reviewed-on: https://gitea.com/gitnex/GitNex/pulls/381 Reviewed-by: 6543 <6543@noreply.gitea.io> --- .../activities/IssueDetailActivity.java | 122 +++++++----------- 1 file changed, 49 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 70d7a8bf..c5a736e9 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -17,7 +17,6 @@ import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListPlugin; import io.noties.markwon.html.HtmlPlugin; -import io.noties.markwon.image.AsyncDrawable; import io.noties.markwon.image.DefaultMediaDecoder; import io.noties.markwon.image.ImageItem; import io.noties.markwon.image.ImagesPlugin; @@ -34,6 +33,7 @@ import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.Html; @@ -152,47 +152,37 @@ public class IssueDetailActivity extends BaseActivity { DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration); - createNewComment = findViewById(R.id.addNewComment); - createNewComment.setOnClickListener(new View.OnClickListener() { + createNewComment.setOnClickListener(v -> startActivity(new Intent(ctx, ReplyToIssueActivity.class))); - @Override - public void onClick(View v) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - startActivity(new Intent(ctx, ReplyToIssueActivity.class)); + scrollViewComments.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> { - } - }); - - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - - if (dy > 0 && createNewComment.isShown()) { + if ((scrollY - oldScrollY) > 0 && createNewComment.isShown()) { createNewComment.setVisibility(View.GONE); - } else if (dy < 0) { + } + else if ((scrollY - oldScrollY) < 0) { createNewComment.setVisibility(View.VISIBLE); } - } + if (!scrollViewComments.canScrollVertically(1)) { // bottom + createNewComment.setVisibility(View.GONE); + } - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - } - }); + if (!scrollViewComments.canScrollVertically(-1)) { // top + createNewComment.setVisibility(View.VISIBLE); + } - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - IssueCommentsViewModel.loadIssueComments(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, issueIndex, getApplicationContext()); - } - }, 500); - } - }); + }); + + } + + swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + IssueCommentsViewModel.loadIssueComments(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, issueIndex, getApplicationContext()); + + }, 500)); Typeface myTypeface; @@ -352,44 +342,35 @@ public class IssueDetailActivity extends BaseActivity { final Markwon markwon = Markwon.builder(Objects.requireNonNull(getApplicationContext())) .usePlugin(CorePlugin.create()) - .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() { - @Override - public void configureImages(@NonNull ImagesPlugin plugin) { - plugin.addSchemeHandler(new SchemeHandler() { - @NonNull - @Override - public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { + .usePlugin(ImagesPlugin.create(plugin -> { + plugin.addSchemeHandler(new SchemeHandler() { + @NonNull + @Override + public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { - final int resourceId = getApplicationContext().getResources().getIdentifier( - raw.substring("drawable://".length()), - "drawable", - getApplicationContext().getPackageName()); + final int resourceId = getApplicationContext().getResources().getIdentifier( + raw.substring("drawable://".length()), + "drawable", + getApplicationContext().getPackageName()); - final Drawable drawable = getApplicationContext().getDrawable(resourceId); + final Drawable drawable = getApplicationContext().getDrawable(resourceId); - assert drawable != null; - return ImageItem.withResult(drawable); - } + assert drawable != null; + return ImageItem.withResult(drawable); + } - @NonNull - @Override - public Collection supportedSchemes() { - return Collections.singleton("drawable"); - } - }); - plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() { - @Nullable - @Override - public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) { - return null; - } - }); - plugin.addMediaDecoder(GifMediaDecoder.create(false)); - plugin.addMediaDecoder(SvgMediaDecoder.create(getApplicationContext().getResources())); - plugin.addMediaDecoder(SvgMediaDecoder.create()); - plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getApplicationContext().getResources())); - plugin.defaultMediaDecoder(DefaultMediaDecoder.create()); - } + @NonNull + @Override + public Collection supportedSchemes() { + return Collections.singleton("drawable"); + } + }); + plugin.placeholderProvider(drawable -> null); + plugin.addMediaDecoder(GifMediaDecoder.create(false)); + plugin.addMediaDecoder(SvgMediaDecoder.create(getApplicationContext().getResources())); + plugin.addMediaDecoder(SvgMediaDecoder.create()); + plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getApplicationContext().getResources())); + plugin.defaultMediaDecoder(DefaultMediaDecoder.create()); })) .usePlugin(new AbstractMarkwonPlugin() { @@ -575,12 +556,7 @@ public class IssueDetailActivity extends BaseActivity { } private void initCloseListener() { - View.OnClickListener onClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - finish(); - } - }; + View.OnClickListener onClickListener = view -> finish(); } } From 145043a5157babe9b24787854c54368036aa6225 Mon Sep 17 00:00:00 2001 From: 6543 <6543@noreply.gitea.io> Date: Sat, 11 Apr 2020 20:20:26 +0000 Subject: [PATCH 4/4] Extend Merge Options (#217) Merge branch 'master' into extend-merge-dialog Minor fixes format ? an AndroidStudio suggestion ? Signed-off-by: 6543 <6543@obermui.de> add Title Text and some Fixes add version check Merge branch 'master' into extend-merge-dialog Merge branch 'master' into extend-merge-dialog use translation and revormat make Merge Options Translateble gitea locale revs: * pulls.merge_pull_request * pulls.rebase_merge_pull_request * pulls.rebase_merge_commit_pull_request * pulls.squash_merge_pull_request Fix menu item Make merge options work Merge branch 'master' into merge-options work - but UGLY UI use enum for merge-modes Co-authored-by: M M Arif Co-authored-by: 6543 <6543@obermui.de> Reviewed-on: https://gitea.com/gitnex/GitNex/pulls/217 --- .../activities/MergePullRequestActivity.java | 362 ++++++++++-------- .../fragments/PullRequestsFragment.java | 1 + .../mian/gitnex/models/MergePullRequest.java | 2 + .../models/MergePullRequestSpinner.java | 55 +++ .../layout/activity_merge_pull_request.xml | 49 ++- app/src/main/res/values/strings.xml | 4 + 6 files changed, 305 insertions(+), 168 deletions(-) create mode 100644 app/src/main/java/org/mian/gitnex/models/MergePullRequestSpinner.java diff --git a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java index 37dbbf60..018fed1e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java @@ -1,16 +1,20 @@ package org.mian.gitnex.activities; -import androidx.annotation.NonNull; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.EditText; import android.widget.ImageView; +import android.widget.Spinner; import android.widget.TextView; +import androidx.annotation.NonNull; import com.hendraanggrian.appcompat.socialview.Mention; import com.hendraanggrian.appcompat.widget.MentionArrayAdapter; import com.hendraanggrian.appcompat.widget.SocialAutoCompleteTextView; @@ -19,10 +23,13 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.VersionCheck; import org.mian.gitnex.models.Collaborators; import org.mian.gitnex.models.MergePullRequest; +import org.mian.gitnex.models.MergePullRequestSpinner; import org.mian.gitnex.util.AppUtil; import org.mian.gitnex.util.TinyDB; +import java.util.ArrayList; import java.util.List; import okhttp3.ResponseBody; import retrofit2.Call; @@ -35,234 +42,267 @@ import retrofit2.Response; public class MergePullRequestActivity extends BaseActivity { - public ImageView closeActivity; - private View.OnClickListener onClickListener; + public ImageView closeActivity; + private View.OnClickListener onClickListener; - final Context ctx = this; + final Context ctx = this; - private SocialAutoCompleteTextView mergePR; - private ArrayAdapter defaultMentionAdapter; - private Button mergeButton; + private SocialAutoCompleteTextView mergeDescription; + private EditText mergeTitle; + private Spinner mergeModeSpinner; + private ArrayAdapter defaultMentionAdapter; + private Button mergeButton; + private String Do; - @Override - protected int getLayoutResourceId(){ - return R.layout.activity_merge_pull_request; - } + @Override + protected int getLayoutResourceId() { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + return R.layout.activity_merge_pull_request; + } - boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext()); - TinyDB tinyDb = new TinyDB(getApplicationContext()); + @SuppressLint("SetTextI18n") + @Override + public void onCreate(Bundle savedInstanceState) { - InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + super.onCreate(savedInstanceState); - mergePR = findViewById(R.id.mergePR); - mergePR.setShowSoftInputOnFocus(true); + boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext()); + TinyDB tinyDb = new TinyDB(getApplicationContext()); - mergePR.requestFocus(); - assert imm != null; - imm.showSoftInput(mergePR, InputMethodManager.SHOW_IMPLICIT); + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - defaultMentionAdapter = new MentionArrayAdapter<>(this); - loadCollaboratorsList(); + mergeModeSpinner = findViewById(R.id.mergeSpinner); + mergeDescription = findViewById(R.id.mergeDescription); + mergeTitle = findViewById(R.id.mergeTitle); - mergePR.setMentionAdapter(defaultMentionAdapter); + mergeTitle.requestFocus(); + assert imm != null; + imm.showSoftInput(mergeTitle, InputMethodManager.SHOW_IMPLICIT); - closeActivity = findViewById(R.id.close); - TextView toolbar_title = findViewById(R.id.toolbar_title); + setMergeAdapter(); - if(!tinyDb.getString("issueTitle").isEmpty()) { - toolbar_title.setText(tinyDb.getString("issueTitle")); - } + mergeModeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - initCloseListener(); - closeActivity.setOnClickListener(onClickListener); + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { - mergeButton = findViewById(R.id.mergeButton); + MergePullRequestSpinner mergeId = (MergePullRequestSpinner) parent.getSelectedItem(); + Do = mergeId.getId(); - if(!connToInternet) { + } - disableProcessButton(); + @Override + public void onNothingSelected(AdapterView parent) { - } else { + } - mergeButton.setOnClickListener(mergePullRequest); + }); - } + defaultMentionAdapter = new MentionArrayAdapter<>(this); + loadCollaboratorsList(); - } + mergeDescription.setMentionAdapter(defaultMentionAdapter); - public void loadCollaboratorsList() { + closeActivity = findViewById(R.id.close); + TextView toolbar_title = findViewById(R.id.toolbar_title); - final TinyDB tinyDb = new TinyDB(getApplicationContext()); + if(!tinyDb.getString("issueTitle").isEmpty()) { + toolbar_title.setText(tinyDb.getString("issueTitle")); + mergeTitle.setText(tinyDb.getString("issueTitle") + " (#" + tinyDb.getString("issueNumber")+ ")"); + } - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + initCloseListener(); + closeActivity.setOnClickListener(onClickListener); - Call> call = RetrofitClient - .getInstance(instanceUrl, getApplicationContext()) - .getApiInterface() - .getCollaborators(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName); + mergeButton = findViewById(R.id.mergeButton); - call.enqueue(new Callback>() { + if(!connToInternet) { - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { + disableProcessButton(); - if (response.isSuccessful()) { + } + else { - assert response.body() != null; - String fullName = ""; - for (int i = 0; i < response.body().size(); i++) { - if(!response.body().get(i).getFull_name().equals("")) { - fullName = response.body().get(i).getFull_name(); - } - defaultMentionAdapter.add( - new Mention(response.body().get(i).getUsername(), fullName, response.body().get(i).getAvatar_url())); - } + mergeButton.setOnClickListener(mergePullRequest); - } - else { + } - Log.i("onResponse", String.valueOf(response.code())); + } - } + private void setMergeAdapter() { - } + TinyDB tinyDb = new TinyDB(getApplicationContext()); - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Log.i("onFailure", t.toString()); - } + ArrayList mergeList = new ArrayList<>(); - }); - } + mergeList.add(new MergePullRequestSpinner("merge", getResources().getString(R.string.mergeOptionMerge))); + mergeList.add(new MergePullRequestSpinner("rebase", getResources().getString(R.string.mergeOptionRebase))); + mergeList.add(new MergePullRequestSpinner("rebase-merge", getResources().getString(R.string.mergeOptionRebaseCommit))); + //squash merge works only on gitea v1.11.5 and higher due to a bug + if(VersionCheck.compareVersion("1.11.5", tinyDb.getString("giteaVersion")) < 1) { + mergeList.add(new MergePullRequestSpinner("squash", getResources().getString(R.string.mergeOptionSquash))); + } - private void initCloseListener() { - onClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - finish(); - } - }; - } + ArrayAdapter adapter = new ArrayAdapter<>(ctx, R.layout.spinner_item, mergeList); + adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); + mergeModeSpinner.setAdapter(adapter); - private View.OnClickListener mergePullRequest = new View.OnClickListener() { - public void onClick(View v) { - processMergePullRequest(); - } - }; + } - private void processMergePullRequest() { + public void loadCollaboratorsList() { - String mergePRDT = mergePR.getText().toString(); - boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext()); + final TinyDB tinyDb = new TinyDB(getApplicationContext()); - if(!connToInternet) { + final String instanceUrl = tinyDb.getString("instanceUrl"); + final String loginUid = tinyDb.getString("loginUid"); + final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; - Toasty.info(getApplicationContext(), getResources().getString(R.string.checkNetConnection)); - return; + Call> call = RetrofitClient.getInstance(instanceUrl, getApplicationContext()).getApiInterface().getCollaborators(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName); - } + call.enqueue(new Callback>() { - disableProcessButton(); - String doWhat = "merge"; - mergeFunction(doWhat, mergePRDT); + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { - } + if(response.isSuccessful()) { - private void mergeFunction(String doWhat, String mergePRDT) { + assert response.body() != null; + String fullName = ""; + for(int i = 0; i < response.body().size(); i++) { + if(!response.body().get(i).getFull_name().equals("")) { + fullName = response.body().get(i).getFull_name(); + } + defaultMentionAdapter.add(new Mention(response.body().get(i).getUsername(), fullName, response.body().get(i).getAvatar_url())); + } - final TinyDB tinyDb = new TinyDB(getApplicationContext()); + } + else { - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final int prIndex = Integer.parseInt(tinyDb.getString("issueNumber")); + Log.i("onResponse", String.valueOf(response.code())); - MergePullRequest mergePR = new MergePullRequest(doWhat, mergePRDT, null); + } - Call call = RetrofitClient - .getInstance(instanceUrl, getApplicationContext()) - .getApiInterface() - .mergePullRequest(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, prIndex, mergePR); + } - call.enqueue(new Callback() { + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + Log.i("onFailure", t.toString()); + } - if(response.code() == 200) { + }); + } - Toasty.info(getApplicationContext(), getString(R.string.mergePRSuccessMsg)); - tinyDb.putBoolean("prMerged", true); - tinyDb.putBoolean("resumePullRequests", true); - finish(); + private void initCloseListener() { - } - else if(response.code() == 401) { + onClickListener = view -> finish(); + } - enableProcessButton(); - AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), - getResources().getString(R.string.alertDialogTokenRevokedMessage), - getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), - getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + private View.OnClickListener mergePullRequest = v -> processMergePullRequest(); - } - else if(response.code() == 404) { + private void processMergePullRequest() { - enableProcessButton(); - Toasty.info(getApplicationContext(), getString(R.string.mergePR404ErrorMsg)); + String mergePRDesc = mergeDescription.getText().toString(); + String mergePRTitle = mergeTitle.getText().toString(); - } - else { + boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext()); - enableProcessButton(); - Toasty.info(getApplicationContext(), getString(R.string.genericError)); + if(!connToInternet) { - } + Toasty.info(getApplicationContext(), getResources().getString(R.string.checkNetConnection)); + return; - } + } - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e("onFailure", t.toString()); - enableProcessButton(); - } + disableProcessButton(); + mergeFunction(Do, mergePRDesc, mergePRTitle); - }); + } - } + private void mergeFunction(String Do, String mergePRDT, String mergeTitle) { - private void disableProcessButton() { + final TinyDB tinyDb = new TinyDB(getApplicationContext()); - mergeButton.setEnabled(false); - GradientDrawable shape = new GradientDrawable(); - shape.setCornerRadius( 8 ); - shape.setColor(getResources().getColor(R.color.hintColor)); - mergeButton.setBackground(shape); + final String instanceUrl = tinyDb.getString("instanceUrl"); + final String loginUid = tinyDb.getString("loginUid"); + final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; + final int prIndex = Integer.parseInt(tinyDb.getString("issueNumber")); - } + MergePullRequest mergePR = new MergePullRequest(Do, mergePRDT, mergeTitle); - private void enableProcessButton() { + Call call = RetrofitClient.getInstance(instanceUrl, getApplicationContext()).getApiInterface().mergePullRequest(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, prIndex, mergePR); - mergeButton.setEnabled(true); - GradientDrawable shape = new GradientDrawable(); - shape.setCornerRadius( 8 ); - shape.setColor(getResources().getColor(R.color.btnBackground)); - mergeButton.setBackground(shape); + call.enqueue(new Callback() { - } + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + if(response.code() == 200) { + + Toasty.info(getApplicationContext(), getString(R.string.mergePRSuccessMsg)); + tinyDb.putBoolean("prMerged", true); + tinyDb.putBoolean("resumePullRequests", true); + finish(); + + } + else if(response.code() == 401) { + + enableProcessButton(); + AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + + } + else if(response.code() == 404) { + + enableProcessButton(); + Toasty.info(getApplicationContext(), getString(R.string.mergePR404ErrorMsg)); + + } + else { + + enableProcessButton(); + Toasty.info(getApplicationContext(), getString(R.string.genericError)); + + } + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Log.e("onFailure", t.toString()); + enableProcessButton(); + } + + }); + + } + + private void disableProcessButton() { + + mergeButton.setEnabled(false); + GradientDrawable shape = new GradientDrawable(); + shape.setCornerRadius(8); + shape.setColor(getResources().getColor(R.color.hintColor)); + mergeButton.setBackground(shape); + + } + + private void enableProcessButton() { + + mergeButton.setEnabled(true); + GradientDrawable shape = new GradientDrawable(); + shape.setCornerRadius(8); + shape.setColor(getResources().getColor(R.color.btnBackground)); + mergeButton.setBackground(shape); + + } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java index dda17a1d..ea8e5cbe 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java @@ -151,6 +151,7 @@ public class PullRequestsFragment extends Fragment { loadInitial(Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, pageSize, prState, resultLimit); tinyDb.putBoolean("resumePullRequests", false); + tinyDb.putBoolean("prMerged", false); } diff --git a/app/src/main/java/org/mian/gitnex/models/MergePullRequest.java b/app/src/main/java/org/mian/gitnex/models/MergePullRequest.java index 6c59f636..1d142def 100644 --- a/app/src/main/java/org/mian/gitnex/models/MergePullRequest.java +++ b/app/src/main/java/org/mian/gitnex/models/MergePullRequest.java @@ -11,9 +11,11 @@ public class MergePullRequest { private String MergeTitleField; public MergePullRequest(String Do, String MergeMessageField, String MergeTitleField) { + this.Do = Do; this.MergeMessageField = MergeMessageField; this.MergeTitleField = MergeTitleField; + } } diff --git a/app/src/main/java/org/mian/gitnex/models/MergePullRequestSpinner.java b/app/src/main/java/org/mian/gitnex/models/MergePullRequestSpinner.java new file mode 100644 index 00000000..6feb5073 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/models/MergePullRequestSpinner.java @@ -0,0 +1,55 @@ +package org.mian.gitnex.models; + +import androidx.annotation.NonNull; + +/** + * Author M M Arif + */ + +public class MergePullRequestSpinner { + + private String id; + private String mergerMethod; + + public MergePullRequestSpinner(String id, String mergerMethod) { + this.id = id; + this.mergerMethod = mergerMethod; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + private String getMergerMethod() { + return mergerMethod; + } + + public void setName(String mergerMethod) { + this.mergerMethod = mergerMethod; + } + + @NonNull + @Override + public String toString() { + return mergerMethod; + } + + @Override + public boolean equals(Object obj) { + + if(obj instanceof MergePullRequestSpinner){ + + MergePullRequestSpinner spinner = (MergePullRequestSpinner )obj; + return spinner.getMergerMethod().equals(mergerMethod) && spinner.getId().equals(id); + + } + + return false; + } + +} diff --git a/app/src/main/res/layout/activity_merge_pull_request.xml b/app/src/main/res/layout/activity_merge_pull_request.xml index ef1da9f2..273d70de 100644 --- a/app/src/main/res/layout/activity_merge_pull_request.xml +++ b/app/src/main/res/layout/activity_merge_pull_request.xml @@ -68,32 +68,67 @@ android:paddingBottom="30dp" android:orientation="vertical"> - + + + android:textColorHighlight="?attr/primaryTextColor" /> + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2929776..0c84689d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -566,6 +566,10 @@ Merge comment Pull Request was merged successfully Pull Request is not available for merge + Merge Pull Request + Rebase and Merge + Rebase and Merge (--no-ff) + Squash and Merge Download This File Please wait for the file to load to memory