From e11abe938aa43f579c4d77a104167a11d11e9116 Mon Sep 17 00:00:00 2001 From: k0shk0sh Date: Wed, 25 Dec 2019 07:01:32 +0100 Subject: [PATCH] make project buildable --- app/build.gradle | 28 +- .../com/fastaccess/helper/TestHelper.java | 77 ---- .../ui/modules/login/LoginActivityTest.java | 54 --- .../login/LoginChooserActivityTest.java | 39 -- .../ui/modules/main/MainActivityTest.java | 69 --- app/src/main/AndroidManifest.xml | 162 +++---- .../main/graphql/github/PinnedRepos.graphql | 4 +- .../main/graphql/github/RepoProject.graphql | 8 +- .../model/AbstractFastHubNotification.java | 11 +- .../dao/model/AbstractNotificationQueue.java | 3 +- .../dao/timeline/PullRequestReviewModel.java | 169 ------- .../timeline/PullRequestTimelineModel.java | 85 ---- .../viewholder/PullRequestEventViewHolder.kt | 414 ------------------ app/src/main/res/values-es/strings.xml | 6 +- app/src/main/res/values-fr/strings.xml | 6 +- app/src/main/res/values-it/strings.xml | 15 +- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values/dimens.xml | 2 +- .../fastaccess/login/LoginPresenterTest.java | 40 -- build.gradle | 13 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 21 files changed, 128 insertions(+), 1085 deletions(-) delete mode 100644 app/src/androidTest/java/com/fastaccess/helper/TestHelper.java delete mode 100644 app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginActivityTest.java delete mode 100644 app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginChooserActivityTest.java delete mode 100644 app/src/androidTest/java/com/fastaccess/ui/modules/main/MainActivityTest.java delete mode 100644 app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestReviewModel.java delete mode 100644 app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestTimelineModel.java delete mode 100644 app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestEventViewHolder.kt delete mode 100644 app/src/test/java/com/fastaccess/login/LoginPresenterTest.java diff --git a/app/build.gradle b/app/build.gradle index 954282a8..7d66e313 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,9 +1,9 @@ apply plugin: 'com.android.application' -apply plugin: 'com.apollographql.android' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +apply plugin: 'com.apollographql.android' apply plugin: 'com.novoda.build-properties' -apply plugin: 'jacoco-android' apply plugin: 'io.fabric' buildProperties { @@ -25,7 +25,6 @@ android { } } compileSdkVersion 27 - buildToolsVersion '27.0.3' defaultConfig { applicationId "com.fastaccess.github" minSdkVersion 21 @@ -90,7 +89,8 @@ android { } configurations { - all*.exclude module: 'annotations' + all*.exclude module: 'annotation' + all*.exclude group: 'org.jetbrains', module: 'annotations-java5' } packagingOptions { exclude 'META-INF/rxjava.properties' } @@ -161,31 +161,25 @@ dependencies { implementation('com.github.b3er.rxfirebase:firebase-database:11.2.0') { transitive = false } implementation('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') { transitive = true } implementation "com.github.miguelbcr:RxBillingService:0.0.3" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlin_version}" - implementation 'org.jsoup:jsoup:1.10.3' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}" + implementation 'org.jsoup:jsoup:1.12.1' implementation "com.evernote:android-state:${state_version}" implementation "petrov.kristiyan:colorpicker-library:1.1.4" - implementation 'com.apollographql.apollo:apollo-rx2-support:0.4.1' + implementation 'com.apollographql.apollo:apollo-rx2-support:1.2.2' + implementation("com.apollographql.apollo:apollo-runtime:1.2.2") implementation 'com.jaredrummler:android-device-names:1.1.5' implementation 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.1.0' implementation 'com.airbnb.android:lottie:2.2.5' implementation 'com.firebase:firebase-jobdispatcher:0.8.2' + compileOnly "org.projectlombok:lombok:${lombokVersion}" + kapt "org.projectlombok:lombok:${lombokVersion}" kapt "com.evernote:android-state-processor:${state_version}" kapt "com.jakewharton:butterknife-compiler:${butterKnifeVersion}" kapt 'com.github.matthiasrobbers:shortbread-compiler:1.0.1' kapt "io.requery:requery-processor:${requery}" -// testImplementation "net.grandcentrix.thirtyinch:thirtyinch-test:$thirtyinchVersion" - testImplementation "junit:junit:${junitVersion}" - testImplementation "org.mockito:mockito-core:${mockitoVersion}" - testImplementation "org.assertj:assertj-core:${assertjVersion}" - androidTestImplementation "com.android.support:support-annotations:${supportVersion}" - androidTestImplementation "org.mockito:mockito-core:${mockitoVersion}" - androidTestImplementation 'com.android.support.test:runner:1.0.1' - androidTestImplementation 'com.android.support.test:rules:1.0.1' - androidTestImplementation "com.android.support.test.espresso:espresso-intents:${espresseVersion}" - androidTestImplementation "com.android.support.test.espresso:espresso-core:${espresseVersion}" + } apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/src/androidTest/java/com/fastaccess/helper/TestHelper.java b/app/src/androidTest/java/com/fastaccess/helper/TestHelper.java deleted file mode 100644 index 1bf730f6..00000000 --- a/app/src/androidTest/java/com/fastaccess/helper/TestHelper.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.fastaccess.helper; - -import android.support.annotation.IntRange; -import android.support.design.widget.TextInputLayout; -import android.support.test.espresso.UiController; -import android.support.test.espresso.ViewAction; -import android.view.View; - -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; - -import it.sephiroth.android.library.bottomnavigation.BottomNavigation; - -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; - -/** - * Created by Kosh on 05 May 2017, 9:23 PM - */ - -public class TestHelper { - - public static Matcher textInputLayoutHasHint(final String expectedErrorText) { - return new TypeSafeMatcher() { - @Override public boolean matchesSafely(View view) { - if (!(view instanceof TextInputLayout)) { - return false; - } - CharSequence error = ((TextInputLayout) view).getHint(); - return error != null && expectedErrorText.equals(error.toString()); - } - - @Override public void describeTo(Description description) {} - }; - } - - public static Matcher textInputLayoutHasError(final String expectedErrorText) { - return new TypeSafeMatcher() { - @Override public boolean matchesSafely(View view) { - if (!(view instanceof TextInputLayout)) { - return false; - } - CharSequence error = ((TextInputLayout) view).getError(); - return error != null && expectedErrorText.equals(error.toString()); - } - - @Override public void describeTo(Description description) {} - }; - } - - public static Matcher bottomNavSelection(@IntRange(from = 0, to = 3) final int position) { - return new TypeSafeMatcher() { - @Override public boolean matchesSafely(View view) { - return view instanceof BottomNavigation && position == ((BottomNavigation) view).getSelectedIndex(); - } - - @Override public void describeTo(Description description) {} - }; - } - - public static ViewAction bottomNavAction(@IntRange(from = 0, to = 3) final int index) { - return new ViewAction() { - - @Override public Matcher getConstraints() { - return isAssignableFrom(BottomNavigation.class); - } - - @Override public String getDescription() { - return "BottomNavigation"; - } - - @Override public void perform(UiController uiController, View view) { - ((BottomNavigation) view).setSelectedIndex(index, false); - } - }; - } -} diff --git a/app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginActivityTest.java b/app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginActivityTest.java deleted file mode 100644 index e10fd093..00000000 --- a/app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginActivityTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.fastaccess.ui.modules.login; - - -import android.support.test.filters.LargeTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - -import com.fastaccess.R; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static com.fastaccess.helper.TestHelper.textInputLayoutHasError; -import static org.hamcrest.core.IsNot.not; - -@RunWith(AndroidJUnit4.class) @LargeTest -public class LoginActivityTest { - - @Rule public ActivityTestRule testRule = new ActivityTestRule<>(LoginActivity.class); - - @Test public void successLoginClickSuccessTest() { - String username = "username"; - String password = "password"; - onView(withId(R.id.usernameEditText)).perform(typeText(username), closeSoftKeyboard()); - onView(withId(R.id.passwordEditText)).perform(typeText(password), closeSoftKeyboard()); - onView(withId(R.id.login)).perform(click()); - onView(withId(R.id.progress)).check(matches(isDisplayed())); - } - - @Test public void usernameErrorTest() { - String password = "password"; - onView(withId(R.id.passwordEditText)).perform(typeText(password), closeSoftKeyboard()); - onView(withId(R.id.login)).perform(click()); - onView(withId(R.id.progress)).check(matches(not(isDisplayed()))); - onView(withId(R.id.username)).check(matches(textInputLayoutHasError(testRule.getActivity().getString(R.string.required_field)))); - } - - @Test public void passwordErrorTest() { - String username = "username"; - onView(withId(R.id.usernameEditText)).perform(typeText(username), closeSoftKeyboard()); - onView(withId(R.id.login)).perform(click()); - onView(withId(R.id.progress)).check(matches(not(isDisplayed()))); - onView(withId(R.id.password)).check(matches(textInputLayoutHasError(testRule.getActivity().getString(R.string.required_field)))); - } - -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginChooserActivityTest.java b/app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginChooserActivityTest.java deleted file mode 100644 index 940fb3d8..00000000 --- a/app/src/androidTest/java/com/fastaccess/ui/modules/login/LoginChooserActivityTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fastaccess.ui.modules.login; - - -import android.support.test.espresso.intent.rule.IntentsTestRule; -import android.support.test.filters.LargeTest; -import android.support.test.runner.AndroidJUnit4; - -import com.fastaccess.R; -import com.fastaccess.ui.modules.login.chooser.LoginChooserActivity; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.intent.Intents.intended; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static com.fastaccess.helper.TestHelper.textInputLayoutHasHint; - -@RunWith(AndroidJUnit4.class) @LargeTest -public class LoginChooserActivityTest { - - @Rule public IntentsTestRule intentTestRule = new IntentsTestRule<>(LoginChooserActivity.class); - - @Test public void basicAuthButtonTest() { - onView(withId(R.id.basicAuth)).perform(click()); - intended(hasComponent(LoginActivity.class.getName())); - onView(withId(R.id.password)).check(matches(textInputLayoutHasHint(intentTestRule.getActivity().getString(R.string.password)))); - } - - @Test public void accessTokenButtonTest() { - onView(withId(R.id.accessToken)).perform(click()); - intended(hasComponent(LoginActivity.class.getName())); - onView(withId(R.id.password)).check(matches(textInputLayoutHasHint(intentTestRule.getActivity().getString(R.string.access_token)))); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/com/fastaccess/ui/modules/main/MainActivityTest.java b/app/src/androidTest/java/com/fastaccess/ui/modules/main/MainActivityTest.java deleted file mode 100644 index c51e7b5a..00000000 --- a/app/src/androidTest/java/com/fastaccess/ui/modules/main/MainActivityTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.fastaccess.ui.modules.main; - -import android.support.test.espresso.intent.rule.IntentsTestRule; - -import com.fastaccess.R; -import com.fastaccess.helper.AppHelper; -import com.fastaccess.ui.modules.feeds.FeedsFragment; -import com.fastaccess.ui.modules.login.chooser.LoginChooserActivity; -import com.fastaccess.ui.modules.main.issues.pager.MyIssuesPagerFragment; -import com.fastaccess.ui.modules.main.pullrequests.pager.MyPullsPagerFragment; -import com.fastaccess.ui.modules.notification.NotificationActivity; -import com.fastaccess.ui.modules.search.SearchActivity; - -import org.junit.Rule; -import org.junit.Test; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.intent.Intents.intended; -import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static com.fastaccess.helper.TestHelper.bottomNavAction; -import static com.fastaccess.helper.TestHelper.bottomNavSelection; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * Created by Kosh on 06 May 2017, 2:11 AM - */ - -public class MainActivityTest { - @Rule public IntentsTestRule testRule = new IntentsTestRule<>(MainActivity.class); - - @Test public void noUserTest() { - assertEquals(testRule.getActivity().isLoggedIn(), false); - intended(hasComponent(LoginChooserActivity.class.getName())); - } - - @Test public void onInitTest() { - assertEquals(testRule.getActivity().isLoggedIn(), true); - onView(withId(R.id.bottomNavigation)).check(matches(bottomNavSelection(0))); - assertNotNull(AppHelper.getFragmentByTag(testRule.getActivity().getSupportFragmentManager(), FeedsFragment.TAG)); - } - - @Test public void onSelectIssuesTabTest() { - assertEquals(testRule.getActivity().isLoggedIn(), true); - onView(withId(R.id.bottomNavigation)).perform(bottomNavAction(1)) - .check(matches(bottomNavSelection(1))); - assertNotNull(AppHelper.getFragmentByTag(testRule.getActivity().getSupportFragmentManager(), MyIssuesPagerFragment.TAG)); - } - - @Test public void onSelectPullRequestsTabTest() { - assertEquals(testRule.getActivity().isLoggedIn(), true); - onView(withId(R.id.bottomNavigation)).perform(bottomNavAction(2)) - .check(matches(bottomNavSelection(2))); - assertNotNull(AppHelper.getFragmentByTag(testRule.getActivity().getSupportFragmentManager(), MyPullsPagerFragment.TAG)); - } - - @Test public void startNotificationsIntentTest() { - onView(withId(R.id.notifications)).perform(click()); - intended(hasComponent(NotificationActivity.class.getName())); - } - - @Test public void startSearchIntentTest() { - onView(withId(R.id.search)).perform(click()); - intended(hasComponent(SearchActivity.class.getName())); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc5ddefb..b0f438f5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,22 +1,18 @@ - + - - - - - - + + + + + + - - + tools:node="remove" /> + android:theme="@style/ThemeTranslucent" /> - + - + - + - - + + + android:scheme="fasthub" /> + android:theme="@style/LoginTheme" /> + android:value=".ui.modules.main.MainActivity" /> + android:value=".ui.modules.main.MainActivity" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:label="@string/create_issue" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:label="@string/viewer" /> + android:windowSoftInputMode="adjustResize" /> + android:label="@string/create_gist" /> + android:value=".ui.modules.main.MainActivity" /> + android:value=".ui.modules.main.MainActivity" /> + android:value=".ui.modules.main.MainActivity" /> + android:theme="@style/AppTheme.AboutActivity.Light" /> + android:label="@string/pinned" /> - + android:label="@string/public_gists" /> + + android:value=".ui.modules.repos.RepoPagerActivity" /> - - - + + + + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:configChanges="keyboard|orientation|screenSize" /> + android:configChanges="keyboard|orientation|screenSize" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:value=".ui.modules.main.MainActivity" /> - + + android:label="@string/theme_title" /> + android:theme="@style/ThemeTranslucent" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:windowSoftInputMode="stateAlwaysHidden" /> + android:windowSoftInputMode="adjustResize" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:value=".ui.modules.repos.RepoPagerActivity" /> + android:value=".ui.modules.user.UserPagerActivity" /> - + + android:configChanges="keyboard|orientation|screenSize" /> - + - + + android:scheme="http" /> + android:scheme="https" /> + android:scheme="http" /> + android:scheme="https" /> + android:scheme="https" /> - + android:scheme="https" /> + - - + + - + - + - + @@ -305,25 +301,29 @@ android:name=".provider.tasks.notification.NotificationSchedulerJobTask" android:exported="false"> - + - - - - - + + + + + - + + android:value="6ed82b6e0756853d7d782a3f547f84f9ecba217e" /> + + \ No newline at end of file diff --git a/app/src/main/graphql/github/PinnedRepos.graphql b/app/src/main/graphql/github/PinnedRepos.graphql index cd91505c..cfa1a23c 100644 --- a/app/src/main/graphql/github/PinnedRepos.graphql +++ b/app/src/main/graphql/github/PinnedRepos.graphql @@ -5,10 +5,10 @@ query getPinnedRepos($login: String!) { node { name url - issues(states: OPEN) { + issues(states: [OPEN]) { totalCount } - pullRequests(states: OPEN) { + pullRequests(states: [OPEN]) { totalCount } stargazers { diff --git a/app/src/main/graphql/github/RepoProject.graphql b/app/src/main/graphql/github/RepoProject.graphql index f7c41117..9dcdc8bc 100644 --- a/app/src/main/graphql/github/RepoProject.graphql +++ b/app/src/main/graphql/github/RepoProject.graphql @@ -1,6 +1,6 @@ query repoProjectsOpen($owner: String!, $name: String!, $page: String) { repository(owner: $owner, name: $name) { - projects(first: 30, states: OPEN, after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { + projects(first: 30, states: [OPEN], after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { totalCount edges { cursor @@ -27,7 +27,7 @@ repository(owner: $owner, name: $name) { } query repoProjectsClosed($owner: String!, $name: String!, $page: String) { repository(owner: $owner, name: $name) { - projects(first: 30, states: CLOSED, after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { + projects(first: 30, states: [CLOSED], after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { totalCount edges { cursor @@ -55,7 +55,7 @@ repository(owner: $owner, name: $name) { query orgProjectsOpen($owner: String!, $page: String) { organization(login: $owner) { - projects(first: 30, states: OPEN, after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { + projects(first: 30, states: [OPEN], after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { totalCount edges { cursor @@ -82,7 +82,7 @@ organization(login: $owner) { } query orgProjectsClosed($owner: String!, $page: String) { organization(login: $owner) { - projects(first: 30, states: CLOSED, after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { + projects(first: 30, states: [CLOSED], after: $page, orderBy: {field: CREATED_AT, direction: DESC}) { totalCount edges { cursor diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractFastHubNotification.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractFastHubNotification.java index 08de87aa..29547a0f 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractFastHubNotification.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractFastHubNotification.java @@ -2,14 +2,13 @@ package com.fastaccess.data.dao.model; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.fastaccess.App; import java.util.Date; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import io.reactivex.Observable; import io.requery.Column; import io.requery.Entity; @@ -33,11 +32,11 @@ import lombok.NoArgsConstructor; @io.requery.Nullable String title; @io.requery.Nullable NotificationType type; - public static void update(@Nonnull FastHubNotification notification) { + public static void update(@NonNull FastHubNotification notification) { App.getInstance().getDataStore().toBlocking().update(notification); } - public static void save(@Nonnull FastHubNotification notification) { + public static void save(@NonNull FastHubNotification notification) { App.getInstance().getDataStore().toBlocking().insert(notification); } @@ -51,7 +50,7 @@ import lombok.NoArgsConstructor; .firstOrNull(); } - @Nonnull public static Observable getNotifications() { + @NonNull public static Observable getNotifications() { return App.getInstance().getDataStore() .select(FastHubNotification.class) .orderBy(FastHubNotification.DATE.desc()) diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotificationQueue.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotificationQueue.java index 4a24acda..664e1f92 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotificationQueue.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotificationQueue.java @@ -2,6 +2,7 @@ package com.fastaccess.data.dao.model; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.Nullable; import com.fastaccess.App; import com.fastaccess.helper.RxHelper; @@ -9,8 +10,6 @@ import com.fastaccess.helper.RxHelper; import java.util.Date; import java.util.List; -import javax.annotation.Nullable; - import io.reactivex.Observable; import io.requery.BlockingEntityStore; import io.requery.Entity; diff --git a/app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestReviewModel.java b/app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestReviewModel.java deleted file mode 100644 index f260ea42..00000000 --- a/app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestReviewModel.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.fastaccess.data.dao.timeline; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.fastaccess.data.dao.ReactionsModel; -import com.fastaccess.helper.Logger; -import com.fastaccess.helper.ParseDateFormat; - -import java.util.ArrayList; -import java.util.List; - -import github.PullRequestTimelineQuery; -import github.type.PullRequestReviewState; - -/** - * Created by kosh on 20/08/2017. - */ - -public class PullRequestReviewModel { - private PullRequestTimelineQuery.AsReviewDismissedEvent reviewDismissedEvent; - private PullRequestTimelineQuery.AsReviewRequestedEvent reviewRequestedEvent; - private PullRequestTimelineQuery.AsReviewRequestRemovedEvent reviewRequestRemovedEvent; - private PullRequestTimelineQuery.Node2 node; - private List reaction; - private List comments; - private String id; - private String url; - private PullRequestTimelineQuery.Author2 author; - private String bodyHTML; - private String createdAt; - private PullRequestReviewState state; - - @Nullable public static PullRequestReviewModel build(@NonNull PullRequestTimelineQuery.Node node) { - PullRequestReviewModel model = new PullRequestReviewModel(); - if (node.asReviewRequestRemovedEvent() != null) { - model.reviewRequestRemovedEvent = node.asReviewRequestRemovedEvent(); - } else if (node.asReviewDismissedEvent() != null) { - model.reviewDismissedEvent = node.asReviewDismissedEvent(); - } else if (node.asReviewRequestedEvent() != null) { - model.reviewRequestedEvent = node.asReviewRequestedEvent(); - } else { - PullRequestTimelineQuery.AsPullRequestReview pullRequestReview = node.asPullRequestReview(); - if (pullRequestReview != null) { - model.state = pullRequestReview.state(); - model.url = pullRequestReview.url().toString(); - model.author = pullRequestReview.author(); - model.bodyHTML = pullRequestReview.bodyHTML().toString(); - model.createdAt = ParseDateFormat.getTimeAgo(pullRequestReview.createdAt().toString()).toString(); - model.id = pullRequestReview.id(); - model.url = pullRequestReview.url().toString(); - List edges = pullRequestReview.comments().edges(); - if (edges != null && !edges.isEmpty()) { - List comments = new ArrayList<>(); - for (PullRequestTimelineQuery.Edge2 edge : edges) { - PullRequestTimelineQuery.Node2 node2 = edge.node(); - if (node2 != null) { - PullRequestReviewModel comment = new PullRequestReviewModel(); - comment.node = node2; - comment.reaction = ReactionsModel.getReaction(node2.reactionGroups()); - comments.add(comment); - } - } - Logger.e(comments.size()); - model.comments = comments; - } - } else { - return null; - } - } - return model; - } - - public PullRequestTimelineQuery.AsReviewDismissedEvent getReviewDismissedEvent() { - return reviewDismissedEvent; - } - - public void setReviewDismissedEvent(PullRequestTimelineQuery.AsReviewDismissedEvent reviewDismissedEvent) { - this.reviewDismissedEvent = reviewDismissedEvent; - } - - public PullRequestTimelineQuery.AsReviewRequestedEvent getReviewRequestedEvent() { - return reviewRequestedEvent; - } - - public void setReviewRequestedEvent(PullRequestTimelineQuery.AsReviewRequestedEvent reviewRequestedEvent) { - this.reviewRequestedEvent = reviewRequestedEvent; - } - - public PullRequestTimelineQuery.AsReviewRequestRemovedEvent getReviewRequestRemovedEvent() { - return reviewRequestRemovedEvent; - } - - public void setReviewRequestRemovedEvent(PullRequestTimelineQuery.AsReviewRequestRemovedEvent reviewRequestRemovedEvent) { - this.reviewRequestRemovedEvent = reviewRequestRemovedEvent; - } - - public PullRequestTimelineQuery.Node2 getNode() { - return node; - } - - public void setNode(PullRequestTimelineQuery.Node2 node) { - this.node = node; - } - - public List getReaction() { - return reaction; - } - - public void setReaction(List reaction) { - this.reaction = reaction; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public PullRequestTimelineQuery.Author2 getAuthor() { - return author; - } - - public void setAuthor(PullRequestTimelineQuery.Author2 author) { - this.author = author; - } - - public String getBodyHTML() { - return bodyHTML; - } - - public void setBodyHTML(String bodyHTML) { - this.bodyHTML = bodyHTML; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public PullRequestReviewState getState() { - return state; - } - - public void setState(PullRequestReviewState state) { - this.state = state; - } -} diff --git a/app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestTimelineModel.java b/app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestTimelineModel.java deleted file mode 100644 index 0cd8bd06..00000000 --- a/app/src/main/java/com/fastaccess/data/dao/timeline/PullRequestTimelineModel.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.fastaccess.data.dao.timeline; - -import com.fastaccess.data.dao.ReactionsModel; -import com.fastaccess.data.dao.model.PullRequest; - -import java.util.List; - -import lombok.Getter; -import lombok.Setter; -import github.PullRequestTimelineQuery; - -/** - * Created by kosh on 02/08/2017. - */ - -@Getter @Setter public class PullRequestTimelineModel { - - public static final int HEADER = 1; - public static final int EVENT = 2; - public static final int COMMENT = 3; - public static final int STATUS = 4; - public static final int REVIEW = 5; - public static final int COMMIT_COMMENTS = 6; - public PullRequestTimelineQuery.Node node; - public PullRequest pullRequest; - public PullRequestTimelineQuery.Status status; - public List reactions; - public boolean isMergeable; - public PullRequestCommitModel commitThread; - public PullRequestReviewModel reviewModel; - - public PullRequestTimelineModel(PullRequest pullRequest) { - this.pullRequest = pullRequest; - } - - public PullRequestTimelineModel(PullRequestTimelineQuery.Node node) { - this.node = node; - if (this.node.asCommitCommentThread() != null) { - - } else { - if (node.asPullRequestReview() != null || node.asReviewDismissedEvent() != null - || node.asReviewRequestedEvent() != null || node.asReviewRequestRemovedEvent() != null) { - reviewModel = PullRequestReviewModel.build(node); - } - } - } - - public PullRequestTimelineModel(PullRequestTimelineQuery.Status status, boolean isMergeable) { - this.status = status; - this.isMergeable = isMergeable; - } - - public int getType() { - if (pullRequest != null) return HEADER; - if (node != null) { - if (node.asAssignedEvent() != null || node.asClosedEvent() != null - || node.asDemilestonedEvent() != null || node.asHeadRefDeletedEvent() != null - || node.asLabeledEvent() != null || node.asLockedEvent() != null - || node.asMergedEvent() != null || node.asMilestonedEvent() != null - || node.asReferencedEvent() != null || node.asRenamedTitleEvent() != null - || node.asReopenedEvent() != null || node.asUnassignedEvent() != null - || node.asUnlabeledEvent() != null || node.asUnlockedEvent() != null - || node.asCommit() != null || node.asHeadRefRestoredEvent() != null) { - return EVENT; - } else if (node.asIssueComment() != null) { - if (reactions == null) { - //noinspection ConstantConditions - setReactions(ReactionsModel.getReaction2(node.asIssueComment().reactionGroups())); - } - return COMMENT; - } else if (reviewModel != null) { - return REVIEW; - } else if (commitThread != null) { - return COMMIT_COMMENTS; - } - } else if (status != null) { - return STATUS; - } - return 0; - } - - @Override public String toString() { - return String.valueOf(getType()); - } -} diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestEventViewHolder.kt b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestEventViewHolder.kt deleted file mode 100644 index 2d114306..00000000 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/PullRequestEventViewHolder.kt +++ /dev/null @@ -1,414 +0,0 @@ -package com.fastaccess.ui.adapter.viewholder - -import android.annotation.SuppressLint -import android.graphics.Color -import android.support.v4.content.ContextCompat -import android.text.style.BackgroundColorSpan -import android.view.View -import android.view.ViewGroup -import butterknife.BindView -import com.fastaccess.R -import com.fastaccess.data.dao.timeline.PullRequestTimelineModel -import com.fastaccess.helper.ParseDateFormat -import com.fastaccess.helper.PrefGetter -import com.fastaccess.helper.ViewHelper -import com.fastaccess.provider.scheme.LinkParserHelper -import com.fastaccess.provider.timeline.HtmlHelper -import com.fastaccess.ui.widgets.AvatarLayout -import com.fastaccess.ui.widgets.FontTextView -import com.fastaccess.ui.widgets.ForegroundImageView -import com.fastaccess.ui.widgets.SpannableBuilder -import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter -import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder -import com.zzhoujay.markdown.style.CodeSpan -import github.PullRequestTimelineQuery -import github.type.StatusState - -/** - * Created by kosh on 03/08/2017. - */ - -class PullRequestEventViewHolder private constructor(view: View, adapter: BaseRecyclerAdapter<*, *, *>) : - BaseViewHolder(view, adapter) { - - @BindView(R.id.stateImage) lateinit var stateImage: ForegroundImageView - @BindView(R.id.avatarLayout) lateinit var avatarLayout: AvatarLayout - @BindView(R.id.stateText) lateinit var stateText: FontTextView - @BindView(R.id.commitStatus) lateinit var commitStatus: ForegroundImageView - - override fun bind(t: PullRequestTimelineModel) { - val node = t.node - commitStatus.visibility = View.GONE - if (node != null) { - when { - node.asAssignedEvent() != null -> assignedEvent(node.asAssignedEvent()!!) - node.asBaseRefForcePushedEvent() != null -> forcePushEvent(node.asBaseRefForcePushedEvent()!!) - node.asClosedEvent() != null -> closedEvent(node.asClosedEvent()!!) - node.asCommit() != null -> commitEvent(node.asCommit()!!) - node.asDemilestonedEvent() != null -> demilestonedEvent(node.asDemilestonedEvent()!!) - node.asDeployedEvent() != null -> deployedEvent(node.asDeployedEvent()!!) - node.asHeadRefDeletedEvent() != null -> refDeletedEvent(node.asHeadRefDeletedEvent()!!) - node.asHeadRefForcePushedEvent() != null -> refForPushedEvent(node.asHeadRefForcePushedEvent()!!) - node.asHeadRefRestoredEvent() != null -> headRefRestoredEvent(node.asHeadRefRestoredEvent()!!) - node.asLabeledEvent() != null -> labeledEvent(node.asLabeledEvent()!!) - node.asLockedEvent() != null -> lockEvent(node.asLockedEvent()!!) - node.asMergedEvent() != null -> mergedEvent(node.asMergedEvent()!!) - node.asMilestonedEvent() != null -> milestoneEvent(node.asMilestonedEvent()!!) - node.asReferencedEvent() != null -> referenceEvent(node.asReferencedEvent()!!) - node.asRenamedTitleEvent() != null -> renamedEvent(node.asRenamedTitleEvent()!!) - node.asReopenedEvent() != null -> reopenedEvent(node.asReopenedEvent()!!) - node.asUnassignedEvent() != null -> unassignedEvent(node.asUnassignedEvent()!!) - node.asUnlabeledEvent() != null -> unlabeledEvent(node.asUnlabeledEvent()!!) - node.asUnlockedEvent() != null -> unlockedEvent(node.asUnlockedEvent()!!) - else -> reset() - } - } else { - reset() - } - } - - private fun reset() { - stateText.text = "" - avatarLayout.setUrl(null, null, false, false) - } - - @SuppressLint("SetTextI18n") - private fun unlockedEvent(event: PullRequestTimelineQuery.AsUnlockedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("unlocked this conversation") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_lock) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun unlabeledEvent(event: PullRequestTimelineQuery.AsUnlabeledEvent) { - event.actor()?.let { - val color = Color.parseColor("#" + event.label().color()) - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("removed") - .append(" ") - .append(event.label().name(), CodeSpan(color, ViewHelper.generateTextColor(color), 5.0f)) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_label) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun unassignedEvent(event: PullRequestTimelineQuery.AsUnassignedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("unassigned") //TODO add "removed their assignment" for self - .append(" ") - .append(event.user()?.login()) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_profile) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun reopenedEvent(event: PullRequestTimelineQuery.AsReopenedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("reopened this") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_issue_opened) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun renamedEvent(event: PullRequestTimelineQuery.AsRenamedTitleEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("changed the title from").append(" ").append(event.previousTitle()) - .append(" ").append("to").append(" ").bold(event.currentTitle()) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_edit) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun referenceEvent(event: PullRequestTimelineQuery.AsReferencedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("referenced in") - .append(" ") - .append("from").append(" ") - .url(if (event.commit() != null) { - substring(event.commit()?.oid()?.toString()) - } else if (event.subject().asIssue() != null) { - if (event.isCrossRepository) { - "${event.commitRepository().nameWithOwner()} ${event.subject().asIssue()?.title()}#${event.subject().asIssue()?.number()}" - } else { - "${event.subject().asIssue()?.title()}#${event.subject().asIssue()?.number()}" - } - } else if (event.subject().asPullRequest() != null) { - if (event.isCrossRepository) { - "${event.commitRepository().nameWithOwner()} ${event.subject().asPullRequest()?.title()}" + - "#${event.subject().asPullRequest()?.number()}" - } else { - "${event.subject().asPullRequest()?.title()}#${event.subject().asPullRequest()?.number()}" - } - } else { - event.commitRepository().nameWithOwner() - }) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_push) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun milestoneEvent(event: PullRequestTimelineQuery.AsMilestonedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("added this to the") - .append(" ") - .append(event.milestoneTitle()).append(" ").append("milestone") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_milestone) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun mergedEvent(event: PullRequestTimelineQuery.AsMergedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("merged commit") - .append(" ") - .url(substring(event.commit()?.oid()?.toString())) - .append(" ") - .append("into") - .append(" ") - .append(event.actor()) - .append(":") - .append(event.mergeRefName(), BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType()))) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_merge) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun lockEvent(event: PullRequestTimelineQuery.AsLockedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("locked and limited conversation to collaborators") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_lock) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun labeledEvent(event: PullRequestTimelineQuery.AsLabeledEvent) { - event.actor()?.let { - val color = Color.parseColor("#" + event.label().color()) - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("labeled") - .append(" ") - .append(event.label().name(), CodeSpan(color, ViewHelper.generateTextColor(color), 5.0f)) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_label) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun headRefRestoredEvent(event: PullRequestTimelineQuery.AsHeadRefRestoredEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("restored the") - .append(" ") - .append(it.login()) - .append(":") - .append(event.pullRequest().headRefName(), BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType()))) - .append(" ") - .append("branch") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_push) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun refForPushedEvent(event: PullRequestTimelineQuery.AsHeadRefForcePushedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("reference force pushed to", BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType()))) - .append(" ") - .url(substring(event.afterCommit().oid().toString())) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_push) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun refDeletedEvent(event: PullRequestTimelineQuery.AsHeadRefDeletedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("deleted the") - .append(" ") - .append(it.login()) - .append(":") - .append(substring(event.headRefName()), BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType()))) - .append(" ") - .append("branch") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_trash) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun deployedEvent(event: PullRequestTimelineQuery.AsDeployedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("made a deployment", BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType()))) - .append(" ") - .append(event.deployment().latestStatus()?.state()?.name) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_push) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun demilestonedEvent(event: PullRequestTimelineQuery.AsDemilestonedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("removed this from the") - .append(" ") - .append(event.milestoneTitle()).append(" ").append("milestone") - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_milestone) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun commitEvent(event: PullRequestTimelineQuery.AsCommit) { - event.author()?.let { - stateText.text = SpannableBuilder.builder()//Review[k0shk0sh] We may want to suppress more then 3 or 4 commits. since it will clog the it - .bold(if (it.user() == null) it.name() else it.user()?.login()) - .append(" ") - .append("committed") - .append(" ") - .append(event.messageHeadline()) - .append(" ") - .url(substring(event.oid().toString())) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.committedDate().toString()))) - stateImage.setImageResource(R.drawable.ic_push) - avatarLayout.setUrl(it.user()?.avatarUrl().toString(), it.user()?.login(), false, - LinkParserHelper.isEnterprise(it.user()?.url().toString())) - event.status()?.let { - commitStatus.visibility = View.VISIBLE - val context = commitStatus.context - commitStatus.tintDrawableColor(when (it.state()) { - StatusState.ERROR -> ContextCompat.getColor(context, R.color.material_red_700) - StatusState.FAILURE -> ContextCompat.getColor(context, R.color.material_deep_orange_700) - StatusState.SUCCESS -> ContextCompat.getColor(context, R.color.material_green_700) - else -> ContextCompat.getColor(context, R.color.material_yellow_700) - }) - } - } - } - - private fun closedEvent(event: PullRequestTimelineQuery.AsClosedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("closed this in") - .append(" ") - .url(substring(event.commit()?.oid()?.toString())) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_merge) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun forcePushEvent(event: PullRequestTimelineQuery.AsBaseRefForcePushedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("force pushed to", BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType()))) - .append(" ") - .url(substring(event.afterCommit().oid().toString())) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_push) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun assignedEvent(event: PullRequestTimelineQuery.AsAssignedEvent) { - event.actor()?.let { - stateText.text = SpannableBuilder.builder() - .bold(it.login()) - .append(" ") - .append("assigned") //TODO add "self-assigned" for self - .append(" ") - .append(event.user()?.login()) - .append(" ") - .append(ParseDateFormat.getTimeAgo((event.createdAt().toString()))) - stateImage.setImageResource(R.drawable.ic_profile) - avatarLayout.setUrl(it.avatarUrl().toString(), it.login(), false, LinkParserHelper.isEnterprise(it.url().toString())) - } - } - - private fun substring(value: String?): String { - if (value == null) { - return "" - } - return if (value.length <= 7) value - else value.substring(0, 7) - } - - companion object { - fun newInstance(parent: ViewGroup, adapter: BaseRecyclerAdapter<*, *, *>): PullRequestEventViewHolder { - return PullRequestEventViewHolder(getView(parent, R.layout.issue_timeline_row_item), adapter) - } - } -} \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9a4d9780..635d5e0a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -450,8 +450,8 @@ Proyectos No hay proyectos No hay cartas - Agregado por %s %s - Muchas diferencias para mostrar. Por favor, ver via navegador web + Agregado por %s %s + Muchas diferencias para mostrar. Por favor, ver vía navegador web Proyecto POR FAVOR, LEER! @@ -475,7 +475,7 @@ Alternativamente, puedes iniciar sesión con un Access Token.

• Estoy teniendo problemas! / Quiero sugerirles cosas!
-

Ve a https://github.com/k0shk0sh/FastHub/issues/new y crea un nuevo issue por cualquier 'bug' o solicitud de característica. +

Ve a https://github.com/k0shk0sh/FastHub/issues/new y crea un nuevo issue por cualquier bug o solicitud de característica. Pedimos que busques por issues similares antes de abrir uno nuevo. Cualquier ticket duplicado será etiquetado y borrado inmediatamente.

• Cómo puedo obtener un PROMO CODE?
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b55614a4..9ded7815 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -330,7 +330,7 @@ Se connecter via l\'authentification simple Si vous êtes actuellement lié à une organisation et que vous ne pouvez pas la voir ici, veuillez suivre le lien ci-dessous.\nhttps://help.github.com/articles/about-third-party-application-restrictions\nPS: Vous pouvez - utiliser le token Access pour vous connecter, ce qui permettra à FastHub d'accéder à la liste de vos organisations\nVous pouvez + utiliser le token Access pour vous connecter, ce qui permettra à FastHub d\'accéder à la liste de vos organisations\nVous pouvez aussi ouvrir https://github.com/settings/applications et chercher FastHub. Ouvrez le puis faites défiler jusqu\'à Accès aux organisations et cliquez sur le bouton Accorder. Insérer @@ -422,7 +422,7 @@ Projets Aucun projet Aucune carte - Ajouté par %s %s + Ajouté par %s %s Trop de différences à afficher. Merci de les afficher via le navigateur Projet MERCI DE LIRE ! @@ -451,7 +451,7 @@ ]]>
FAQ Commentaires ajoutés avec succès - Vider l'historique de recherche + Vider l\'historique de recherche Restorer les achats Inclure les Forks Le commentaire est trop loin pour être trouvé diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index dfe8641a..34249a0e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,5 +1,4 @@ - + Caricamento, attendi per favore… Azione Impostazioni @@ -432,27 +431,27 @@ Progetti Nessun Progetto Nessuna Card - Aggiunto da %s %s + Aggiunto da %s %s Troppe differenze da visualizzare. Perfavore, visualizzarli tramite un browser. Progetto PERFAVORE LEGGERE! • Perchè non posso visualizzare le mie Organizzazioni Private o Pubbliche? +
• Perché non posso visualizzare le mie Organizzazioni Private o Pubbliche?

Apri https://github.com/settings/applications e cerca FastHub, aprilo e scorri fino a Accesso organizzazione("Organization access") e cliccare il pulsante Permetti("Grant") Alternativamente puoi accedere utilizzando il Token di Accesso che faciliterà il processo..

-
• Ho provato ad accedere con un Token di accesso e una Password One-Time (OTP) senza alcun successo. Cosa c\'è di sbagliato?
+
• Ho provato ad accedere con un Token di accesso e una Password One-Time (OTP) senza alcun successo. Cosa c\è di sbagliato?

Non puoi accedere con il Token si accesso e con OTP tutto insieme. A causa del limitato tempo di vita do queste password, devi ripetere ogni procedura di accesso ogni qualche secondo.

• Perché non sono le mie Wiki nei repository privati ed Enterprise mostrati?
-

Mentre FastHub ritrae le pagine Wiki di GitHub, l'applicazione non è in grado di ottenere alcun token di sessione richiesto dai repository privati.

+

Mentre FastHub ritrae le pagine Wiki di GitHub, lapplicazione non è in grado di ottenere alcun token di sessione richiesto dai repository privati.

-
• Ho effettuato l'accesso al mio account aziendale. Perché non posso interagire con qualcosa di diverso dal mio Enterprise GitHub?
+
• Ho effettuato laccesso al mio account aziendale. Perché non posso interagire con qualcosa di diverso dal mio Enterprise GitHub?

Bene, logicamente, non puoi accedere ad altro che non sia la tua Enterprise. FastHub tenta di richiedere il maggior numero possibile di autorizzazioni, ma non può fare altro nella maggior parte dei casi, poiché le credenziali non sono sul server di GitHub. Ma in alcuni casi il token OAuth del tuo account GitHub farà tutto.

• Perché ho problemi con la modifica di Problemi/Pull Requests (PRs)?
-

Se non si è in grado di modificare Problemi/PR nel repository di un'organizzazione pubblica, contattare la propria organizzazione per concedere l'accesso a FastHub. In alternativa puoi accedere con un token di accesso.

+

Se non si è in grado di modificare Problemi/PR nel repository di unorganizzazione pubblica, contattare la propria organizzazione per concedere laccesso a FastHub. In alternativa puoi accedere con un token di accesso.

• Sto avendo problemi! / Voglio suggerirti alcune cose!

Vai a https://github.com/k0shk0sh/FastHub/issues/new e crea un nuovo problema per eventuali bug e richieste di funzionalità. Ti incoraggio davvero a cercare problemi simili prima di aprirne uno nuovo. Qualsiasi ticket duplicato sarà etichettato come duplicato e chiuso immediatamente.

diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f4966b40..8c3402ae 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -422,14 +422,14 @@ Проекты Проекты отсутствуют Карточки отсутствуют - Добавлено %s %s + Добавлено %s %s Слишком много изменений для отображения. Посмотрите их, пожалуйста, в браузере Проект ПОЖАЛУЙСТА, ОЗНАКОМЬТЕСЬ! • Почему я не вижу Организаций, в которых состою? -

Перейдите по ссылке https://github.com/settings/applications, выберите FastHub, напротив 'Organization access' ('Доступ к организациям') нажмите кнопку 'Grant' ('Предоставить'). +

Перейдите по ссылке https://github.com/settings/applications, выберите FastHub, напротив Organization access (Доступ к организациям) нажмите кнопку Grant (Предоставить). Хорошей и простой альтернативой будет выполнение входа при помощи Маркера доступа (Access Token).

• Я попытался выполнить вход, используя Маркер доступа (Access Token) и одноразовый пароль, но безуспешно. В чём дело?

Вы не сможете выполнить вход при помощи Маркера доступа и одноразового пароля. Так как такие пароли имеют ограниченный срок действия, вам придётся проделывать операцию входа каждые несколько секунд.

diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9cf7e668..5003c4fb 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -23,5 +23,5 @@ 16dp 1 1 - drawable_callback +
diff --git a/app/src/test/java/com/fastaccess/login/LoginPresenterTest.java b/app/src/test/java/com/fastaccess/login/LoginPresenterTest.java deleted file mode 100644 index 43ee13d4..00000000 --- a/app/src/test/java/com/fastaccess/login/LoginPresenterTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fastaccess.login; - -import com.fastaccess.ui.modules.login.LoginMvp; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.Mock; - -/** - * Created by Kosh on 02 May 2017, 7:52 PM - */ - -@RunWith(JUnit4.class) -public class LoginPresenterTest { - - @Mock private LoginMvp.View view; - - @Before public void setUp() throws Exception { -// MockitoAnnotations.initMocks(this); -// final TiPresenterInstructor instructor = new TiPresenterInstructor<>(new LoginPresenter()); -// instructor.attachView(view); - } - - @Test public void onTokenResponse() throws Exception {} - - @Test public void onHandleAuthIntent() throws Exception { - - } - - @Test public void onUserResponse() throws Exception { - - } - - @Test public void login() throws Exception { - - } - -} diff --git a/build.gradle b/build.gradle index 6ade19ab..70b8ac7a 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { assertjVersion = '2.5.0' espresseVersion = '2.2.2' requery = '1.3.2' - kotlin_version = '1.2.10' + kotlin_version = '1.3.61' commonmark = '0.10.0' glideVersion = '3.7.0' } @@ -23,13 +23,12 @@ buildscript { maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-alpha08' - classpath 'com.google.gms:google-services:3.2.0' - classpath 'com.novoda:gradle-build-properties-plugin:0.3' - classpath 'com.dicedmelon.gradle:jacoco-android:0.1.2' - classpath 'io.fabric.tools:gradle:1.24.1' - classpath 'com.apollographql.apollo:gradle-plugin:0.4.1' + classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}" + classpath 'com.google.gms:google-services:3.2.0' + classpath 'com.novoda:gradle-build-properties-plugin:0.4.1' + classpath 'io.fabric.tools:gradle:1.31.2' + classpath 'com.apollographql.apollo:apollo-gradle-plugin:1.2.2' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8536732f..174a9819 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ -#Fri Feb 16 18:31:07 CET 2018 +#Wed Dec 25 06:39:30 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip android.enableD8=true