diff --git a/app/build.gradle b/app/build.gradle index 33f883db..d33a1f38 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,14 +22,14 @@ android { storePassword((buildProperties.secrets['android_store_password'] | buildProperties.notThere['android_store_password']).string) } } - compileSdkVersion 26 - buildToolsVersion "26.0.0" + compileSdkVersion 25 + buildToolsVersion "26.0.0-rc2" defaultConfig { applicationId "com.fastaccess.github" minSdkVersion 21 targetSdkVersion 26 - versionCode 301 - versionName "3.0.1" + versionCode 310 + versionName "3.1.0" 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 @@ -149,8 +149,8 @@ dependencies { implementation "com.github.miguelbcr:RxBillingService:0.0.3" implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'org.jsoup:jsoup:1.10.2' - implementation 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT' implementation "com.evernote:android-state:${state_version}" + implementation "petrov.kristiyan:colorpicker-library:1.1.4" compileOnly "org.projectlombok:lombok:${lombokVersion}" kapt "io.requery:requery-processor:${requery}" kapt "org.projectlombok:lombok:${lombokVersion}" diff --git a/app/src/debug/res/values/secrets.xml b/app/src/debug/res/values/secrets.xml index c8e78bd6..9ecf9305 100644 --- a/app/src/debug/res/values/secrets.xml +++ b/app/src/debug/res/values/secrets.xml @@ -7,4 +7,5 @@ android.test.refunded android.test.item_unavailable android.test.purchased + android.test.purchased \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java index 8daba989..c42dbf85 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -215,6 +215,7 @@ import lombok.Setter; return Stream.of(new FragmentPagerAdapterModel("", ThemeFragment.Companion.newInstance(R.style.ThemeLight)), new FragmentPagerAdapterModel("", ThemeFragment.Companion.newInstance(R.style.ThemeDark)), new FragmentPagerAdapterModel("", ThemeFragment.Companion.newInstance(R.style.ThemeAmlod))) +// new FragmentPagerAdapterModel("", ThemeFragment.Companion.newInstance(R.style.ThemeMidNighBlue))) .collect(Collectors.toList()); } } diff --git a/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java b/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java index 98b15d70..1f8cb9aa 100644 --- a/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java @@ -266,7 +266,7 @@ import static com.annimon.stream.Collectors.toList; .map(TimelineModel::new) .collect(Collectors.toList())); } - return models; + return Stream.of(models).sortBy(TimelineModel::getSortedDate).toList(); } @Override public boolean equals(Object o) { @@ -280,7 +280,6 @@ import static com.annimon.stream.Collectors.toList; return comment != null ? (int) comment.getId() : 0; } - @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { diff --git a/app/src/main/java/com/fastaccess/helper/PrefGetter.java b/app/src/main/java/com/fastaccess/helper/PrefGetter.java index f4d005f1..1171753d 100644 --- a/app/src/main/java/com/fastaccess/helper/PrefGetter.java +++ b/app/src/main/java/com/fastaccess/helper/PrefGetter.java @@ -21,6 +21,7 @@ public class PrefGetter { public static final int LIGHT = 1; public static final int DARK = 2; public static final int AMLOD = 3; + public static final int MID_NIGHT_BLUE = 4; public static final int RED = 1; public static final int PINK = 2; @@ -42,7 +43,8 @@ public class PrefGetter { @IntDef({ LIGHT, DARK, - AMLOD + AMLOD, + MID_NIGHT_BLUE }) @Retention(RetentionPolicy.SOURCE) @interface ThemeType {} @@ -86,6 +88,7 @@ public class PrefGetter { private static final String SENT_VIA_BOX = "sent_via_enabled"; private static final String PROFILE_BACKGROUND_URL = "profile_background_url"; private static final String AMLOD_THEME_ENABLED = "amlod_theme_enabled"; + private static final String MIDNIGHTBLUE_THEME_ENABLED = "midnightblue_theme_enabled"; private static final String PRO_ITEMS = "pro_items"; public static void setToken(@NonNull String token) { @@ -249,6 +252,8 @@ public class PrefGetter { return LIGHT; } else if (appTheme.equalsIgnoreCase(resources.getString(R.string.amlod_theme_mode))) { return AMLOD; + } else if (appTheme.equalsIgnoreCase(resources.getString(R.string.mid_night_blue_theme_mode))) { + return MID_NIGHT_BLUE; } } return LIGHT; @@ -256,6 +261,11 @@ public class PrefGetter { @ThemeColor private static int getThemeColor(@NonNull Resources resources) { String appColor = PrefHelper.getString("appColor"); + return getThemeColor(resources, appColor); + } + + // used for color picker to get the index of the color (enum) from the name of the color + public static int getThemeColor(@NonNull Resources resources, String appColor) { if (!InputHelper.isEmpty(appColor)) { if (appColor.equalsIgnoreCase(resources.getString(R.string.red_theme_mode))) return RED; @@ -329,6 +339,13 @@ public class PrefGetter { public static boolean isAmlodEnabled() { return PrefHelper.getBoolean(AMLOD_THEME_ENABLED); } + public static void enableMidNightBlueTheme() { + PrefHelper.set(MIDNIGHTBLUE_THEME_ENABLED, true); + } + + public static boolean isMidNightBlueThemeEnabled() { + return PrefHelper.getBoolean(MIDNIGHTBLUE_THEME_ENABLED); + } public static void setProItems() { PrefHelper.set(PRO_ITEMS, true); diff --git a/app/src/main/java/com/fastaccess/provider/theme/ThemeEngine.kt b/app/src/main/java/com/fastaccess/provider/theme/ThemeEngine.kt index 37351c36..cb43f3d9 100644 --- a/app/src/main/java/com/fastaccess/provider/theme/ThemeEngine.kt +++ b/app/src/main/java/com/fastaccess/provider/theme/ThemeEngine.kt @@ -88,6 +88,25 @@ object ThemeEngine { PrefGetter.DEEP_ORANGE -> return R.style.ThemeAmlod_DeepOrange else -> return R.style.ThemeAmlod } + } else if (themeMode == PrefGetter.MID_NIGHT_BLUE) { + when (themeColor) { + PrefGetter.RED -> return R.style.ThemeMidNighBlue_Red + PrefGetter.PINK -> return R.style.ThemeMidNighBlue_Pink + PrefGetter.PURPLE -> return R.style.ThemeMidNighBlue_Purple + PrefGetter.DEEP_PURPLE -> return R.style.ThemeMidNighBlue_DeepPurple + PrefGetter.INDIGO -> return R.style.ThemeMidNighBlue_Indigo + PrefGetter.BLUE -> return R.style.ThemeMidNighBlue + PrefGetter.LIGHT_BLUE -> return R.style.ThemeMidNighBlue_LightBlue + PrefGetter.CYAN -> return R.style.ThemeMidNighBlue_Cyan + PrefGetter.TEAL, PrefGetter.GREEN -> return R.style.ThemeMidNighBlue_Green + PrefGetter.LIGHT_GREEN -> return R.style.ThemeMidNighBlue_LightGreen + PrefGetter.LIME -> return R.style.ThemeMidNighBlue_Lime + PrefGetter.YELLOW -> return R.style.ThemeMidNighBlue_Yellow + PrefGetter.AMBER -> return R.style.ThemeMidNighBlue_Amber + PrefGetter.ORANGE -> return R.style.ThemeMidNighBlue_Orange + PrefGetter.DEEP_ORANGE -> return R.style.ThemeMidNighBlue_DeepOrange + else -> return R.style.ThemeMidNighBlue + } } return R.style.ThemeLight } diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java index c021b3d0..7561c603 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/FeedsViewHolder.java @@ -214,8 +214,8 @@ public class FeedsViewHolder extends BaseViewHolder { int size = commits != null ? commits.size() : -1; SpannableBuilder spanCommits = SpannableBuilder.builder(); if (size > 0) { - if (size != 1) spanCommits.append(String.valueOf(eventsModel.getPayload().getSize())).append(" new commits").append(" "); - else spanCommits.append("1 new commit").append(" "); + if (size != 1) spanCommits.append(String.valueOf(eventsModel.getPayload().getSize())).append(" new commits").append("\n"); + else spanCommits.append("1 new commit").append("\n"); int max = 5; int appended = 0; for (GitCommitModel commit : commits) { @@ -224,7 +224,7 @@ public class FeedsViewHolder extends BaseViewHolder { if (TextUtils.isEmpty(sha)) continue; sha = sha.length() > 7 ? sha.substring(0, 7) : sha; spanCommits.url(sha).append(" ") - .append(commit.getMessage() != null ? commit.getMessage().replaceAll("\\r?\\n|\\r"," ") : "") + .append(commit.getMessage() != null ? commit.getMessage().replaceAll("\\r?\\n|\\r", " ") : "") .append("\n"); appended++; if (appended == max) break; @@ -255,7 +255,7 @@ public class FeedsViewHolder extends BaseViewHolder { .bold("#") .bold(String.valueOf(pullRequest.getNumber())); if (comment.getBody() != null) { - MarkDownProvider.stripMdText(description, comment.getBody().replaceAll("\\r?\\n|\\r"," ")); + MarkDownProvider.stripMdText(description, comment.getBody().replaceAll("\\r?\\n|\\r", " ")); description.setVisibility(View.VISIBLE); } else { description.setText(""); @@ -280,7 +280,7 @@ public class FeedsViewHolder extends BaseViewHolder { .bold(String.valueOf(issue.getNumber())); if ("opened".equals(action) || "closed".equals(action)) { if (issue.getTitle() != null) { - MarkDownProvider.stripMdText(description, issue.getTitle().replaceAll("\\r?\\n|\\r"," ")); + MarkDownProvider.stripMdText(description, issue.getTitle().replaceAll("\\r?\\n|\\r", " ")); description.setVisibility(View.VISIBLE); } else { description.setText(""); @@ -325,7 +325,7 @@ public class FeedsViewHolder extends BaseViewHolder { .bold("#") .bold(String.valueOf(issue.getNumber())); if (issue.getTitle() != null) { - MarkDownProvider.stripMdText(description, issue.getTitle().replaceAll("\\r?\\n|\\r"," ")); + MarkDownProvider.stripMdText(description, issue.getTitle().replaceAll("\\r?\\n|\\r", " ")); description.setVisibility(View.VISIBLE); } else { description.setText(""); @@ -348,7 +348,7 @@ public class FeedsViewHolder extends BaseViewHolder { .bold("#") .bold(String.valueOf(issue.getNumber())); if (comment.getBody() != null) { - MarkDownProvider.stripMdText(description, comment.getBody().replaceAll("\\r?\\n|\\r"," ")); + MarkDownProvider.stripMdText(description, comment.getBody().replaceAll("\\r?\\n|\\r", " ")); description.setVisibility(View.VISIBLE); } else { description.setText(""); @@ -420,7 +420,7 @@ public class FeedsViewHolder extends BaseViewHolder { .append(" ") .append(eventsModel.getRepo().getName()); if (payloadModel.getDescription() != null) { - MarkDownProvider.stripMdText(description, payloadModel.getDescription().replaceAll("\\r?\\n|\\r"," ")); + MarkDownProvider.stripMdText(description, payloadModel.getDescription().replaceAll("\\r?\\n|\\r", " ")); description.setVisibility(View.VISIBLE); } else { description.setText(""); @@ -445,13 +445,12 @@ public class FeedsViewHolder extends BaseViewHolder { .append(" ") .bold("commit") .append(" ") - .url(commitId != null ? commitId : "") - .append(" ") .bold("in") .append(" ") - .append(eventsModel.getRepo().getName()); + .append(eventsModel.getRepo().getName()) + .url(commitId != null ? "@" + commitId : ""); if (comment != null && comment.getBody() != null) { - MarkDownProvider.stripMdText(description, comment.getBody().replaceAll("\\r?\\n|\\r"," ")); + MarkDownProvider.stripMdText(description, comment.getBody().replaceAll("\\r?\\n|\\r", " ")); description.setVisibility(View.VISIBLE); } else { description.setText(""); diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java index 0fbe7522..005f7c10 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java @@ -7,7 +7,6 @@ import android.view.ViewGroup; import com.fastaccess.R; import com.fastaccess.data.dao.model.Gist; -import com.fastaccess.helper.Logger; import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; @@ -15,7 +14,6 @@ import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter; import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; import butterknife.BindView; - /** * Created by Kosh on 11 Nov 2016, 2:08 PM */ diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TrendingViewHolder.kt b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TrendingViewHolder.kt index 8df49e09..1affba97 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TrendingViewHolder.kt +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/TrendingViewHolder.kt @@ -1,12 +1,12 @@ package com.fastaccess.ui.adapter.viewholder import android.view.View -import butterknife.bindView import com.fastaccess.R import com.fastaccess.data.dao.TrendingModel import com.fastaccess.provider.colors.ColorsProvider import com.fastaccess.provider.emoji.EmojiParser import com.fastaccess.ui.widgets.FontTextView +import com.fastaccess.ui.widgets.bindView import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder 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 2c148cfc..525a25fe 100644 --- a/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java +++ b/app/src/main/java/com/fastaccess/ui/base/BaseActivity.java @@ -26,12 +26,14 @@ import android.widget.Toast; import com.evernote.android.state.State; import com.evernote.android.state.StateSaver; import com.fastaccess.App; +import com.fastaccess.BuildConfig; import com.fastaccess.R; import com.fastaccess.data.dao.model.Login; import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; +import com.fastaccess.helper.Logger; import com.fastaccess.helper.PrefGetter; import com.fastaccess.helper.PrefHelper; import com.fastaccess.helper.ViewHelper; @@ -56,6 +58,9 @@ import com.fastaccess.ui.widgets.dialog.ProgressDialogFragment; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.MobileAds; +import com.miguelbcr.io.rx_billing_service.RxBillingService; +import com.miguelbcr.io.rx_billing_service.entities.ProductType; +import com.miguelbcr.io.rx_billing_service.entities.Purchase; import com.nostra13.universalimageloader.core.ImageLoader; import net.grandcentrix.thirtyinch.TiActivity; @@ -65,6 +70,7 @@ import java.util.ArrayList; import butterknife.BindView; import butterknife.ButterKnife; import es.dmoral.toasty.Toasty; +import io.reactivex.functions.Action; /** @@ -433,6 +439,33 @@ public abstract class BaseActivity showProgress(0)) + .subscribe((purchases, throwable) -> { + hideProgress(); + if (throwable == null) { + Logger.e(purchases); + if (purchases != null && !purchases.isEmpty()) { + for (Purchase purchase : purchases) { + String sku = purchase.sku(); + if (sku != null) { + if (sku.equalsIgnoreCase(getString(R.string.donation_product_1))) { + PrefGetter.enableAmlodTheme(); + } else { + PrefGetter.setProItems(); + } + } + } + } + } else { + throwable.printStackTrace(); + } + if (action != null) action.run(); + })); + } + private void setupTheme() { ThemeEngine.INSTANCE.apply(this); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/about/FastHubAboutActivity.java b/app/src/main/java/com/fastaccess/ui/modules/about/FastHubAboutActivity.java index 9f938bd0..785a54d6 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/about/FastHubAboutActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/about/FastHubAboutActivity.java @@ -46,6 +46,8 @@ public class FastHubAboutActivity extends MaterialAboutActivity { setTheme(R.style.AppTheme_AboutActivity_Dark); } else if (themeMode == PrefGetter.AMLOD) { setTheme(R.style.AppTheme_AboutActivity_Amlod); + } else if (themeMode == PrefGetter.MID_NIGHT_BLUE) { + setTheme(R.style.AppTheme_AboutActivity_MidNightBlue); } super.onCreate(savedInstanceState); malRecyclerview = findViewById(R.id.mal_recyclerview); diff --git a/app/src/main/java/com/fastaccess/ui/modules/login/LoginActivity.java b/app/src/main/java/com/fastaccess/ui/modules/login/LoginActivity.java index 645e797c..f0ab5507 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/login/LoginActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/login/LoginActivity.java @@ -25,15 +25,10 @@ import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; -import com.fastaccess.helper.Logger; -import com.fastaccess.helper.PrefGetter; import com.fastaccess.helper.PrefHelper; import com.fastaccess.ui.base.BaseActivity; import com.fastaccess.ui.modules.main.MainActivity; import com.fastaccess.ui.modules.settings.LanguageBottomSheetDialog; -import com.miguelbcr.io.rx_billing_service.RxBillingService; -import com.miguelbcr.io.rx_billing_service.entities.ProductType; -import com.miguelbcr.io.rx_billing_service.entities.Purchase; import java.util.Arrays; import java.util.Locale; @@ -43,7 +38,6 @@ import butterknife.OnClick; import butterknife.OnEditorAction; import butterknife.Optional; import es.dmoral.toasty.Toasty; -import io.reactivex.functions.Action; /** * Created by Kosh on 08 Feb 2017, 9:10 PM @@ -215,35 +209,6 @@ public class LoginActivity extends BaseActivity i progress.setVisibility(View.GONE); login.show(); } - - protected void checkPurchases(Action action) { - RxBillingService.getInstance(this, BuildConfig.DEBUG) - .getPurchases(ProductType.IN_APP) - .doOnSubscribe(disposable -> showProgress(0)) - .subscribe((purchases, throwable) -> { - hideProgress(); - if (throwable == null) { - Logger.e(purchases); - if (purchases != null && !purchases.isEmpty()) { - for (Purchase purchase : purchases) { - String sku = purchase.sku(); - if (sku != null) { - Logger.e(sku); - if (sku.equalsIgnoreCase(getString(R.string.donation_product_1))) { - PrefGetter.enableAmlodTheme(); - } else { - PrefGetter.setProItems(); - } - } - } - } - } else { - throwable.printStackTrace(); - } - action.run(); - }); - } - private void showLanguage() { LanguageBottomSheetDialog languageBottomSheetDialog = new LanguageBottomSheetDialog(); languageBottomSheetDialog.onAttach((Context) this); diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/MainActivity.java b/app/src/main/java/com/fastaccess/ui/modules/main/MainActivity.java index 96070344..bff504cc 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/MainActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/MainActivity.java @@ -10,6 +10,7 @@ import android.support.v4.view.GravityCompat; import android.view.Menu; import android.view.MenuItem; +import com.evernote.android.state.State; import com.fastaccess.R; import com.fastaccess.data.dao.model.Notification; import com.fastaccess.helper.BundleConstant; @@ -25,7 +26,6 @@ import com.fastaccess.ui.modules.settings.SlackBottomSheetDialog; import butterknife.BindView; import butterknife.OnClick; -import com.evernote.android.state.State; import it.sephiroth.android.library.bottomnavigation.BottomNavigation; import shortbread.Shortcut; @@ -64,6 +64,7 @@ public class MainActivity extends BaseActivity impl if (getIntent() != null && getIntent().getBooleanExtra(SlackBottomSheetDialog.TAG, false)) { new SlackBottomSheetDialog().show(getSupportFragmentManager(), SlackBottomSheetDialog.TAG); } + checkPurchases(null); } selectHome(false); hideShowShadow(navType == MainMvp.FEEDS); diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonateActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonateActivity.kt index ca538a7a..4cf2f08c 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonateActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonateActivity.kt @@ -58,6 +58,8 @@ class DonateActivity : BaseActivity(), ProfileEvents.View { - val recycler: DynamicRecyclerView by lazy { view!!.findViewById(R.id.recycler) } - val refresh: SwipeRefreshLayout by lazy { view!!.findViewById(R.id.refresh) } - val stateLayout: StateLayout by lazy { view!!.findViewById(R.id.stateLayout) } + val recycler: DynamicRecyclerView by lazy { view!!.findViewById(R.id.recycler) as DynamicRecyclerView } + val refresh: SwipeRefreshLayout by lazy { view!!.findViewById(R.id.refresh) as SwipeRefreshLayout } + val stateLayout: StateLayout by lazy { view!!.findViewById(R.id.stateLayout) as StateLayout } val adapter by lazy { FeedsAdapter(presenter.getEvents(), true) } private var onLoadMore: OnLoadMore? = null diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java index e1328646..9b609ac9 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewFragment.java @@ -9,6 +9,8 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; +import android.support.transition.AutoTransition; +import android.support.transition.Transition; import android.support.transition.TransitionManager; import android.support.v4.widget.NestedScrollView; import android.support.v7.widget.CardView; @@ -38,7 +40,6 @@ import com.fastaccess.ui.modules.profile.ProfilePagerMvp; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.SpannableBuilder; -import com.fastaccess.ui.widgets.contributions.ContributionsDay; import com.fastaccess.ui.widgets.contributions.GitHubContributionsView; import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView; import com.fastaccess.ui.widgets.recyclerview.layout_manager.GridManager; @@ -128,7 +129,6 @@ public class ProfileOverviewFragment extends BaseFragment items) { - if (items != null && !items.isEmpty()) { - contributionView.onResponse(items); - contributionCard.setVisibility(VISIBLE); - contributionsCaption.setVisibility(VISIBLE); - } else { - contributionCard.setVisibility(GONE); - contributionsCaption.setVisibility(GONE); + @Override public void onInitContributions(boolean show) { + if (show) { + contributionView.onResponse(); } + contributionCard.setVisibility(show ? VISIBLE : GONE); + contributionsCaption.setVisibility(show ? VISIBLE : GONE); } @Override public void onInitOrgs(@Nullable List orgs) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewMvp.java b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewMvp.java index 9af84dd0..18d8fbd4 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewMvp.java @@ -8,6 +8,7 @@ import android.support.annotation.Nullable; import com.fastaccess.data.dao.model.User; import com.fastaccess.ui.base.mvp.BaseMvp; import com.fastaccess.ui.widgets.contributions.ContributionsDay; +import com.fastaccess.ui.widgets.contributions.GitHubContributionsView; import java.util.ArrayList; import java.util.List; @@ -23,7 +24,7 @@ public interface ProfileOverviewMvp { void invalidateFollowBtn(); - void onInitContributions(@Nullable List items); + void onInitContributions(boolean show); void onInitOrgs(@Nullable List orgs); @@ -50,6 +51,8 @@ public interface ProfileOverviewMvp { void onSendUserToView(@Nullable User userModel); + void onLoadContributionWidget(@NonNull GitHubContributionsView view); + @NonNull ArrayList getOrgs(); @NonNull ArrayList getContributions(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java index 0b80b392..f9b2294c 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/overview/ProfileOverviewPresenter.java @@ -1,5 +1,6 @@ package com.fastaccess.ui.modules.profile.overview; +import android.graphics.Bitmap; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -14,8 +15,10 @@ import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import com.fastaccess.ui.widgets.contributions.ContributionsDay; import com.fastaccess.ui.widgets.contributions.ContributionsProvider; +import com.fastaccess.ui.widgets.contributions.GitHubContributionsView; import java.util.ArrayList; +import java.util.List; import io.reactivex.Observable; @@ -89,7 +92,6 @@ class ProfileOverviewPresenter extends BasePresenter im if (userModel.getType() != null && userModel.getType().equalsIgnoreCase("user")) { onCheckFollowStatus(login); } - loadContributions(); } }); } @@ -107,6 +109,21 @@ class ProfileOverviewPresenter extends BasePresenter im sendToView(view -> view.onInitViews(userModel)); } + @Override public void onLoadContributionWidget(@NonNull GitHubContributionsView gitHubContributionsView) { + if (contributions == null || contributions.isEmpty()) { + String url = String.format(URL, login); + manageDisposable(RxHelper.getObserver(RestProvider.getContribution().getContributions(url)) + .flatMap(s -> Observable.just(new ContributionsProvider().getContributions(s))) + .subscribe(lists -> { + contributions.clear(); + contributions.addAll(lists); + loadContributions(contributions, gitHubContributionsView); + }, Throwable::printStackTrace)); + } else { + loadContributions(contributions, gitHubContributionsView); + } + } + @NonNull @Override public ArrayList getOrgs() { return userOrgs; } @@ -119,15 +136,11 @@ class ProfileOverviewPresenter extends BasePresenter im return login; } - private void loadContributions() { - String url = String.format(URL, login); - manageDisposable(RxHelper.getObserver(RestProvider.getContribution().getContributions(url)) - .flatMap(s -> Observable.just(new ContributionsProvider().getContributions(s))) - .subscribe(lists -> { - contributions.clear(); - contributions.addAll(lists); - sendToView(view -> view.onInitContributions(contributions)); - }, Throwable::printStackTrace)); + private void loadContributions(ArrayList contributions, GitHubContributionsView gitHubContributionsView) { + List filter = gitHubContributionsView.getLastContributions(contributions); + Observable bitmapObservable = Observable.just(gitHubContributionsView.drawOnCanvas(filter, contributions)); + manageObservable(bitmapObservable + .doOnNext(bitmap -> sendToView(view -> view.onInitContributions(bitmap != null)))); } private void loadOrgs() { @@ -141,4 +154,5 @@ class ProfileOverviewPresenter extends BasePresenter im sendToView(view -> view.onInitOrgs(userOrgs)); }, Throwable::printStackTrace)); } + } \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFilterBottomSheetDialog.java b/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFilterBottomSheetDialog.java index c6377d17..5ec43ef7 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFilterBottomSheetDialog.java +++ b/app/src/main/java/com/fastaccess/ui/modules/profile/repos/ProfileReposFilterBottomSheetDialog.java @@ -41,9 +41,12 @@ public class ProfileReposFilterBottomSheetDialog extends BaseBottomSheetDialog { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - ArrayAdapter typesAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, currentFilterOptions.getTypesList()); - ArrayAdapter sortOptionsAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, currentFilterOptions.getSortOptionList()); - ArrayAdapter sortDirectionAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, currentFilterOptions.getSortDirectionList()); + ArrayAdapter typesAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, currentFilterOptions.getTypesList + ()); + ArrayAdapter sortOptionsAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, currentFilterOptions + .getSortOptionList()); + ArrayAdapter sortDirectionAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, currentFilterOptions + .getSortDirectionList()); typeSelectionSpinner.setAdapter(typesAdapter); sortSelectionSpinner.setAdapter(sortOptionsAdapter); sortDirectionSpinner.setAdapter(sortDirectionAdapter); @@ -104,8 +107,7 @@ public class ProfileReposFilterBottomSheetDialog extends BaseBottomSheetDialog { sortSelectionSpinner.setSelection(0); } - @Override - public void dismiss() { + @Override public void dismiss() { currentFilterOptions = null; super.dismiss(); } @@ -116,8 +118,11 @@ public class ProfileReposFilterBottomSheetDialog extends BaseBottomSheetDialog { public interface ProfileReposFilterChangeListener { void onFilterApply(); + void onTypeSelected(String selectedType); + void onSortOptionSelected(String selectedSortOption); + void onSortDirectionSelected(String selectedSortDirection); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java index ad2512fb..e3f3dbfb 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java @@ -501,6 +501,12 @@ public class RepoPagerActivity extends BaseActivity implements Rep @Override public void onMenuItemSelect(@IdRes int id, int position, boolean fromUser) { if (id == R.id.issues && (getRepo() != null && !getRepo().isHasIssues())) { - sendToView(view -> view.showMessage(R.string.error, R.string.repo_issues_is_disabled)); + sendToView(RepoPagerMvp.View::disableIssueTab); return; } if (getView() != null && isViewAttached() && fromUser) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerFragment.java index 1d8061f7..ddf9019b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/prettifier/ViewerFragment.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; +import android.support.design.widget.AppBarLayout; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -16,12 +17,14 @@ import com.fastaccess.helper.ActivityHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; +import com.fastaccess.helper.Logger; import com.fastaccess.helper.PrefGetter; import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.widgets.StateLayout; import com.prettifier.pretty.PrettifyWebView; import butterknife.BindView; +import it.sephiroth.android.library.bottomnavigation.BottomNavigation; /** * Created by Kosh on 28 Nov 2016, 9:27 PM @@ -34,6 +37,9 @@ public class ViewerFragment extends BaseFragment= appBarLayout.getTotalScrollRange() && scrolledTop) { + bottomNavigation.setExpanded(false, false); + appBarLayout.setExpanded(false, false); + scrolledTop = false; + } + webView.setNestedScrollingEnabled(scroll < 800); + } + } + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); @@ -154,6 +179,15 @@ public class ViewerFragment extends BaseFragment getPresenter().onHandleIntent(getArguments())); + if (getPresenter().isRepo()) { + appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appbar); + bottomNavigation = (BottomNavigation) getActivity().findViewById(R.id.bottomNavigation); + } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { @@ -188,4 +222,11 @@ public class ViewerFragment extends BaseFragment implements ViewerMvp throwable.printStackTrace(); int code = RestProvider.getErrorCode(throwable); if (code == 404) { - sendToView(view -> view.onShowError(isRepo ? R.string.no_readme_found : R.string.no_file_found)); + if (!isRepo) { + sendToView(view -> view.onShowError(R.string.no_file_found)); + } } else { if (code == 406) { sendToView(view -> view.openUrl(url)); diff --git a/app/src/main/java/com/fastaccess/ui/modules/theme/ThemeActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/theme/ThemeActivity.kt index cf30c4a2..5a55de47 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/theme/ThemeActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/theme/ThemeActivity.kt @@ -8,7 +8,7 @@ import android.os.Bundle import android.support.v4.view.ViewPager import android.view.View import android.view.ViewAnimationUtils -import butterknife.bindView +import com.fastaccess.ui.widgets.bindView import com.fastaccess.R import com.fastaccess.data.dao.FragmentPagerAdapterModel import com.fastaccess.helper.PrefGetter diff --git a/app/src/main/java/com/fastaccess/ui/modules/theme/fragment/ThemeFragment.kt b/app/src/main/java/com/fastaccess/ui/modules/theme/fragment/ThemeFragment.kt index 014259fc..ae60a3d8 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/theme/fragment/ThemeFragment.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/theme/fragment/ThemeFragment.kt @@ -23,8 +23,8 @@ import com.fastaccess.ui.widgets.SpannableBuilder class ThemeFragment : BaseFragment(), ThemeFragmentMvp.View { - val apply: FloatingActionButton by lazy { view!!.findViewById(R.id.apply) } - val toolbar: Toolbar by lazy { view!!.findViewById(R.id.toolbar) } + val apply: FloatingActionButton by lazy { view!!.findViewById(R.id.apply) as FloatingActionButton } + val toolbar: Toolbar by lazy { view!!.findViewById(R.id.toolbar) as Toolbar } private var primaryDarkColor: Int = 0 private var theme: Int = 0 @@ -46,22 +46,7 @@ class ThemeFragment : BaseFragment { - PrefHelper.set("appTheme", getString(R.string.light_theme_mode)) - themeListener?.onThemeApplied() - } - R.style.ThemeDark -> { - PrefHelper.set("appTheme", getString(R.string.dark_theme_mode)) - themeListener?.onThemeApplied() - } - else -> if (PrefGetter.isAmlodEnabled() || PrefGetter.isProEnabled()) { - PrefHelper.set("appTheme", getString(R.string.amlod_theme_mode)) - themeListener?.onThemeApplied() - } else { - DonateActivity.Companion.start(this, getString(R.string.amlod_theme_purchase)) - } - } + setTheme() } if (isPremiumTheme()) { toolbar.title = SpannableBuilder.builder().foreground(getString(R.string.premium_theme), Color.RED) @@ -69,8 +54,6 @@ class ThemeFragment : BaseFragment { + PrefHelper.set("appTheme", getString(R.string.light_theme_mode)) + themeListener?.onThemeApplied() + } + R.style.ThemeDark -> { + PrefHelper.set("appTheme", getString(R.string.dark_theme_mode)) + themeListener?.onThemeApplied() + } + R.style.ThemeAmlod -> { + if (PrefGetter.isAmlodEnabled() || PrefGetter.isProEnabled()) { + PrefHelper.set("appTheme", getString(R.string.amlod_theme_mode)) + themeListener?.onThemeApplied() + } else { + DonateActivity.start(this, getString(R.string.amlod_theme_purchase)) + } + } + R.style.ThemeMidNighBlue -> { + if (PrefGetter.isAmlodEnabled() || PrefGetter.isProEnabled()) { + PrefHelper.set("appTheme", getString(R.string.mid_night_blue_theme_mode)) + themeListener?.onThemeApplied() + } else { + DonateActivity.start(this, getString(R.string.midnight_blue_theme_purchase)) + } + } + } + } + + private fun isPremiumTheme(): Boolean = theme == R.style.ThemeAmlod || theme == R.style.ThemeMidNighBlue + } diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt index be1c50d7..7e8557e5 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt @@ -9,7 +9,6 @@ import android.view.Gravity import android.view.Menu import android.view.MenuItem import android.widget.TextView -import butterknife.bindView import com.evernote.android.state.State import com.fastaccess.R import com.fastaccess.helper.BundleConstant @@ -18,6 +17,7 @@ import com.fastaccess.helper.Logger import com.fastaccess.ui.base.BaseActivity import com.fastaccess.ui.modules.main.MainActivity import com.fastaccess.ui.modules.trending.fragment.TrendingFragment +import com.fastaccess.ui.widgets.bindView /** diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt index a7fabeec..af7dbd9e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt @@ -3,7 +3,6 @@ package com.fastaccess.ui.modules.trending.fragment import android.os.Bundle import android.support.v4.widget.SwipeRefreshLayout import android.view.View -import butterknife.bindView import com.evernote.android.state.State import com.fastaccess.R import com.fastaccess.data.dao.TrendingModel @@ -18,9 +17,9 @@ import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView class TrendingFragment : BaseFragment(), TrendingFragmentMvp.View { - val recycler: DynamicRecyclerView by lazy { view!!.findViewById(R.id.recycler) } - val refresh: SwipeRefreshLayout by lazy { view!!.findViewById(R.id.refresh) } - val stateLayout: StateLayout by lazy { view!!.findViewById(R.id.stateLayout) } + val recycler: DynamicRecyclerView by lazy { view!!.findViewById(R.id.recycler) as DynamicRecyclerView } + val refresh: SwipeRefreshLayout by lazy { view!!.findViewById(R.id.refresh) as SwipeRefreshLayout } + val stateLayout: StateLayout by lazy { view!!.findViewById(R.id.stateLayout) as StateLayout } val adapter by lazy { TrendingAdapter(presenter.getTendingList()) } @State var lang: String = "" diff --git a/app/src/main/java/com/fastaccess/ui/widgets/ButterKnife.kt b/app/src/main/java/com/fastaccess/ui/widgets/ButterKnife.kt new file mode 100644 index 00000000..00a7c25d --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/widgets/ButterKnife.kt @@ -0,0 +1,130 @@ +package com.fastaccess.ui.widgets + +import android.app.Activity +import android.app.Dialog +import android.app.DialogFragment +import android.app.Fragment +import android.support.v7.widget.RecyclerView.ViewHolder +import android.view.View +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty +import android.support.v4.app.DialogFragment as SupportDialogFragment +import android.support.v4.app.Fragment as SupportFragment + +public fun View.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun Activity.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun Dialog.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun DialogFragment.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun android.support.v4.app.DialogFragment.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun Fragment.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun android.support.v4.app.Fragment.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) +public fun ViewHolder.bindView(id: Int) + : ReadOnlyProperty = required(id, viewFinder) + +public fun View.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun Activity.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun Dialog.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun DialogFragment.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun android.support.v4.app.DialogFragment.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun Fragment.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun android.support.v4.app.Fragment.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) +public fun ViewHolder.bindOptionalView(id: Int) + : ReadOnlyProperty = optional(id, viewFinder) + +public fun View.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun Activity.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun Dialog.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun DialogFragment.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun android.support.v4.app.DialogFragment.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun Fragment.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun android.support.v4.app.Fragment.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) +public fun ViewHolder.bindViews(vararg ids: Int) + : ReadOnlyProperty> = required(ids, viewFinder) + +public fun View.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun Activity.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun Dialog.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun DialogFragment.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun android.support.v4.app.DialogFragment.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun Fragment.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun android.support.v4.app.Fragment.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) +public fun ViewHolder.bindOptionalViews(vararg ids: Int) + : ReadOnlyProperty> = optional(ids, viewFinder) + +private val View.viewFinder: View.(Int) -> View? + get() = { findViewById(it) } +private val Activity.viewFinder: Activity.(Int) -> View? + get() = { findViewById(it) } +private val Dialog.viewFinder: Dialog.(Int) -> View? + get() = { findViewById(it) } +private val DialogFragment.viewFinder: DialogFragment.(Int) -> View? + get() = { dialog.findViewById(it) } +private val android.support.v4.app.DialogFragment.viewFinder: android.support.v4.app.DialogFragment.(Int) -> View? + get() = { dialog.findViewById(it) } +private val Fragment.viewFinder: Fragment.(Int) -> View? + get() = { view.findViewById(it) } +private val android.support.v4.app.Fragment.viewFinder: android.support.v4.app.Fragment.(Int) -> View? + get() = { view!!.findViewById(it) } +private val ViewHolder.viewFinder: ViewHolder.(Int) -> View? + get() = { itemView.findViewById(it) } + +private fun viewNotFound(id:Int, desc: KProperty<*>): Nothing = + throw IllegalStateException("View ID $id for '${desc.name}' not found.") + +@Suppress("UNCHECKED_CAST") +private fun required(id: Int, finder: T.(Int) -> View?) + = Lazy { t: T, desc -> t.finder(id) as V? ?: viewNotFound(id, desc) } + +@Suppress("UNCHECKED_CAST") +private fun optional(id: Int, finder: T.(Int) -> View?) + = Lazy { t: T, desc -> t.finder(id) as V? } + +@Suppress("UNCHECKED_CAST") +private fun required(ids: IntArray, finder: T.(Int) -> View?) + = Lazy { t: T, desc -> ids.map { t.finder(it) as V? ?: viewNotFound(it, desc) } } + +@Suppress("UNCHECKED_CAST") +private fun optional(ids: IntArray, finder: T.(Int) -> View?) + = Lazy { t: T, desc -> ids.map { t.finder(it) as V? }.filterNotNull() } + +// Like Kotlin's lazy delegate but the initializer gets the target and metadata passed to it +private class Lazy(private val initializer: (T, KProperty<*>) -> V) : ReadOnlyProperty { + private object EMPTY + private var value: Any? = EMPTY + + override fun getValue(thisRef: T, property: KProperty<*>): V { + if (value == EMPTY) { + value = initializer(thisRef, property) + } + @Suppress("UNCHECKED_CAST") + return value as V + } +} diff --git a/app/src/main/java/com/fastaccess/ui/widgets/ColorPickerPreference.java b/app/src/main/java/com/fastaccess/ui/widgets/ColorPickerPreference.java new file mode 100644 index 00000000..93958ebd --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/widgets/ColorPickerPreference.java @@ -0,0 +1,115 @@ +package com.fastaccess.ui.widgets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.PorterDuff; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceViewHolder; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.widget.Button; +import android.widget.TextView; + +import com.fastaccess.R; +import com.fastaccess.helper.PrefGetter; +import com.fastaccess.helper.ViewHelper; + +import java.util.ArrayList; +import java.util.HashMap; + +import petrov.kristiyan.colorpicker.ColorPicker; + +/** + * Created by Hamad on 6/11/17. + */ + +public class ColorPickerPreference extends Preference implements ColorPicker.OnChooseColorListener { + + private ColorPicker colorPicker; + + public ColorPickerPreference(Context context) { + super(context); + init(); + } + + public ColorPickerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(); + } + + public ColorPickerPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + public ColorPickerPreference(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + private void init() { + setWidgetLayoutResource(R.layout.preference_widget_color); + } + + @Override + protected void onClick() { + super.onClick(); + + int selected_color = getSelected_color(); + String title = String.format("Accent Color: (Currently: %s)", getSelected_color_name()); + colorPicker = new ColorPicker(getContext()); + colorPicker.setRoundColorButton(true); + colorPicker.setColors(R.array.theme_colors_hex); + colorPicker.setDefaultColorButton(selected_color); + colorPicker.setTitle(title); + TextView title_tv = (TextView) colorPicker.getDialogViewLayout().findViewById(R.id.title); + title_tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + colorPicker.getPositiveButton().setTextColor(ViewHelper.getAccentColor(getContext())); + colorPicker.getNegativeButton().setTextColor(ViewHelper.getPrimaryTextColor(getContext())); + colorPicker.setOnChooseColorListener(this); + colorPicker.show(); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + final Button colorButton = (Button) holder.findViewById(R.id.color); + colorButton.setBackgroundResource(R.drawable.circle_shape); + colorButton.getBackground().setColorFilter(getSelected_color(), PorterDuff.Mode.SRC_IN); + } + + private int getSelected_color() { + TypedArray colorTypedArray = getContext().getResources().obtainTypedArray(R.array.theme_colors_hex); + String[] colorNames = getContext().getResources().getStringArray(R.array.theme_colors); + + ArrayList colors = new ArrayList<>(); + for (int i = 0; i < colorTypedArray.length(); i++) { + colors.add(colorTypedArray.getColor(i, 0)); + } + colorTypedArray.recycle(); + HashMap preferenceValueToColor = new HashMap<>(); + + for(int i=0; i contributions; - private List contributionsFilter; private Rect rect; private Paint monthTextPaint; private Matrix matrix = new Matrix(); private Paint paint = new Paint(); private Paint blockPaint; + private Bitmap bitmap = null; + private int height; + private Point point = new Point(); public GitHubContributionsView(Context context) { super(context); @@ -75,7 +65,7 @@ public class GitHubContributionsView extends View { } private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - + ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point); final TypedArray attributes = context.getTheme().obtainStyledAttributes( attrs, R.styleable.GitHubContributionsView, defStyleAttr, defStyleRes); initAttributes(attributes); @@ -255,59 +245,31 @@ public class GitHubContributionsView extends View { * Clean de component. */ public void clearContribution() { - this.contributions = null; + bitmap = null; invalidate(); } - public void onResponse(List contributionsDay) { - this.contributions = contributionsDay; - contributionsFilter = getLastContributions(contributions, lastWeeks); + public void onResponse() { + adjustHeight(height); invalidate(); } - @Override protected Parcelable onSaveInstanceState() { - final Bundle bundle = new Bundle(); - bundle.putParcelable(INSTANCE_STATE, super.onSaveInstanceState()); - bundle.putInt(INSTANCE_BASE_COLOR, baseColor); - bundle.putInt(INSTANCE_BASE_EMPTY_COLOR, baseEmptyColor); - bundle.putInt(INSTANCE_BACKGROUND_BASE_COLOR, backgroundBaseColor); - bundle.putInt(INSTANCE_TEXT_COLOR, textColor); - bundle.putBoolean(INSTANCE_DISPLAY_MONTH, displayMonth); - bundle.putInt(INSTANCE_LAST_WEEKS, lastWeeks); - bundle.putString(INSTANCE_USERNAME, username); - return bundle; - } - - @Override protected void onRestoreInstanceState(Parcelable state) { - if (state instanceof Bundle) { - final Bundle bundle = (Bundle) state; - baseColor = bundle.getInt(INSTANCE_BASE_COLOR); - backgroundBaseColor = bundle.getInt(INSTANCE_BACKGROUND_BASE_COLOR); - textColor = bundle.getInt(INSTANCE_TEXT_COLOR); - displayMonth = bundle.getBoolean(INSTANCE_DISPLAY_MONTH); - lastWeeks = bundle.getInt(INSTANCE_LAST_WEEKS); - username = bundle.getString(INSTANCE_USERNAME); - super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATE)); - return; - } - super.onRestoreInstanceState(state); - } - @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - if (contributions != null) { - canvas.drawBitmap(drawOnCanvas(canvas), matrix, paint); + if (bitmap != null) { + canvas.drawBitmap(bitmap, matrix, paint); } else { drawPlaceholder(canvas); } } - Bitmap bitmap = null; - - private Bitmap drawOnCanvas(Canvas canvas) { + public Bitmap drawOnCanvas(List contributionsFilter, List contributions) { + if ((contributionsFilter == null || contributions == null) || (contributionsFilter.isEmpty() || contributions.isEmpty())) { + return null; + } if (bitmap == null) { - canvas.getClipBounds(rect); - int width = rect.width(); + int padding = getResources().getDimensionPixelSize(R.dimen.spacing_large); + int width = point.x - padding; int verticalBlockNumber = 7; int horizontalBlockNumber = getHorizontalBlockNumber(contributionsFilter.size(), verticalBlockNumber); float marginBlock = (1.0F - 0.1F); @@ -337,18 +299,16 @@ public class GitHubContributionsView extends View { // another column x += blockWidth + spaceWidth; y = topMargin + monthTextHeight; - if (DatesUtils.isFirstWeekOfMount(day.year, day.month, day.day + 1)) { - canvas1.drawText( - DatesUtils.getShortMonthName(day.year, day.month, day.day + 1), - x, monthTextHeight, monthTextPaint); + canvas1.drawText(DatesUtils.getShortMonthName(day.year, day.month, day.day + 1), x, monthTextHeight, + monthTextPaint); } } else { y += blockWidth + spaceWidth; } } - adjustHeight(height); + this.height = height; } return bitmap; } @@ -362,6 +322,7 @@ public class GitHubContributionsView extends View { } private void drawPlaceholder(Canvas canvas) { + if (!isInEditMode()) return; canvas.getClipBounds(rect); int width = rect.width(); @@ -410,15 +371,13 @@ public class GitHubContributionsView extends View { setLayoutParams(ll); } - // Static helpers - private static int getHorizontalBlockNumber(int total, int divider) { + public int getHorizontalBlockNumber(int total, int divider) { boolean isInteger = total % divider == 0; int result = total / divider; return (isInteger) ? result : result + 1; } - private static List getLastContributions(List contributions, - int lastWeeks) { + public List getLastContributions(List contributions) { int lastWeekDays = contributions.size() % 7; int lastDays = (lastWeekDays > 0) ? lastWeekDays + (lastWeeks - 1) * 7 : lastWeeks * 7; return contributions.subList(contributions.size() - lastDays, contributions.size()); diff --git a/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java b/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java index 9e874e69..2d16ea45 100755 --- a/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java +++ b/app/src/main/java/com/prettifier/pretty/PrettifyWebView.java @@ -36,6 +36,8 @@ public class PrettifyWebView extends NestedWebView { public interface OnContentChangedListener { void onContentChanged(int progress); + + void onScrollChanged(boolean reachedTop, int scroll); } public PrettifyWebView(Context context) { @@ -100,6 +102,13 @@ public class PrettifyWebView extends NestedWebView { }); } + @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + if (onContentChangedListener != null) { + onContentChangedListener.onScrollChanged(t == 0, t); + } + } + private boolean hitLinkResult(WebView.HitTestResult result) { return result.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE || result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE; @@ -216,6 +225,6 @@ public class PrettifyWebView extends NestedWebView { startActivity(Uri.parse(url)); return true; } - } + } } \ No newline at end of file diff --git a/app/src/main/res/layouts/main_layouts/layout/title_header_layout.xml b/app/src/main/res/layouts/main_layouts/layout/title_header_layout.xml index a6481c39..7e070f4c 100644 --- a/app/src/main/res/layouts/main_layouts/layout/title_header_layout.xml +++ b/app/src/main/res/layouts/main_layouts/layout/title_header_layout.xml @@ -32,6 +32,7 @@ + + +