From a9af25716a8a1af5ea2b67f4a36b9aa611701f5c Mon Sep 17 00:00:00 2001 From: Kosh Date: Sat, 15 Apr 2017 23:51:34 +0800 Subject: [PATCH] UI overall improvements for dialogs, this commit also closes #105 where markdown now acts like real markdown. --- app/build.gradle | 3 + .../data/dao/ImgurReponseModel.java | 67 ++++++++++ .../com/fastaccess/data/dao/PayloadModel.java | 1 + .../fastaccess/data/dao/types/EventsType.java | 2 +- .../fastaccess/data/service/ImgurService.java | 20 +++ .../data/service/NotificationService.java | 2 +- .../com/fastaccess/helper/FileHelper.java | 29 ++++ .../com/fastaccess/helper/InputHelper.java | 26 ++-- .../fastaccess/helper/ParseDateFormat.java | 13 ++ .../com/fastaccess/helper/PrefGetter.java | 5 +- .../java/com/fastaccess/helper/RxHelper.java | 6 - .../provider/markdown/MarkDownProvider.java | 16 ++- .../provider/rest/ImgurProvider.java | 62 +++++++++ .../NotificationSchedulerJobTask.java | 3 +- .../com/fastaccess/ui/base/BaseActivity.java | 2 + .../ui/base/BaseDialogFragment.java | 3 + .../ui/modules/editor/EditorActivity.java | 17 ++- .../ui/modules/editor/EditorMvp.java | 3 +- .../popup/EditorLinkImageDialogFragment.java | 115 ++++++++++++++++ .../editor/popup/EditorLinkImageMvp.java | 27 ++++ .../popup/EditorLinkImagePresenter.java | 36 +++++ .../ui/modules/feeds/FeedsPresenter.java | 11 +- .../main/orgs/OrgListDialogFragment.java | 16 ++- .../modules/main/orgs/OrgListDialogMvp.java | 1 - .../main/orgs/OrgListDialogPresenter.java | 4 +- .../notification/NotificationsPresenter.java | 3 +- .../ui/modules/settings/SettingsFragment.java | 2 +- .../ui/widgets/RoundBackgroundSpan.java | 4 +- .../pretty/helper/GithubHelper.java | 4 +- app/src/main/res/drawable/ic_push.xml | 11 ++ app/src/main/res/drawable/ic_title.xml | 9 ++ .../layout/create_milestone_layout.xml | 1 - .../markdown_link_image_dialog_layout.xml | 124 ++++++++++++++++++ .../layout/merge_dialog_layout.xml | 1 - .../layout/milestone_dialog_layout.xml | 13 +- .../other_layouts/layout/empty_layout.xml | 2 +- .../layout/simple_footer_list_dialog.xml | 7 +- .../layout/simple_list_dialog.xml | 3 +- .../layout/issue_timeline_row_item.xml | 1 + app/src/main/res/menu/extras_drawer_menu.xml | 6 +- app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/theme_dark.xml | 14 +- app/src/main/res/values/theme_light.xml | 13 +- debug_gradle.properties | 4 +- 44 files changed, 638 insertions(+), 77 deletions(-) create mode 100644 app/src/main/java/com/fastaccess/data/dao/ImgurReponseModel.java create mode 100644 app/src/main/java/com/fastaccess/data/service/ImgurService.java create mode 100644 app/src/main/java/com/fastaccess/provider/rest/ImgurProvider.java create mode 100644 app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageDialogFragment.java create mode 100644 app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageMvp.java create mode 100644 app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImagePresenter.java create mode 100644 app/src/main/res/drawable/ic_push.xml create mode 100644 app/src/main/res/drawable/ic_title.xml create mode 100644 app/src/main/res/layouts/main_layouts/layout/markdown_link_image_dialog_layout.xml diff --git a/app/build.gradle b/app/build.gradle index 05f0f9b3..b1ed299e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,10 @@ android { signingConfig signingConfigs.signing buildConfigString "GITHUB_CLIENT_ID", (buildProperties.secrets['github_client_id'] | buildProperties.notThere['github_client_id']).string buildConfigString "GITHUB_SECRET", (buildProperties.secrets['github_secret'] | buildProperties.notThere['github_secret']).string + buildConfigString "IMGUR_CLIENT_ID", (buildProperties.secrets['imgur_client_id'] | buildProperties.notThere['imgur_client_id']).string + buildConfigString "IMGUR_SECRET", (buildProperties.secrets['imgur_secret'] | buildProperties.notThere['imgur_secret']).string buildConfigField "String", "REST_URL", '"https://api.github.com/"' + buildConfigField "String", "IMGUR_URL", '"https://api.imgur.com/3/"' buildConfigField "int", "DB_VERSION", "2" multiDexEnabled true } diff --git a/app/src/main/java/com/fastaccess/data/dao/ImgurReponseModel.java b/app/src/main/java/com/fastaccess/data/dao/ImgurReponseModel.java new file mode 100644 index 00000000..a029a08b --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/dao/ImgurReponseModel.java @@ -0,0 +1,67 @@ +package com.fastaccess.data.dao; + +import android.os.Parcel; +import android.os.Parcelable; + +import lombok.Getter; +import lombok.Setter; + +/** + * Created by Kosh on 15 Apr 2017, 8:09 PM + */ + +@Getter @Setter public class ImgurReponseModel implements Parcelable { + private boolean success; + private int status; + private ImgurImage data; + + @Override public int describeContents() { return 0; } + + @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeByte(this.success ? (byte) 1 : (byte) 0); + dest.writeInt(this.status); + dest.writeParcelable(this.data, flags); + } + + public ImgurReponseModel() {} + + protected ImgurReponseModel(Parcel in) { + this.success = in.readByte() != 0; + this.status = in.readInt(); + this.data = in.readParcelable(ImgurImage.class.getClassLoader()); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override public ImgurReponseModel createFromParcel(Parcel source) {return new ImgurReponseModel(source);} + + @Override public ImgurReponseModel[] newArray(int size) {return new ImgurReponseModel[size];} + }; + + @Getter @Setter public static class ImgurImage implements Parcelable { + private String title; + private String description; + private String link; + + public ImgurImage() {} + + @Override public int describeContents() { return 0; } + + @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.title); + dest.writeString(this.description); + dest.writeString(this.link); + } + + protected ImgurImage(Parcel in) { + this.title = in.readString(); + this.description = in.readString(); + this.link = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override public ImgurImage createFromParcel(Parcel source) {return new ImgurImage(source);} + + @Override public ImgurImage[] newArray(int size) {return new ImgurImage[size];} + }; + } +} diff --git a/app/src/main/java/com/fastaccess/data/dao/PayloadModel.java b/app/src/main/java/com/fastaccess/data/dao/PayloadModel.java index d98a3684..7d6b39ac 100644 --- a/app/src/main/java/com/fastaccess/data/dao/PayloadModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/PayloadModel.java @@ -31,6 +31,7 @@ public class PayloadModel implements Parcelable { private Comment comment; private User target; private User member; + private String head; private TeamsModel team; @Override public int describeContents() { return 0; } diff --git a/app/src/main/java/com/fastaccess/data/dao/types/EventsType.java b/app/src/main/java/com/fastaccess/data/dao/types/EventsType.java index fcd3091d..555aa387 100644 --- a/app/src/main/java/com/fastaccess/data/dao/types/EventsType.java +++ b/app/src/main/java/com/fastaccess/data/dao/types/EventsType.java @@ -23,7 +23,7 @@ public enum EventsType { PullRequestReviewCommentEvent(R.string.pr_comment_review, R.drawable.ic_comment), PullRequestReviewEvent(R.string.pr_review_event, R.drawable.ic_eye), RepositoryEvent(R.string.repo_event, R.drawable.ic_repo), - PushEvent(R.string.pushed, R.drawable.ic_arrow_right), + PushEvent(R.string.pushed, R.drawable.ic_push), StatusEvent(R.string.status, R.drawable.ic_info_outline), TeamAddEvent(R.string.team_event, R.drawable.ic_profile), DeleteEvent(R.string.deleted, R.drawable.ic_trash), diff --git a/app/src/main/java/com/fastaccess/data/service/ImgurService.java b/app/src/main/java/com/fastaccess/data/service/ImgurService.java new file mode 100644 index 00000000..74faa7fb --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/service/ImgurService.java @@ -0,0 +1,20 @@ +package com.fastaccess.data.service; + +import android.support.annotation.Nullable; + +import com.fastaccess.data.dao.ImgurReponseModel; + +import okhttp3.RequestBody; +import retrofit2.http.Body; +import retrofit2.http.POST; +import retrofit2.http.Query; +import rx.Observable; + +/** + * Created by Kosh on 15 Apr 2017, 8:06 PM + */ + +public interface ImgurService { + @POST("image") + Observable postImage(@Nullable @Query("title") String title, @Body RequestBody body); +} diff --git a/app/src/main/java/com/fastaccess/data/service/NotificationService.java b/app/src/main/java/com/fastaccess/data/service/NotificationService.java index 032e4083..2f0c4d78 100644 --- a/app/src/main/java/com/fastaccess/data/service/NotificationService.java +++ b/app/src/main/java/com/fastaccess/data/service/NotificationService.java @@ -23,7 +23,7 @@ import rx.Observable; public interface NotificationService { @GET("notifications") - Observable> getNotifications(@Query("page") int page); + Observable> getNotifications(@Query("since") String date, @Query("page") int page); @GET("notifications?all=true") Observable> getAllNotifications(@Query("page") int page); diff --git a/app/src/main/java/com/fastaccess/helper/FileHelper.java b/app/src/main/java/com/fastaccess/helper/FileHelper.java index 13125735..9bca115c 100644 --- a/app/src/main/java/com/fastaccess/helper/FileHelper.java +++ b/app/src/main/java/com/fastaccess/helper/FileHelper.java @@ -1,8 +1,37 @@ package com.fastaccess.helper; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + /** * Created by kosh20111 on 10/7/2015. CopyRights @ Innov8tif */ public class FileHelper { public static final long ONE_MB = 1048576L; + + + @Nullable public static String getPath(@NonNull Context context, @NonNull Uri uri) { + String filePath = null; + String wholeID = DocumentsContract.getDocumentId(uri); + String id = wholeID.split(":")[1]; + String[] column = {MediaStore.Images.Media.DATA}; + String sel = MediaStore.Images.Media._ID + "=?"; + try (Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + column, sel, new String[]{id}, null)) { + if (cursor != null) { + int columnIndex = cursor.getColumnIndex(column[0]); + if (cursor.moveToFirst()) { + filePath = cursor.getString(columnIndex); + } + } + } + Logger.e(filePath); + return filePath; + } + } diff --git a/app/src/main/java/com/fastaccess/helper/InputHelper.java b/app/src/main/java/com/fastaccess/helper/InputHelper.java index 36182cc7..d384cfe9 100644 --- a/app/src/main/java/com/fastaccess/helper/InputHelper.java +++ b/app/src/main/java/com/fastaccess/helper/InputHelper.java @@ -15,51 +15,51 @@ import android.widget.TextView; public class InputHelper { - private static boolean isWhiteSpaces(String s) { + private static boolean isWhiteSpaces(@Nullable String s) { return s != null && s.matches("\\s+"); } - public static boolean isEmpty(String text) { + public static boolean isEmpty(@Nullable String text) { return text == null || TextUtils.isEmpty(text) || isWhiteSpaces(text) || text.equalsIgnoreCase("null"); } - public static boolean isEmpty(Object text) { + public static boolean isEmpty(@Nullable Object text) { return text == null || isEmpty(text.toString()); } - public static boolean isEmpty(EditText text) { + public static boolean isEmpty(@Nullable EditText text) { return text == null || isEmpty(text.getText().toString()); } - public static boolean isEmpty(TextView text) { + public static boolean isEmpty(@Nullable TextView text) { return text == null || isEmpty(text.getText().toString()); } - public static boolean isEmpty(TextInputLayout txt) { + public static boolean isEmpty(@Nullable TextInputLayout txt) { return txt == null || isEmpty(txt.getEditText()); } - public static String toString(EditText editText) { + public static String toString(@NonNull EditText editText) { return editText.getText().toString(); } - public static String toString(TextView editText) { + public static String toString(@NonNull TextView editText) { return editText.getText().toString(); } - public static String toString(TextInputLayout textInputLayout) { - return toString(textInputLayout.getEditText()); + public static String toString(@NonNull TextInputLayout textInputLayout) { + return textInputLayout.getEditText() != null ? toString(textInputLayout.getEditText()) : ""; } - public static String toNA(@Nullable String value) { + @NonNull public static String toNA(@Nullable String value) { return isEmpty(value) ? "N/A" : value; } - @NonNull public static String toString(@NonNull Object object) { + @NonNull public static String toString(@Nullable Object object) { return !isEmpty(object) ? object.toString() : ""; } - public static long toLong(TextView textView) { + public static long toLong(@NonNull TextView textView) { if (!isEmpty(textView)) { try { return Long.valueOf(toString(textView).replace(".", "").replaceAll(",", "")); diff --git a/app/src/main/java/com/fastaccess/helper/ParseDateFormat.java b/app/src/main/java/com/fastaccess/helper/ParseDateFormat.java index 878d4ede..6b97b7d6 100644 --- a/app/src/main/java/com/fastaccess/helper/ParseDateFormat.java +++ b/app/src/main/java/com/fastaccess/helper/ParseDateFormat.java @@ -7,6 +7,7 @@ import android.text.format.DateUtils; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; @@ -58,4 +59,16 @@ public class ParseDateFormat { @NonNull private static ParseDateFormat getInstance() { return INSTANCE; } + + public static String getDateByDays(int days) { + Calendar cal = Calendar.getInstance(); + SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH); + cal.add(Calendar.DAY_OF_YEAR, days); + return s.format(new Date(cal.getTimeInMillis())); + } + + public static String getLastWeekDate() { + return getDateByDays(-7); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/helper/PrefGetter.java b/app/src/main/java/com/fastaccess/helper/PrefGetter.java index d4729837..4de8c06f 100644 --- a/app/src/main/java/com/fastaccess/helper/PrefGetter.java +++ b/app/src/main/java/com/fastaccess/helper/PrefGetter.java @@ -131,7 +131,10 @@ public class PrefGetter { public static long getNotificationTaskDuration(@NonNull Context context) { String prefValue = PrefHelper.getString("notificationTime"); - return notificationDurationMillis(context, prefValue); + if (prefValue != null) { + return notificationDurationMillis(context, prefValue); + } + return 0; } public static long notificationDurationMillis(@NonNull Context context, @NonNull String prefValue) { diff --git a/app/src/main/java/com/fastaccess/helper/RxHelper.java b/app/src/main/java/com/fastaccess/helper/RxHelper.java index e2371d06..5db94a0d 100644 --- a/app/src/main/java/com/fastaccess/helper/RxHelper.java +++ b/app/src/main/java/com/fastaccess/helper/RxHelper.java @@ -17,12 +17,6 @@ public class RxHelper { .observeOn(AndroidSchedulers.mainThread()); } - public static Observable getObserverComputation(@NonNull Observable observable) { - return observable - .subscribeOn(Schedulers.computation()) - .observeOn(AndroidSchedulers.mainThread()); - } - public static Observable safeObservable(@NonNull Observable observable) { return getObserver(observable) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java b/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java index fad02053..d93496e2 100644 --- a/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java +++ b/app/src/main/java/com/fastaccess/provider/markdown/MarkDownProvider.java @@ -177,19 +177,27 @@ public class MarkDownProvider { } public static void addPhoto(@NonNull EditText editText) { + addLink(editText, "", ""); + } + + public static void addPhoto(@NonNull EditText editText, @NonNull String title, @NonNull String link) { int selectionStart = editText.getSelectionStart(); - String result = "![]()\n"; + String result = "![" + InputHelper.toString(title) + "](" + InputHelper.toString(link) + ")\n"; int length = selectionStart + result.length(); editText.getText().insert(selectionStart, result); - editText.setSelection(length - 2); + editText.setSelection(length); } public static void addLink(@NonNull EditText editText) { + addLink(editText, "", ""); + } + + public static void addLink(@NonNull EditText editText, @NonNull String title, @NonNull String link) { int selectionStart = editText.getSelectionStart(); - String result = "[]()\n"; + String result = "[" + InputHelper.toString(title) + "](" + InputHelper.toString(link) + ")\n"; int length = selectionStart + result.length(); editText.getText().insert(selectionStart, result); - editText.setSelection(length - 2); + editText.setSelection(length); } private static boolean hasNewLine(@NonNull String source, int selectionStart) { diff --git a/app/src/main/java/com/fastaccess/provider/rest/ImgurProvider.java b/app/src/main/java/com/fastaccess/provider/rest/ImgurProvider.java new file mode 100644 index 00000000..1eade829 --- /dev/null +++ b/app/src/main/java/com/fastaccess/provider/rest/ImgurProvider.java @@ -0,0 +1,62 @@ +package com.fastaccess.provider.rest; + +import android.support.annotation.NonNull; + +import com.fastaccess.BuildConfig; +import com.fastaccess.data.service.ImgurService; +import com.fastaccess.provider.rest.converters.GithubResponseConverter; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.lang.reflect.Modifier; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; + +/** + * Created by Kosh on 15 Apr 2017, 7:59 PM + */ + +public class ImgurProvider { + + public final static Gson gson = new GsonBuilder() + .excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC) + .setPrettyPrinting() + .create(); + + private ImgurProvider() {} + + private static OkHttpClient provideOkHttpClient() { + OkHttpClient.Builder client = new OkHttpClient.Builder(); + if (BuildConfig.DEBUG) { + client.addInterceptor(new HttpLoggingInterceptor() + .setLevel(HttpLoggingInterceptor.Level.BODY)); + } + client.addInterceptor(chain -> { + Request original = chain.request(); + Request.Builder requestBuilder = original.newBuilder(); + requestBuilder.header("Authorization", "Client-ID " + BuildConfig.IMGUR_CLIENT_ID); + requestBuilder.method(original.method(), original.body()); + Request request = requestBuilder.build(); + return chain.proceed(request); + }); + return client.build(); + } + + private static Retrofit provideRetrofit() { + return new Retrofit.Builder() + .baseUrl(BuildConfig.IMGUR_URL) + .client(provideOkHttpClient()) + .addConverterFactory(new GithubResponseConverter(gson)) + .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) + .build(); + } + + @NonNull public static ImgurService getImgurService() { + return provideRetrofit().create(ImgurService.class); + } + +} diff --git a/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java b/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java index 34081345..827f3bde 100644 --- a/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java +++ b/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java @@ -25,6 +25,7 @@ import com.fastaccess.data.dao.model.Notification; import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; +import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.helper.PrefGetter; import com.fastaccess.helper.RxHelper; import com.fastaccess.provider.rest.RestProvider; @@ -47,7 +48,7 @@ public class NotificationSchedulerJobTask extends JobService { @Override public boolean onStartJob(JobParameters job) { if (Login.getUser() != null) { RestProvider.getNotificationService() - .getNotifications(0) + .getNotifications(ParseDateFormat.getLastWeekDate(), 0) .subscribeOn(Schedulers.io()) .subscribe(item -> { AppHelper.cancelAllNotifications(getApplicationContext()); diff --git a/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java b/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java index 9657cbe7..f865d6cd 100644 --- a/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java +++ b/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java @@ -55,6 +55,7 @@ import butterknife.ButterKnife; import es.dmoral.toasty.Toasty; import icepick.Icepick; import icepick.State; +import rx.Subscription; /** * Created by Kosh on 24 May 2016, 8:48 PM @@ -63,6 +64,7 @@ import icepick.State; public abstract class BaseActivity> extends AdActivity implements BaseMvp.FAView, NavigationView.OnNavigationItemSelectedListener { + private Subscription themeSubscription; @State boolean isProgressShowing; @Nullable @BindView(R.id.toolbar) Toolbar toolbar; @Nullable @BindView(R.id.appbar) AppBarLayout shadowView; diff --git a/app/src/main/java/com/fastaccess/ui/base/BaseDialogFragment.java b/app/src/main/java/com/fastaccess/ui/base/BaseDialogFragment.java index 1391c12c..2202e603 100644 --- a/app/src/main/java/com/fastaccess/ui/base/BaseDialogFragment.java +++ b/app/src/main/java/com/fastaccess/ui/base/BaseDialogFragment.java @@ -15,7 +15,9 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.fastaccess.R; import com.fastaccess.helper.AnimHelper; +import com.fastaccess.helper.AppHelper; import com.fastaccess.ui.base.mvp.BaseMvp; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; @@ -58,6 +60,7 @@ public abstract class BaseDialogFragment + implements EditorLinkImageMvp.View { + + private EditorLinkImageMvp.EditorLinkCallback callback; + + @BindView(R.id.title) TextInputLayout title; + @BindView(R.id.link) TextInputLayout link; + @BindView(R.id.select) FontButton select; + + public static EditorLinkImageDialogFragment newInstance(boolean isLink) { + EditorLinkImageDialogFragment fragment = new EditorLinkImageDialogFragment(); + fragment.setArguments(Bundler + .start() + .put(BundleConstant.YES_NO_EXTRA, isLink) + .end()); + return fragment; + } + + @Override public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof EditorLinkImageMvp.EditorLinkCallback) { + callback = (EditorLinkImageMvp.EditorLinkCallback) context; + } + } + + @Override public void onDetach() { + callback = null; + super.onDetach(); + } + + @Override public void onUploaded(@Nullable String title, @Nullable String link) { + hideProgress(); + if (callback != null) { + callback.onAppendLink(title, link, isLink()); + } + dismiss(); + } + + @Override protected int fragmentLayout() { + return R.layout.markdown_link_image_dialog_layout; + } + + @Override protected void onFragmentCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + select.setVisibility(isLink() ? View.GONE : View.VISIBLE); + } + + @NonNull @Override public EditorLinkImagePresenter providePresenter() { + return new EditorLinkImagePresenter(); + } + + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == Activity.RESULT_OK && requestCode == BundleConstant.REQUEST_CODE) { + if (data != null && data.getData() != null) { + String path = FileHelper.getPath(getContext(), data.getData()); + if (!InputHelper.isEmpty(path)) { + getPresenter().onSubmit(InputHelper.toString(title), new File(path)); + } + } + } + } + + @OnClick(R.id.select) public void onSelectClicked() { + if (ActivityHelper.checkAndRequestReadWritePermission(getActivity())) { + Intent intent = new Intent(); + intent.setType("image/*"); + intent.setAction(Intent.ACTION_GET_CONTENT); + startActivityForResult(Intent.createChooser(intent, getString(R.string.select_picture)), BundleConstant.REQUEST_CODE); + } + } + + @OnClick(R.id.cancel) public void onCancelClicked() { + dismiss(); + } + + @OnClick(R.id.insert) public void onInsertClicked() { + if (callback != null) { + callback.onAppendLink(InputHelper.toString(title), InputHelper.toString(link), isLink()); + } + dismiss(); + } + + private boolean isLink() { + return getArguments() != null && getArguments().getBoolean(BundleConstant.YES_NO_EXTRA); + } +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageMvp.java b/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageMvp.java new file mode 100644 index 00000000..07ad87e1 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImageMvp.java @@ -0,0 +1,27 @@ +package com.fastaccess.ui.modules.editor.popup; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.fastaccess.ui.base.mvp.BaseMvp; + +import java.io.File; + +/** + * Created by Kosh on 15 Apr 2017, 9:06 PM + */ + +public interface EditorLinkImageMvp { + + interface EditorLinkCallback { + void onAppendLink(@Nullable String title, @Nullable String link, boolean isLink); + } + + interface View extends BaseMvp.FAView { + void onUploaded(@Nullable String title, @Nullable String link); + } + + interface Presenter { + void onSubmit(@Nullable String title, @NonNull File file); + } +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImagePresenter.java b/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImagePresenter.java new file mode 100644 index 00000000..532f13f9 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/editor/popup/EditorLinkImagePresenter.java @@ -0,0 +1,36 @@ +package com.fastaccess.ui.modules.editor.popup; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.fastaccess.data.dao.ImgurReponseModel; +import com.fastaccess.provider.rest.ImgurProvider; +import com.fastaccess.ui.base.mvp.presenter.BasePresenter; + +import java.io.File; + +import okhttp3.MediaType; +import okhttp3.RequestBody; + +/** + * Created by Kosh on 15 Apr 2017, 9:08 PM + */ + +public class EditorLinkImagePresenter extends BasePresenter implements EditorLinkImageMvp.Presenter { + @Override public void onSubmit(@Nullable String title, @NonNull File file) { + if (file.exists()) { + RequestBody image = RequestBody.create(MediaType.parse("image/*"), file); + makeRestCall(ImgurProvider.getImgurService().postImage(title, image), + imgurReponseModel -> { + if (imgurReponseModel.getData() != null) { + ImgurReponseModel.ImgurImage imageResponse = imgurReponseModel.getData(); + sendToView(view -> view.onUploaded(title == null ? imageResponse.getTitle() : title, imageResponse.getLink())); + return; + } + sendToView(view -> view.onUploaded(null, null)); + }); + } else { + if (getView() != null) getView().onUploaded(null, null); + } + } +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/feeds/FeedsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/feeds/FeedsPresenter.java index 53a41242..6c0ee2a2 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/feeds/FeedsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/feeds/FeedsPresenter.java @@ -1,5 +1,6 @@ package com.fastaccess.ui.modules.feeds; +import android.content.Intent; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -19,6 +20,7 @@ import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.provider.scheme.SchemeParser; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.modules.repos.RepoPagerActivity; +import com.fastaccess.ui.modules.repos.code.commit.details.CommitPagerActivity; import java.util.ArrayList; @@ -108,7 +110,14 @@ class FeedsPresenter extends BasePresenter implements FeedsMvp.Pr } else { PayloadModel payloadModel = item.getPayload(); if (payloadModel != null) { - if (item.getPayload().getIssue() != null) { + if (payloadModel.getHead() != null) { + Repo repoModel = item.getRepo(); + Uri uri = Uri.parse(repoModel.getName()); + if (uri == null || uri.getPathSegments().size() < 1) return; + Intent intent = CommitPagerActivity.createIntent(v.getContext(), uri.getLastPathSegment(), uri.getPathSegments().get(0), + payloadModel.getHead(), true); + v.getContext().startActivity(intent); + } else if (item.getPayload().getIssue() != null) { SchemeParser.launchUri(v.getContext(), Uri.parse(item.getPayload().getIssue().getHtmlUrl()), true); } else if (item.getPayload().getPullRequest() != null) { SchemeParser.launchUri(v.getContext(), Uri.parse(item.getPayload().getPullRequest().getHtmlUrl()), true); diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogFragment.java b/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogFragment.java index c8c23afb..a631c6ec 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogFragment.java @@ -12,6 +12,7 @@ import com.fastaccess.R; import com.fastaccess.ui.adapter.UsersAdapter; import com.fastaccess.ui.base.BaseDialogFragment; import com.fastaccess.ui.widgets.StateLayout; +import com.fastaccess.ui.widgets.dialog.MessageDialogView; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import butterknife.BindView; @@ -38,19 +39,20 @@ public class OrgListDialogFragment extends BaseDialogFragment { + MessageDialogView.newInstance(getString(R.string.no_orgs), getString(R.string.no_orgs_description)) + .show(getChildFragmentManager(), MessageDialogView.TAG); + return true; + }); toolbar.setNavigationIcon(R.drawable.ic_clear); toolbar.setNavigationOnClickListener(v -> dismiss()); stateLayout.setEmptyText(R.string.no_orgs); diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogMvp.java b/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogMvp.java index 65ef3b87..995a9c87 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogMvp.java @@ -16,7 +16,6 @@ public interface OrgListDialogMvp { interface View extends BaseMvp.FAView { void onNotifyAdapter(); - void onNoOrgs(); } interface Presenter { diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogPresenter.java index 0b093dc4..13ec91e3 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/orgs/OrgListDialogPresenter.java @@ -22,11 +22,9 @@ public class OrgListDialogPresenter extends BasePresenter if (userPageable.getItems() != null && !userPageable.getItems().isEmpty()) { orgs.clear(); orgs.addAll(userPageable.getItems()); - sendToView(OrgListDialogMvp.View::onNotifyAdapter); - return; } } - sendToView(OrgListDialogMvp.View::onNoOrgs); + sendToView(OrgListDialogMvp.View::onNotifyAdapter); }); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java index 7391601d..e641703a 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java @@ -9,6 +9,7 @@ import android.view.View; import com.fastaccess.data.dao.Pageable; import com.fastaccess.data.dao.model.Notification; import com.fastaccess.helper.BundleConstant; +import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.helper.PrefGetter; import com.fastaccess.helper.RxHelper; import com.fastaccess.provider.rest.RestProvider; @@ -118,7 +119,7 @@ public class NotificationsPresenter extends BasePresenter setCurrentPage(page); Observable> observable = showAll ? RestProvider.getNotificationService().getAllNotifications(page) - : RestProvider.getNotificationService().getNotifications(page); + : RestProvider.getNotificationService().getNotifications(ParseDateFormat.getDateByDays(-30), page); makeRestCall(observable, response -> { if (response.getItems() != null) { lastPage = response.getLast(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java b/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java index 14513b74..4d4e055b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/settings/SettingsFragment.java @@ -74,8 +74,8 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer restartActivity(); return true; } else if (preference.getKey().equalsIgnoreCase("appTheme")) { - restartActivity(); Toasty.warning(getContext(), getString(R.string.change_theme_warning), Toast.LENGTH_LONG).show(); + restartActivity(); return true; } return false; diff --git a/app/src/main/java/com/fastaccess/ui/widgets/RoundBackgroundSpan.java b/app/src/main/java/com/fastaccess/ui/widgets/RoundBackgroundSpan.java index 6cefa9c3..006ce51f 100644 --- a/app/src/main/java/com/fastaccess/ui/widgets/RoundBackgroundSpan.java +++ b/app/src/main/java/com/fastaccess/ui/widgets/RoundBackgroundSpan.java @@ -30,10 +30,10 @@ public class RoundBackgroundSpan extends ReplacementSpan { public void draw(@NonNull Canvas canvas, @NonNull CharSequence charSequence, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { paint.setColor(color); - rectF.set(x, top, width + x, bottom); + rectF.set(x, top, width + x, bottom - 20); canvas.drawRoundRect(rectF, 5, 5, paint); paint.setColor(ViewHelper.generateTextColor(color)); - canvas.drawText(charSequence, start, end, x + (5 * 2.0f), (float) y, paint); + canvas.drawText(charSequence, start, end, x + (5 * 2.0f), (float) y - 5, paint); } } \ No newline at end of file diff --git a/app/src/main/java/com/prettifier/pretty/helper/GithubHelper.java b/app/src/main/java/com/prettifier/pretty/helper/GithubHelper.java index 9c1ece90..672e6583 100755 --- a/app/src/main/java/com/prettifier/pretty/helper/GithubHelper.java +++ b/app/src/main/java/com/prettifier/pretty/helper/GithubHelper.java @@ -62,7 +62,7 @@ public class GithubHelper { } String link; if (!InputHelper.isEmpty(MimeTypeMap.getFileExtensionFromUrl(href))) { - link = "https://raw.githubusercontent.com/" + owner + "/" + repoName + "/master/" + href; + link = "https://raw.githubusercontent.com/" + owner + "/" + repoName + "/master/" + href; //assuming always master is bad :'( } else { String formattedLink = href.replaceFirst("./", "/"); link = "https://api.github.com/repos/" + owner + "/" + repoName + @@ -84,7 +84,7 @@ public class GithubHelper { "\n" + "\n" + source + - (!wrap ? "\n\n" : "") + + (!wrap ? "\n\n" : "\n") + HASH_LINK_SCRIPT + "\n" + "\n" + "\n" + diff --git a/app/src/main/res/drawable/ic_push.xml b/app/src/main/res/drawable/ic_push.xml new file mode 100644 index 00000000..08efc1fe --- /dev/null +++ b/app/src/main/res/drawable/ic_push.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_title.xml b/app/src/main/res/drawable/ic_title.xml new file mode 100644 index 00000000..bba8d009 --- /dev/null +++ b/app/src/main/res/drawable/ic_title.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layouts/main_layouts/layout/create_milestone_layout.xml b/app/src/main/res/layouts/main_layouts/layout/create_milestone_layout.xml index d4b6ac63..51a0e865 100644 --- a/app/src/main/res/layouts/main_layouts/layout/create_milestone_layout.xml +++ b/app/src/main/res/layouts/main_layouts/layout/create_milestone_layout.xml @@ -5,7 +5,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/windowBackground" - android:minWidth="300dp" android:orientation="vertical" android:paddingBottom="@dimen/spacing_xs_large"> diff --git a/app/src/main/res/layouts/main_layouts/layout/markdown_link_image_dialog_layout.xml b/app/src/main/res/layouts/main_layouts/layout/markdown_link_image_dialog_layout.xml new file mode 100644 index 00000000..a673c395 --- /dev/null +++ b/app/src/main/res/layouts/main_layouts/layout/markdown_link_image_dialog_layout.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layouts/main_layouts/layout/merge_dialog_layout.xml b/app/src/main/res/layouts/main_layouts/layout/merge_dialog_layout.xml index 1c36cc18..dbb5ffce 100644 --- a/app/src/main/res/layouts/main_layouts/layout/merge_dialog_layout.xml +++ b/app/src/main/res/layouts/main_layouts/layout/merge_dialog_layout.xml @@ -6,7 +6,6 @@ android:layout_height="wrap_content" android:layout_marginBottom="@dimen/spacing_xs_large" android:layout_marginTop="@dimen/spacing_xs_large" - android:minWidth="300dp" android:orientation="vertical" android:padding="@dimen/spacing_xs_large"> diff --git a/app/src/main/res/layouts/main_layouts/layout/milestone_dialog_layout.xml b/app/src/main/res/layouts/main_layouts/layout/milestone_dialog_layout.xml index 9b4b287c..b77c2648 100644 --- a/app/src/main/res/layouts/main_layouts/layout/milestone_dialog_layout.xml +++ b/app/src/main/res/layouts/main_layouts/layout/milestone_dialog_layout.xml @@ -1,7 +1,6 @@ - - + - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layouts/other_layouts/layout/empty_layout.xml b/app/src/main/res/layouts/other_layouts/layout/empty_layout.xml index 1b43ff68..fdcd7f7b 100644 --- a/app/src/main/res/layouts/other_layouts/layout/empty_layout.xml +++ b/app/src/main/res/layouts/other_layouts/layout/empty_layout.xml @@ -8,8 +8,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" - android:layout_marginBottom="@dimen/spacing_s_large" android:gravity="center" + android:minHeight="250dp" android:orientation="vertical"> - + app:layoutManager="@string/linear_layout_manager"/> + \ No newline at end of file diff --git a/app/src/main/res/layouts/other_layouts/layout/simple_list_dialog.xml b/app/src/main/res/layouts/other_layouts/layout/simple_list_dialog.xml index 13509b2e..e618b622 100644 --- a/app/src/main/res/layouts/other_layouts/layout/simple_list_dialog.xml +++ b/app/src/main/res/layouts/other_layouts/layout/simple_list_dialog.xml @@ -4,7 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:background="?android:attr/windowBackground" android:orientation="vertical"> @@ -13,7 +13,6 @@ style="@style/TextAppearance.AppCompat.Title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minWidth="300dp" android:padding="@dimen/spacing_xs_large" android:textColor="?android:textColorPrimary" android:textStyle="bold" diff --git a/app/src/main/res/layouts/row_layouts/layout/issue_timeline_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/issue_timeline_row_item.xml index c946cad4..556f36a9 100644 --- a/app/src/main/res/layouts/row_layouts/layout/issue_timeline_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/issue_timeline_row_item.xml @@ -58,6 +58,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" + android:lineSpacingExtra="@dimen/spacing_normal" android:ellipsize="end" android:maxLines="5" tools:text="For a divided large loaf, add some champaign and cinnamon."/> diff --git a/app/src/main/res/menu/extras_drawer_menu.xml b/app/src/main/res/menu/extras_drawer_menu.xml index dd673010..d4f9210c 100644 --- a/app/src/main/res/menu/extras_drawer_menu.xml +++ b/app/src/main/res/menu/extras_drawer_menu.xml @@ -67,9 +67,9 @@ - - - + + + + Insert + Select + Select Picture \ No newline at end of file diff --git a/app/src/main/res/values/theme_dark.xml b/app/src/main/res/values/theme_dark.xml index 663cc745..66387a9e 100644 --- a/app/src/main/res/values/theme_dark.xml +++ b/app/src/main/res/values/theme_dark.xml @@ -36,6 +36,7 @@ @color/transparent true @style/DialogThemeDark + @style/DialogThemeDark @style/ToolbarStyleDark false @@ -45,6 +46,11 @@ @color/white @color/white ?colorAccent + @style/PopupThemeDark + + + - @@ -67,4 +74,5 @@ #fff #ffe0e0e0 + \ No newline at end of file diff --git a/app/src/main/res/values/theme_light.xml b/app/src/main/res/values/theme_light.xml index 033e2788..4e04f9d1 100644 --- a/app/src/main/res/values/theme_light.xml +++ b/app/src/main/res/values/theme_light.xml @@ -37,6 +37,7 @@ @color/transparent true @style/DialogThemeLight + @style/DialogThemeLight @style/ToolbarStyleLight @@ -44,6 +45,11 @@ @color/black @color/black ?colorAccent + @style/PopupThemeLight + + + - diff --git a/debug_gradle.properties b/debug_gradle.properties index 8635402d..95f8cf7a 100644 --- a/debug_gradle.properties +++ b/debug_gradle.properties @@ -3,4 +3,6 @@ android_store_password=PASSWORD android_key_password=PASSWORD android_key_alias=ALIAS github_client_id=GITHUB_CLIENT_ID -github_secret=GITHUB_SECRET \ No newline at end of file +github_secret=GITHUB_SECRET +imgur_client_id=imgur_client_id +imgur_secret=imgur_secret \ No newline at end of file