mirror of
https://github.com/k0shk0sh/FastHub.git
synced 2025-12-08 19:05:54 +00:00
displaying guides on some places of the app and updated readme of what the project made of.
This commit is contained in:
parent
ce8eaa0d65
commit
9904a70f65
25
README.md
25
README.md
@ -3,7 +3,7 @@
|
||||
|
||||

|
||||
|
||||
**FastHub** is yet another <b>open source</b> GitHub client app but unlike any other app, FastHub built from ground up.
|
||||
**FastHub** is yet another **open source** GitHub client app but unlike any other app, FastHub built from ground up.
|
||||
|
||||
|
||||
|
||||
@ -26,6 +26,29 @@
|
||||
- Receive notifications.
|
||||
- Loads more...
|
||||
|
||||
|
||||
# FastHub made of:
|
||||
|
||||
- Min SDK(21) but Appcompat is used all the way.
|
||||
- MVP architecture'd using Thirtyinch lib for the edibility of maintaining and following one structure throughout the project.
|
||||
- Lambda expressions because __you know why__.
|
||||
- RxJava & RxAndroid for Retrofit & Background threads.
|
||||
- Retrofit for consuming rest api.
|
||||
- SqliteMagic for offline mode.
|
||||
- Stream API for dealing with iterations.
|
||||
- JobScheduler using Firebase JobDispatcher for notifications service.
|
||||
- ButterKnife for views binding.
|
||||
- Icepick for saving instance of objects.
|
||||
- Lombok for (getters/setters).
|
||||
- BottomNavigationView for `Fragments` navigation.
|
||||
- UIL for image loading.
|
||||
- AndDown for comments markdown highlighting.
|
||||
- Alerter for displaying error/success messages.
|
||||
- CircleImageView for avatar images.
|
||||
- MatrialTagPrompt for displying guides throughout the app.
|
||||
- Firebase analytics, crash reporting, ads & messaging. (analytics & messaging not yet implemented.)
|
||||
- The mighty Android support libs.
|
||||
|
||||
# Contribution
|
||||
|
||||
You love FastHub? You want new features or bug fixes? Please contribute to the project either by creating PR or submitting an issue ticket.
|
||||
|
||||
@ -117,6 +117,7 @@ dependencies {
|
||||
compile 'com.annimon:stream:1.1.4'
|
||||
compile 'com.commonsware.cwac:anddown:0.3.0'
|
||||
compile 'com.tapadoo.android:alerter:1.0.1'
|
||||
compile 'uk.co.samuelwall:material-tap-target-prompt:1.9.2'
|
||||
apt 'org.projectlombok:lombok:1.12.6'
|
||||
apt 'frankiesardo:icepick-processor:3.1.0'
|
||||
apt 'com.jakewharton:butterknife-compiler:8.4.0'
|
||||
|
||||
@ -2,6 +2,7 @@ package com.fastaccess;
|
||||
|
||||
import android.app.Application;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import com.commonsware.cwac.anddown.AndDown;
|
||||
import com.fastaccess.helper.TypeFaceHelper;
|
||||
@ -27,6 +28,13 @@ public class App extends Application {
|
||||
UILProvider.initUIL(this);
|
||||
TypeFaceHelper.generateTypeface(this);
|
||||
NotificationJobTask.scheduleJob(this);//schedule the job for the notifications
|
||||
if (BuildConfig.DEBUG) {
|
||||
Thread.setDefaultUncaughtExceptionHandler((paramThread, paramThrowable) -> {
|
||||
Log.e("Crash", paramThrowable.getMessage(), paramThrowable);
|
||||
System.exit(2);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@NonNull public static App getInstance() {
|
||||
|
||||
@ -9,6 +9,11 @@ import android.support.annotation.NonNull;
|
||||
public class PrefGetter {
|
||||
private static final String ADS = "enable_ads";
|
||||
private static final String TOKEN = "token";
|
||||
private static final String USER_ICON_GUIDE = "user_icon_guide";
|
||||
private static final String RELEASE_GUIDE = "release_guide";
|
||||
private static final String FILE_OPTION_GUIDE = "file_option_guide";
|
||||
private static final String COMMENTS_GUIDE = "comments_guide";
|
||||
private static final String REPO_GUIDE = "repo_guide";
|
||||
|
||||
public static void setToken(@NonNull String token) {
|
||||
PrefHelper.set(TOKEN, token);
|
||||
@ -29,4 +34,34 @@ public class PrefGetter {
|
||||
public static void clear() {
|
||||
PrefHelper.clearPrefs();
|
||||
}
|
||||
|
||||
public static boolean isUserIconGuideShowed() {
|
||||
boolean isShowed = PrefHelper.getBoolean(USER_ICON_GUIDE);
|
||||
PrefHelper.set(USER_ICON_GUIDE, true);
|
||||
return isShowed;
|
||||
}
|
||||
|
||||
public static boolean isReleaseHintShow() {
|
||||
boolean isShowed = PrefHelper.getBoolean(RELEASE_GUIDE);
|
||||
PrefHelper.set(RELEASE_GUIDE, true);
|
||||
return isShowed;
|
||||
}
|
||||
|
||||
public static boolean isFileOptionHintShow() {
|
||||
boolean isShowed = PrefHelper.getBoolean(FILE_OPTION_GUIDE);
|
||||
PrefHelper.set(FILE_OPTION_GUIDE, true);
|
||||
return isShowed;
|
||||
}
|
||||
|
||||
public static boolean isCommentHintShowed() {
|
||||
boolean isShowed = PrefHelper.getBoolean(COMMENTS_GUIDE);
|
||||
PrefHelper.set(COMMENTS_GUIDE, true);
|
||||
return isShowed;
|
||||
}
|
||||
|
||||
public static boolean isRepoGuideShowed() {
|
||||
boolean isShowed = PrefHelper.getBoolean(REPO_GUIDE);
|
||||
PrefHelper.set(REPO_GUIDE, true);
|
||||
return isShowed;
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,6 +8,7 @@ import com.fastaccess.data.dao.SimpleUrlsModel;
|
||||
import com.fastaccess.provider.rest.loadmore.OnLoadMore;
|
||||
import com.fastaccess.ui.base.mvp.BaseMvp;
|
||||
import com.fastaccess.ui.widgets.dialog.ListDialogView;
|
||||
import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter;
|
||||
import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -18,7 +19,8 @@ import java.util.ArrayList;
|
||||
|
||||
interface FeedsMvp {
|
||||
interface View extends BaseMvp.FAView, SwipeRefreshLayout.OnRefreshListener,
|
||||
android.view.View.OnClickListener, ListDialogView.onSimpleItemSelection<SimpleUrlsModel> {
|
||||
android.view.View.OnClickListener, ListDialogView.onSimpleItemSelection<SimpleUrlsModel>,
|
||||
BaseRecyclerAdapter.GuideListener<EventsModel> {
|
||||
|
||||
void onNotifyAdapter();
|
||||
|
||||
|
||||
@ -6,11 +6,14 @@ import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v4.widget.SwipeRefreshLayout;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.fastaccess.R;
|
||||
import com.fastaccess.data.dao.EventsModel;
|
||||
import com.fastaccess.data.dao.SimpleUrlsModel;
|
||||
import com.fastaccess.helper.Logger;
|
||||
import com.fastaccess.helper.PrefGetter;
|
||||
import com.fastaccess.provider.rest.loadmore.OnLoadMore;
|
||||
import com.fastaccess.provider.scheme.SchemeParser;
|
||||
import com.fastaccess.ui.adapter.FeedsAdapter;
|
||||
@ -22,6 +25,7 @@ import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import butterknife.BindView;
|
||||
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
|
||||
|
||||
/**
|
||||
* Created by Kosh on 11 Nov 2016, 12:36 PM
|
||||
@ -50,6 +54,7 @@ public class FeedsView extends BaseFragment<FeedsMvp.View, FeedsPresenter> imple
|
||||
refresh.setOnRefreshListener(this);
|
||||
recycler.setEmptyView(stateLayout, refresh);
|
||||
adapter = new FeedsAdapter(getPresenter().getEvents());
|
||||
adapter.setGuideListener(this);
|
||||
adapter.setListener(getPresenter());
|
||||
getLoadMore().setCurrent_page(getPresenter().getCurrentPage(), getPresenter().getPreviousTotal());
|
||||
recycler.setAdapter(adapter);
|
||||
@ -113,4 +118,29 @@ public class FeedsView extends BaseFragment<FeedsMvp.View, FeedsPresenter> imple
|
||||
@Override public void onItemSelected(SimpleUrlsModel item) {
|
||||
SchemeParser.launchUri(getContext(), Uri.parse(item.getItem()));
|
||||
}
|
||||
|
||||
@Override public void onShowGuide(@NonNull View itemView, @NonNull EventsModel model) {
|
||||
if (!PrefGetter.isUserIconGuideShowed()) {
|
||||
new MaterialTapTargetPrompt.Builder(getActivity())
|
||||
.setTarget(itemView.findViewById(R.id.avatarLayout))
|
||||
.setPrimaryText(R.string.users)
|
||||
.setSecondaryText(R.string.avatar_click_hint)
|
||||
.setOnHidePromptListener(new MaterialTapTargetPrompt.OnHidePromptListener() {
|
||||
@Override public void onHidePrompt(MotionEvent event, boolean tappedTarget) {
|
||||
|
||||
}
|
||||
|
||||
@Override public void onHidePromptComplete() {
|
||||
new MaterialTapTargetPrompt.Builder(getActivity())
|
||||
.setTarget(itemView)
|
||||
.setPrimaryText(R.string.fork)
|
||||
.setSecondaryText(R.string.feeds_fork_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.show();
|
||||
}
|
||||
})
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ import android.support.annotation.NonNull;
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import com.fastaccess.R;
|
||||
@ -21,6 +22,7 @@ import com.fastaccess.helper.BundleConstant;
|
||||
import com.fastaccess.helper.Bundler;
|
||||
import com.fastaccess.helper.InputHelper;
|
||||
import com.fastaccess.helper.ParseDateFormat;
|
||||
import com.fastaccess.helper.PrefGetter;
|
||||
import com.fastaccess.helper.TypeFaceHelper;
|
||||
import com.fastaccess.ui.base.BaseActivity;
|
||||
import com.fastaccess.ui.modules.repos.code.RepoCodePagerView;
|
||||
@ -37,6 +39,7 @@ import butterknife.OnClick;
|
||||
import hugo.weaving.DebugLog;
|
||||
import icepick.State;
|
||||
import it.sephiroth.android.library.bottomnavigation.BottomNavigation;
|
||||
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
|
||||
|
||||
/**
|
||||
* Created by Kosh on 09 Dec 2016, 4:17 PM
|
||||
@ -176,6 +179,42 @@ public class RepoPagerView extends BaseActivity<RepoPagerMvp.View, RepoPagerPres
|
||||
license.setVisibility(repoModel.getLicense() != null ? View.VISIBLE : View.GONE);
|
||||
if (repoModel.getLicense() != null) license.setText(repoModel.getLicense().getSpdxId());
|
||||
supportInvalidateOptionsMenu();
|
||||
if (!PrefGetter.isRepoGuideShowed()) {
|
||||
new MaterialTapTargetPrompt.Builder(this)
|
||||
.setTarget(watchRepo)
|
||||
.setPrimaryText(R.string.watch)
|
||||
.setSecondaryText(R.string.watch_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.setOnHidePromptListener(new MaterialTapTargetPrompt.OnHidePromptListener() {
|
||||
@Override public void onHidePrompt(MotionEvent event, boolean tappedTarget) {
|
||||
|
||||
}
|
||||
|
||||
@Override public void onHidePromptComplete() {
|
||||
new MaterialTapTargetPrompt.Builder(RepoPagerView.this)
|
||||
.setTarget(starRepo)
|
||||
.setPrimaryText(R.string.star)
|
||||
.setSecondaryText(R.string.star_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.setOnHidePromptListener(new MaterialTapTargetPrompt.OnHidePromptListener() {
|
||||
@Override public void onHidePrompt(MotionEvent event, boolean tappedTarget) {
|
||||
|
||||
}
|
||||
|
||||
@Override public void onHidePromptComplete() {
|
||||
new MaterialTapTargetPrompt.Builder(RepoPagerView.this)
|
||||
.setTarget(forkRepo)
|
||||
.setPrimaryText(R.string.fork)
|
||||
.setSecondaryText(R.string.fork_repo_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.show();
|
||||
}
|
||||
})
|
||||
.show();
|
||||
}
|
||||
})
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onRepoWatched(boolean isWatched) {
|
||||
|
||||
@ -16,6 +16,8 @@ import com.fastaccess.helper.BundleConstant;
|
||||
import com.fastaccess.helper.Bundler;
|
||||
import com.fastaccess.helper.FileHelper;
|
||||
import com.fastaccess.helper.InputHelper;
|
||||
import com.fastaccess.helper.Logger;
|
||||
import com.fastaccess.helper.PrefGetter;
|
||||
import com.fastaccess.provider.markdown.MarkDownProvider;
|
||||
import com.fastaccess.provider.rest.RestProvider;
|
||||
import com.fastaccess.ui.adapter.RepoFilesAdapter;
|
||||
@ -28,6 +30,7 @@ import com.fastaccess.ui.widgets.dialog.MessageDialogView;
|
||||
import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
|
||||
|
||||
import butterknife.BindView;
|
||||
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
|
||||
|
||||
/**
|
||||
* Created by Kosh on 18 Feb 2017, 2:10 AM
|
||||
@ -104,6 +107,23 @@ public class RepoFilesView extends BaseFragment<RepoFilesMvp.View, RepoFilesPres
|
||||
recycler.setAdapter(adapter);
|
||||
}
|
||||
|
||||
@Override public void onHiddenChanged(boolean hidden) {
|
||||
super.onHiddenChanged(hidden);
|
||||
Logger.e(hidden);
|
||||
if (!hidden && adapter != null && isSafe()) {
|
||||
if (!PrefGetter.isFileOptionHintShow()) {
|
||||
adapter.setGuideListener((itemView, model) ->
|
||||
new MaterialTapTargetPrompt.Builder(getActivity())
|
||||
.setTarget(itemView.findViewById(R.id.menu))
|
||||
.setPrimaryText(R.string.options)
|
||||
.setSecondaryText(R.string.click_file_option_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.show());
|
||||
adapter.notifyDataSetChanged();// call it notify the adapter to show the guide immediately.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void showProgress(@StringRes int resId) {
|
||||
refresh.setRefreshing(true);
|
||||
stateLayout.showProgress();
|
||||
|
||||
@ -104,6 +104,12 @@ public class RepoFilePathView extends BaseFragment<RepoFilePathMvp.View, RepoFil
|
||||
return new RepoFilePathPresenter();
|
||||
}
|
||||
|
||||
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
//noinspection ConstantConditions (for this state, it is still null!!!)
|
||||
if (isSafe() && getRepoFilesView() != null) getRepoFilesView().onHiddenChanged(!isVisibleToUser);
|
||||
}
|
||||
|
||||
@NonNull public RepoFilesView getRepoFilesView() {
|
||||
if (repoFilesView == null) {
|
||||
repoFilesView = (RepoFilesView) getChildFragmentManager().findFragmentById(R.id.filesFragment);
|
||||
|
||||
@ -16,6 +16,7 @@ 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.provider.rest.RestProvider;
|
||||
import com.fastaccess.provider.rest.loadmore.OnLoadMore;
|
||||
import com.fastaccess.ui.adapter.ReleasesAdapter;
|
||||
@ -28,6 +29,7 @@ import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import butterknife.BindView;
|
||||
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
|
||||
|
||||
/**
|
||||
* Created by Kosh on 03 Dec 2016, 3:56 PM
|
||||
@ -77,6 +79,22 @@ public class RepoReleasesView extends BaseFragment<RepoReleasesMvp.View, RepoRel
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
if (isVisibleToUser && adapter != null) {
|
||||
if (!PrefGetter.isReleaseHintShow()) {
|
||||
adapter.setGuideListener((itemView, model) ->
|
||||
new MaterialTapTargetPrompt.Builder(getActivity())
|
||||
.setTarget(itemView.findViewById(R.id.download))
|
||||
.setPrimaryText(R.string.download)
|
||||
.setSecondaryText(R.string.click_here_to_download_release_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.show());
|
||||
adapter.notifyDataSetChanged();// call it notify the adapter to show the guide immediately.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull @Override public RepoReleasesPresenter providePresenter() {
|
||||
return new RepoReleasesPresenter();
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@ import com.fastaccess.data.dao.CommentsModel;
|
||||
import com.fastaccess.data.dao.UserModel;
|
||||
import com.fastaccess.helper.BundleConstant;
|
||||
import com.fastaccess.helper.Bundler;
|
||||
import com.fastaccess.helper.PrefGetter;
|
||||
import com.fastaccess.provider.rest.loadmore.OnLoadMore;
|
||||
import com.fastaccess.ui.adapter.CommentsAdapter;
|
||||
import com.fastaccess.ui.base.BaseFragment;
|
||||
@ -23,6 +24,7 @@ import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
|
||||
|
||||
import butterknife.BindView;
|
||||
import retrofit2.Response;
|
||||
import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt;
|
||||
|
||||
/**
|
||||
* Created by Kosh on 11 Nov 2016, 12:36 PM
|
||||
@ -175,4 +177,20 @@ public class IssueCommentsView extends BaseFragment<IssueCommentsMvp.View, Issue
|
||||
getPresenter().onHandleDeletion(bundle);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||
super.setUserVisibleHint(isVisibleToUser);
|
||||
if (isVisibleToUser && adapter != null) {
|
||||
if (!PrefGetter.isCommentHintShowed()) {
|
||||
adapter.setGuideListener((itemView, model) ->
|
||||
new MaterialTapTargetPrompt.Builder(getActivity())
|
||||
.setTarget(itemView.findViewById(R.id.menu))
|
||||
.setPrimaryText(R.string.comment)
|
||||
.setSecondaryText(R.string.comment_hint)
|
||||
.setCaptureTouchEventOutsidePrompt(true)
|
||||
.show());
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package com.fastaccess.ui.widgets.recyclerview;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.fastaccess.helper.AnimHelper;
|
||||
@ -16,10 +17,16 @@ import java.util.List;
|
||||
public abstract class BaseRecyclerAdapter<M, VH extends BaseViewHolder,
|
||||
P extends BaseViewHolder.OnItemClickListener<M>> extends RecyclerView.Adapter<VH> {
|
||||
|
||||
public interface GuideListener<M> {
|
||||
void onShowGuide(@NonNull View itemView, @NonNull M model);
|
||||
}
|
||||
|
||||
@NonNull private List<M> data;
|
||||
@Nullable private P listener;
|
||||
private int lastKnowingPosition = -1;
|
||||
private boolean enableAnimation = true;
|
||||
private boolean showedGuide;
|
||||
private GuideListener guideListener;
|
||||
|
||||
public BaseRecyclerAdapter() {
|
||||
this(new ArrayList<>());
|
||||
@ -57,12 +64,21 @@ public abstract class BaseRecyclerAdapter<M, VH extends BaseViewHolder,
|
||||
@Override public void onBindViewHolder(VH holder, int position) {
|
||||
animate(holder, position);
|
||||
onBindView(holder, position);
|
||||
onShowGuide(holder, position);
|
||||
}
|
||||
|
||||
@Override public int getItemCount() {
|
||||
return data.size();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void onShowGuide(@NonNull VH holder, int position) {// give the flexibility to other adapters to override this
|
||||
if (position == 0 && !isShowedGuide() && guideListener != null) {
|
||||
guideListener.onShowGuide(holder.itemView, getItem(position));
|
||||
showedGuide = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void animate(VH holder, int position) {
|
||||
if (isEnableAnimation() && position > lastKnowingPosition) {
|
||||
AnimHelper.startBeatsAnimation(holder.itemView);
|
||||
@ -145,4 +161,12 @@ public abstract class BaseRecyclerAdapter<M, VH extends BaseViewHolder,
|
||||
this.listener = listener;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setGuideListener(GuideListener guideListener) {
|
||||
this.guideListener = guideListener;
|
||||
}
|
||||
|
||||
public boolean isShowedGuide() {
|
||||
return showedGuide;
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,6 +101,7 @@
|
||||
<string name="error_deleting_comment">Error Deleting Comment</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="comments">Comments</string>
|
||||
<string name="comment">Comment</string>
|
||||
<string name="issue">Issue</string>
|
||||
<string name="merge">Merge</string>
|
||||
<string name="pull_request">Pull Request</string>
|
||||
@ -160,4 +161,15 @@
|
||||
<string name="password">Password</string>
|
||||
<string name="login">Login</string>
|
||||
<string name="gist_description">Gist Description</string>
|
||||
<string name="avatar_click_hint">Whenever there is a User avatar, you can click it to open the User\'s Profile</string>
|
||||
<string name="feeds_fork_hint">Long click on Fork event to choose to open either Original Repo or the Forked Repo.</string>
|
||||
<string name="click_here_to_download_release_hint">Click here to download releases.</string>
|
||||
<string name="options">Options</string>
|
||||
<string name="click_file_option_hint">Click here to download File or share a Directory.</string>
|
||||
<string name="comment_hint">Single tap to tag a user or to edit the comment if you are the author.\nLong press if you are the author of the
|
||||
comment to delete it.</string>
|
||||
<string name="star_hint">Click here to star/unstar repo.</string>
|
||||
<string name="watch">Watch</string>
|
||||
<string name="watch_hint">Click here to watch/unwatch repo.</string>
|
||||
<string name="fork_repo_hint">Click here to fork repo.</string>
|
||||
</resources>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user