releasing 4.5.5

This commit is contained in:
k0shk0sh 2017-11-11 11:26:05 +01:00
parent 630aed3eef
commit 793ffd663e
21 changed files with 300 additions and 142 deletions

View File

@ -29,8 +29,8 @@ android {
applicationId "com.fastaccess.github"
minSdkVersion 21
targetSdkVersion 26
versionCode 453
versionName "4.5.3"
versionCode 455
versionName "4.5.5"
buildConfigString "GITHUB_CLIENT_ID", (buildProperties.secrets['github_client_id'] | buildProperties.notThere['github_client_id']).string
buildConfigString "GITHUB_SECRET", (buildProperties.secrets['github_secret'] | buildProperties.notThere['github_secret']).string
buildConfigString "IMGUR_CLIENT_ID", (buildProperties.secrets['imgur_client_id'] | buildProperties.notThere['imgur_client_id']).string
@ -129,7 +129,7 @@ dependencies {
implementation "com.squareup.retrofit2:retrofit:${retrofit}"
implementation "com.squareup.retrofit2:converter-gson:${retrofit}"
implementation "com.squareup.retrofit2:adapter-rxjava2:${retrofit}"
implementation "com.github.bumptech.glide:glide:3.7.0"
implementation "com.github.bumptech.glide:glide:${glideVersion}"
implementation 'cn.gavinliu.android.lib:ShapedImageView:0.8.3'
implementation "com.jakewharton:butterknife:${butterKnifeVersion}"
implementation 'it.sephiroth.android.library.bottomnavigation:bottom-navigation:2.0.2'
@ -152,6 +152,7 @@ dependencies {
implementation "com.atlassian.commonmark:commonmark-ext-gfm-tables:${commonmark}"
implementation "com.atlassian.commonmark:commonmark-ext-ins:${commonmark}"
implementation "com.atlassian.commonmark:commonmark-ext-yaml-front-matter:${commonmark}"
implementation "com.google.firebase:firebase-core:${gms}"
implementation "com.google.firebase:firebase-messaging:${gms}"
implementation "com.google.firebase:firebase-database:${gms}"
implementation "com.google.android.gms:play-services-base:${gms}"
@ -182,8 +183,8 @@ dependencies {
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:0.5'
androidTestImplementation 'com.android.support.test:rules:0.5'
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}"
}

View File

@ -43,7 +43,7 @@ public class App extends Application {
}
private void init() {
FabricProvider.initFabric(this);
FabricProvider.INSTANCE.initFabric(this);
RxBillingService.register(this);
deleteDatabase("database.db");
getDataStore();

View File

@ -143,22 +143,42 @@ public class Bundler {
}
public Bundler put(@NonNull String key, Parcelable value) {
bundle.putParcelable(key, value);
Bundle safeBundle = new Bundle();
safeBundle.putParcelable(key, value);
if (isValidBundleSize(safeBundle)) {
bundle.putParcelable(key, value);
}
clearBundle(safeBundle);
return this;
}
public Bundler put(@NonNull String key, Parcelable[] value) {
bundle.putParcelableArray(key, value);
Bundle safeBundle = new Bundle();
safeBundle.putParcelableArray(key, value);
if (isValidBundleSize(safeBundle)) {
bundle.putParcelableArray(key, value);
}
clearBundle(safeBundle);
return this;
}
public Bundler putParcelableArrayList(@NonNull String key, ArrayList<? extends Parcelable> value) {
bundle.putParcelableArrayList(key, value);
Bundle safeBundle = new Bundle();
safeBundle.putParcelableArrayList(key, value);
if (isValidBundleSize(safeBundle)) {
bundle.putParcelableArrayList(key, value);
}
clearBundle(safeBundle);
return this;
}
public Bundler putSparseParcelableArray(@NonNull String key, SparseArray<? extends Parcelable> value) {
bundle.putSparseParcelableArray(key, value);
Bundle safeBundle = new Bundle();
safeBundle.putSparseParcelableArray(key, value);
if (isValidBundleSize(safeBundle)) {
bundle.putSparseParcelableArray(key, value);
}
clearBundle(safeBundle);
return this;
}
@ -173,7 +193,12 @@ public class Bundler {
}
public Bundler put(@NonNull String key, Serializable value) {
bundle.putSerializable(key, value);
Bundle safeBundle = new Bundle();
safeBundle.putSerializable(key, value);
if (isValidBundleSize(safeBundle)) {
bundle.putSerializable(key, value);
}
clearBundle(safeBundle);
return this;
}
@ -206,4 +231,9 @@ public class Bundler {
return parcel.dataSize() < 500000;
}
private void clearBundle(Bundle safeBundle) {
safeBundle.clear();
safeBundle = null;
}
}

View File

@ -58,7 +58,8 @@ public class PrefHelper {
}
public static int getInt(@NonNull String key) {
return PreferenceManager.getDefaultSharedPreferences(App.getInstance()).getInt(key, 0);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(App.getInstance());
return preferences.getAll().get(key) instanceof Integer ? preferences.getInt(key, 0) : -1;
}
public static long getLong(@NonNull String key) {

View File

@ -1,33 +0,0 @@
package com.fastaccess.provider.fabric;
import android.content.Context;
import android.support.annotation.NonNull;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.PurchaseEvent;
import com.crashlytics.android.core.CrashlyticsCore;
import com.fastaccess.BuildConfig;
import io.fabric.sdk.android.Fabric;
/**
* Created by kosh on 14/08/2017.
*/
public class FabricProvider {
public static void initFabric(@NonNull Context context) {
Fabric fabric = new Fabric.Builder(context)
.kits(new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build())
.debuggable(BuildConfig.DEBUG)
.build();
Fabric.with(fabric);
}
public static void logPurchase(@NonNull String productKey) {
Answers.getInstance().logPurchase(new PurchaseEvent().putItemName(productKey).putSuccess(true));
}
}

View File

@ -0,0 +1,41 @@
package com.fastaccess.provider.fabric
import android.content.Context
import com.crashlytics.android.Crashlytics
import com.crashlytics.android.answers.Answers
import com.crashlytics.android.answers.PurchaseEvent
import com.crashlytics.android.core.CrashlyticsCore
import com.fastaccess.BuildConfig
import io.fabric.sdk.android.Fabric
import java.math.BigDecimal
/**
* Created by kosh on 14/08/2017.
*/
object FabricProvider {
fun initFabric(context: Context) {
val fabric = Fabric.Builder(context)
.kits(Crashlytics.Builder()
.core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build())
.debuggable(BuildConfig.DEBUG)
.build()
Fabric.with(fabric)
}
fun logPurchase(productKey: String, price: Long? = null, priceText: String? = null) {
val purchaseEvent = PurchaseEvent()
.putItemName(productKey)
.putSuccess(true)
priceText?.let {
purchaseEvent.putItemType(priceText)
}
price?.let {
purchaseEvent.putItemPrice(BigDecimal(price))
}
Answers.getInstance().logPurchase(purchaseEvent)
}
}

View File

@ -276,7 +276,7 @@ public class SchemeParser {
String owner = segments.get(0);
String repoName = segments.get(1);
if (!InputHelper.isEmpty(repoName)) {
repoName = repoName.replace(".git", "");
if (repoName.endsWith(".git")) repoName = repoName.replace(".git", "");
}
if (segments.size() == 3) {
String lastPath = uri.getLastPathSegment();

View File

@ -40,12 +40,14 @@ class DonateActivity : BaseActivity<BaseMvp.FAView, BasePresenter<BaseMvp.FAView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val bundle: Bundle = intent.extras
val productKey: String = bundle.getString(BundleConstant.EXTRA)
val productKey = bundle.getString(BundleConstant.EXTRA)
val price = bundle.getLong(BundleConstant.EXTRA_FOUR, 0)
val priceText = bundle.getString(BundleConstant.EXTRA_FIVE)
subscription = RxHelper.getSingle<Purchase>(RxBillingService.getInstance(this, BuildConfig.DEBUG)
.purchase(ProductType.IN_APP, productKey, "inapp:com.fastaccess.github:" + productKey))
.subscribe({ p: Purchase?, throwable: Throwable? ->
if (throwable == null) {
FabricProvider.logPurchase(productKey)
FabricProvider.logPurchase(productKey, price, priceText)
showMessage(R.string.success, R.string.success_purchase_message)
enableProduct(productKey, applicationContext)
val intent = Intent()
@ -77,18 +79,22 @@ class DonateActivity : BaseActivity<BaseMvp.FAView, BasePresenter<BaseMvp.FAView
}
companion object {
fun start(context: Activity, product: String?) {
fun start(context: Activity, product: String?, price: Long? = 0, priceText: String? = null) {
val intent = Intent(context, DonateActivity::class.java)
intent.putExtras(Bundler.start()
.put(BundleConstant.EXTRA, product)
.put(BundleConstant.EXTRA_FOUR, price)
.put(BundleConstant.EXTRA_FIVE, priceText)
.end())
context.startActivityForResult(intent, BundleConstant.REQUEST_CODE)
}
fun start(context: Fragment, product: String?) {
fun start(context: Fragment, product: String?, price: Long? = 0, priceText: String? = null) {
val intent = Intent(context.context, DonateActivity::class.java)
intent.putExtras(Bundler.start()
.put(BundleConstant.EXTRA, product)
.put(BundleConstant.EXTRA_FOUR, price)
.put(BundleConstant.EXTRA_FIVE, priceText)
.end())
context.startActivityForResult(intent, BundleConstant.REQUEST_CODE)
}

View File

@ -79,7 +79,7 @@ public class DonationActivity extends BaseActivity {
private void onProceed(@NonNull String productKey) {
if (AppHelper.isGoogleAvailable(this)) {
DonateActivity.Companion.start(this, productKey);
DonateActivity.Companion.start(this, productKey, null, null);
} else {
showErrorMessage(getString(R.string.google_play_service_error));
}

View File

@ -4,23 +4,27 @@ import android.animation.Animator
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.transition.TransitionManager
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.TextView
import butterknife.BindView
import butterknife.OnClick
import butterknife.OnEditorAction
import com.airbnb.lottie.LottieAnimationView
import com.fastaccess.BuildConfig
import com.fastaccess.R
import com.fastaccess.helper.AppHelper
import com.fastaccess.helper.InputHelper
import com.fastaccess.helper.PrefGetter
import com.fastaccess.helper.ViewHelper
import com.fastaccess.helper.*
import com.fastaccess.provider.fabric.FabricProvider
import com.fastaccess.ui.base.BaseActivity
import com.fastaccess.ui.modules.main.donation.DonateActivity
import com.miguelbcr.io.rx_billing_service.RxBillingService
import com.miguelbcr.io.rx_billing_service.entities.ProductType
import io.reactivex.Observable
import io.reactivex.disposables.Disposable
/**
* Created by kosh on 13/07/2017.
@ -32,6 +36,13 @@ class PremiumActivity : BaseActivity<PremiumMvp.View, PremiumPresenter>(), Premi
@BindView(R.id.progressLayout) lateinit var progressLayout: View
@BindView(R.id.successActivationView) lateinit var successActivationView: LottieAnimationView
@BindView(R.id.successActivationHolder) lateinit var successActivationHolder: View
@BindView(R.id.proPrice) lateinit var proPriceText: TextView
@BindView(R.id.enterprisePrice) lateinit var enterpriseText: TextView
@BindView(R.id.buyAll) lateinit var buyAll: Button
private var disposable: Disposable? = null
private val allFeaturesKey by lazy { getString(R.string.fasthub_all_features_purchase) }
private val enterpriseKey by lazy { getString(R.string.fasthub_enterprise_purchase) }
private val proKey by lazy { getString(R.string.fasthub_pro_purchase) }
override fun layout(): Int = R.layout.pro_features_layout
@ -45,17 +56,20 @@ class PremiumActivity : BaseActivity<PremiumMvp.View, PremiumPresenter>(), Premi
@OnClick(R.id.buyAll) fun onBuyAll() {
if (!isGoogleSupported()) return
DonateActivity.Companion.start(this, getString(R.string.fasthub_all_features_purchase))
val price = buyAll.tag as? Long?
DonateActivity.Companion.start(this, allFeaturesKey, price, buyAll.text.toString())
}
@OnClick(R.id.buyPro) fun onBuyPro() {
if (!isGoogleSupported()) return
DonateActivity.Companion.start(this, getString(R.string.fasthub_pro_purchase))
val price = proPriceText.tag as? Long?
DonateActivity.Companion.start(this, proKey, price, proPriceText.text.toString())
}
@OnClick(R.id.buyEnterprise) fun onBuyEnterprise() {
if (!isGoogleSupported()) return
DonateActivity.Companion.start(this, getString(R.string.fasthub_enterprise_purchase))
val price = enterpriseText.tag as? Long?
DonateActivity.Companion.start(this, enterpriseKey, price, enterpriseText.text.toString())
}
@OnClick(R.id.unlock) fun onUnlock() {
@ -80,6 +94,32 @@ class PremiumActivity : BaseActivity<PremiumMvp.View, PremiumPresenter>(), Premi
@OnClick(R.id.close) fun onClose() = finish()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
buyAll.text = getString(R.string.purchase_all).replace("%price%", "$7.99")
RxHelper.getObservable(RxBillingService.getInstance(this, BuildConfig.DEBUG)
.getSkuDetails(ProductType.IN_APP, arrayListOf(enterpriseKey, proKey, allFeaturesKey))
.toObservable())
.flatMap { Observable.fromIterable(it) }
.subscribe({
Logger.e(it.sku(), it.price(), it.priceCurrencyCode(), it.priceAmountMicros())
when (it.sku()) {
enterpriseKey -> {
enterpriseText.text = it.price()
enterpriseText.tag = it.priceAmountMicros()
}
proKey -> {
proPriceText.text = it.price()
proPriceText.tag = it.priceAmountMicros()
}
allFeaturesKey -> {
buyAll.text = getString(R.string.purchase_all).replace("%price%", it.price())
buyAll.tag = it.priceAmountMicros()
}
}
}, { t -> t.printStackTrace() })
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
@ -94,6 +134,7 @@ class PremiumActivity : BaseActivity<PremiumMvp.View, PremiumPresenter>(), Premi
}
override fun onSuccessfullyActivated() {
ViewHelper.hideKeyboard(editText)
hideProgress()
successActivationHolder.visibility = View.VISIBLE
FabricProvider.logPurchase(InputHelper.toString(editText))
@ -127,6 +168,12 @@ class PremiumActivity : BaseActivity<PremiumMvp.View, PremiumPresenter>(), Premi
progressLayout.visibility = View.GONE
}
override fun onDestroy() {
val disposable = disposable
if (disposable != null && !disposable.isDisposed) disposable.dispose()
super.onDestroy()
}
private fun isGoogleSupported(): Boolean {
if (AppHelper.isGoogleAvailable(this)) {
return true

View File

@ -27,7 +27,7 @@ class RepoLicenseBottomSheet : BaseMvpBottomSheetDialogFragment<RepoLicenseMvp.V
@BindView(R.id.readmeLoader) lateinit var loader: ProgressBar
@BindView(R.id.webView) lateinit var webView: PrettifyWebView
@BindView(R.id.licenseName) lateinit var licenseName: TextView
override fun providePresenter(): RepoLicensePresenter = RepoLicensePresenter()
override fun onLicenseLoaded(license: String) {
@ -59,6 +59,7 @@ class RepoLicenseBottomSheet : BaseMvpBottomSheetDialogFragment<RepoLicenseMvp.V
}
override fun onContentChanged(progress: Int) {
val loader: ProgressBar? = loader
loader?.let {
it.progress = progress
if (progress == 100) {

View File

@ -258,8 +258,10 @@ class IssuePagerPresenter extends BasePresenter<IssuePagerMvp.View> implements I
}
private void getIssueFromApi() {
Login loginUser = Login.getUser();
if (loginUser == null) return;
makeRestCall(RxHelper.getObservable(Observable.zip(RestProvider.getIssueService(isEnterprise()).getIssue(login, repoId, issueNumber),
RestProvider.getRepoService(isEnterprise()).isCollaborator(login, repoId, Login.getUser().getLogin()),
RestProvider.getRepoService(isEnterprise()).isCollaborator(login, repoId, loginUser.getLogin()),
(issue, booleanResponse) -> {
isCollaborator = booleanResponse.code() == 204;
return issue;

View File

@ -33,7 +33,6 @@ import com.fastaccess.ui.base.BaseFragment;
import com.fastaccess.ui.modules.main.MainActivity;
import com.fastaccess.ui.modules.profile.org.repos.OrgReposFragment;
import com.fastaccess.ui.modules.profile.repos.ProfileReposFragment;
import com.fastaccess.ui.modules.search.SearchUserActivity;
import com.fastaccess.ui.widgets.SpannableBuilder;
import com.fastaccess.ui.widgets.ViewPagerView;
@ -258,6 +257,19 @@ public class UserPagerActivity extends BaseActivity<UserPagerMvp.View, UserPager
return super.onOptionsItemSelected(item);
}
@Override public boolean onPrepareOptionsMenu(Menu menu) {
// final int blockId = 10110;
// MenuItem blockItem;
// if (menu.findItem(blockId) == null) {
// blockItem = menu.add(0, blockId, 0, getString(R.string.block));
// } else {
// blockItem = menu.findItem(blockId);
// }
// blockItem.setIcon(ContextCompat.getDrawable(this, R.drawable.ic_block))
// .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return super.onPrepareOptionsMenu(menu);
}
private void hideShowFab(int position) {
if (isOrg) {
if (getPresenter().getIsMember() == 1) {

View File

@ -93,4 +93,5 @@ public class FontTextView extends AppCompatTextView {
ViewHelper.tintDrawable(drawable, ViewHelper.getTertiaryTextColor(getContext()));
setCompoundDrawablesWithIntrinsicBounds(sd, null, null, null);
}
}

View File

@ -109,6 +109,11 @@ public class PrettifyWebView extends NestedWebView {
}
}
@Override protected void onDetachedFromWindow() {
onContentChangedListener = null;
super.onDetachedFromWindow();
}
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;

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="?icon_color"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM4,12c0,-4.42 3.58,-8 8,-8 1.85,0 3.55,0.63 4.9,1.69L5.69,16.9C4.63,15.55 4,13.85 4,12zM12,20c-1.85,0 -3.55,-0.63 -4.9,-1.69L18.31,7.1C19.37,8.45 20,10.15 20,12c0,4.42 -3.58,8 -8,8z"/>
</vector>

View File

@ -7,106 +7,136 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/window_background"
android:focusableInTouchMode="true"
android:orientation="vertical">
<include layout="@layout/appbar_elevation_dark"/>
<android.support.v7.widget.CardView
android:id="@+id/commitHolder"
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/spacing_micro"
android:layout_marginTop="@dimen/spacing_micro"
app:cardBackgroundColor="?card_background"
app:contentPaddingBottom="@dimen/spacing_normal"
app:contentPaddingLeft="@dimen/spacing_xs_large"
app:contentPaddingRight="@dimen/spacing_xs_large"
app:contentPaddingTop="@dimen/spacing_normal">
android:layout_height="match_parent">
<android.support.design.widget.TextInputLayout
android:id="@+id/description"
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat.Title">
android:elevation="0dp"
android:stateListAnimator="@null"
android:theme="?android:toolbarStyle"
app:elevation="0dp">
<android.support.design.widget.TextInputEditText
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/commit_message"
android:inputType="textMultiLine|textCapSentences"
android:maxLines="3"/>
android:orientation="vertical"
app:layout_scrollFlags="scroll|enterAlways">
</android.support.design.widget.TextInputLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:id="@+id/commitHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/spacing_micro"
android:layout_marginTop="@dimen/spacing_normal"
app:cardBackgroundColor="?card_background"
app:contentPaddingBottom="@dimen/spacing_normal"
app:contentPaddingLeft="@dimen/spacing_xs_large"
app:contentPaddingRight="@dimen/spacing_xs_large"
app:contentPaddingTop="@dimen/spacing_normal">
<android.support.v7.widget.CardView
android:id="@+id/fileNameHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/spacing_micro"
android:layout_marginTop="@dimen/spacing_micro"
app:cardBackgroundColor="?card_background"
app:contentPaddingBottom="@dimen/spacing_normal"
app:contentPaddingLeft="@dimen/spacing_xs_large"
app:contentPaddingRight="@dimen/spacing_xs_large"
app:contentPaddingTop="@dimen/spacing_normal">
<android.support.design.widget.TextInputLayout
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat.Title">
<android.support.design.widget.TextInputLayout
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat.Title">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/commit_message"
android:inputType="textMultiLine|textCapSentences"
android:maxLines="3"/>
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/file_name_hint"
android:inputType="text"
android:maxLines="1"/>
</android.support.design.widget.TextInputLayout>
</android.support.v7.widget.CardView>
</android.support.design.widget.TextInputLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:id="@+id/fileNameHolder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/spacing_micro"
android:layout_marginTop="@dimen/spacing_micro"
app:cardBackgroundColor="?card_background"
app:cardElevation="0dp"
app:contentPaddingBottom="@dimen/spacing_normal"
app:contentPaddingLeft="@dimen/spacing_xs_large"
app:contentPaddingRight="@dimen/spacing_xs_large"
app:contentPaddingTop="@dimen/spacing_normal">
<ScrollView
android:id="@+id/parentView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:clipToPadding="false"
android:fillViewport="true">
<android.support.design.widget.TextInputLayout
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat.Title">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/file_name_hint"
android:inputType="text"
android:maxLines="1"/>
</android.support.design.widget.TextInputLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/scroll_behavior">
<com.fastaccess.ui.widgets.markdown.MarkdownEditText
android:id="@+id/editText"
<com.fastaccess.ui.widgets.markdown.MarkDownLayout
android:id="@+id/markDownLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:gravity="top|start"
android:hint="@string/type_here"
android:inputType="textMultiLine|textCapSentences"
android:minLines="5"
android:padding="@dimen/spacing_xs_large"
android:scrollbars="vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
tools:ignore="ScrollViewSize"/>
android:layout_height="?actionBarSize"
android:background="?card_background"
android:elevation="2dp"
android:orientation="horizontal"
android:outlineProvider="background"/>
<ScrollView
android:id="@+id/parentView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:clipToPadding="false"
android:fillViewport="true"
android:nestedScrollingEnabled="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.fastaccess.ui.widgets.markdown.MarkdownEditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:gravity="top|start"
android:hint="@string/type_here"
android:inputType="textMultiLine|textCapSentences"
android:minLines="5"
android:padding="@dimen/spacing_xs_large"
android:scrollbars="vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
tools:ignore="ScrollViewSize"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
</ScrollView>
<View
android:layout_width="match_parent"
android:layout_height="4dp"
android:background="@drawable/toolbar_shadow_up"/>
<com.fastaccess.ui.widgets.markdown.MarkDownLayout
android:id="@+id/markDownLayout"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:orientation="horizontal"/>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>

View File

@ -6,6 +6,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:orientation="vertical">
<LinearLayout
@ -88,6 +89,7 @@
android:textColor="@color/search_tab_highlighter"/>
<com.fastaccess.ui.widgets.FontTextView
android:id="@+id/enterprisePrice"
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -154,6 +156,7 @@
android:textColor="@color/search_tab_highlighter"/>
<com.fastaccess.ui.widgets.FontTextView
android:id="@+id/proPrice"
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -8,7 +8,7 @@
<body id="preview">
<h2><a id="FastHub_changelog_0"></a>FastHub changelog
</h2>
<h3><a id="Version__420_Create_Edit__Delete_files_make_Commits_2"></a>Version 4.5.3
<h3><a id="Version__420_Create_Edit__Delete_files_make_Commits_2"></a>Version 4.5.5
</h3>
<blockquote>
<p>Please report the issues in FastHub repo instead, by opening the Drawer Menu and clicking on “Report an Issue”<strong>

View File

@ -120,7 +120,7 @@
</blockquote>
]]>
</string>
<string name="purchase_all" translatable="false">Purchase All for ($ 7.99)</string>
<string name="purchase_all" translatable="false" formatted="false">Purchase All for %price%</string>
<string name="unlock" translatable="false">Unlock</string>
<string name="unlock_everything" translatable="false">Unlock Everything</string>
<string name="feeds" translatable="false">Feeds</string>
@ -616,4 +616,5 @@
<string name="disable_loading_image_title">Disable Loading Image</string>
<string name="disable_loading_image_summary">Disable loading image while on data plan</string>
<string name="report_issue_warning">This issue will be submitted to FastHub\'s repo in GitHub</string>
<string name="block">Block</string>
</resources>

View File

@ -2,7 +2,7 @@
buildscript {
ext {
butterKnifeVersion = '8.5.1'
state_version = '1.1.0'
state_version = '1.1.6'
lombokVersion = '1.16.18'
supportVersion = "26.1.0"
gms = "11.4.2"
@ -15,6 +15,7 @@ buildscript {
requery = '1.3.2'
kotlin_version = '1.1.51'
commonmark = '0.10.0'
glideVersion = '3.7.0'
}
repositories {
google()
@ -22,7 +23,7 @@ buildscript {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0-alpha02'
classpath 'com.android.tools.build:gradle:3.1.0-alpha03'
classpath 'com.google.gms:google-services:3.0.0'
classpath 'com.novoda:gradle-build-properties-plugin:0.3'
classpath 'com.dicedmelon.gradle:jacoco-android:0.1.2'