use of io.plaidapp.data.Source in project plaid by nickbutcher.
the class FilterAdapter method enableFilterByKey.
public void enableFilterByKey(@NonNull String key, @NonNull Context context) {
final int count = filters.size();
for (int i = 0; i < count; i++) {
Source filter = filters.get(i);
if (filter.key.equals(key)) {
if (!filter.active) {
filter.active = true;
notifyItemChanged(i, FilterAnimator.FILTER_ENABLED);
dispatchFiltersChanged(filter);
SourceManager.updateSource(filter, context);
}
return;
}
}
}
use of io.plaidapp.data.Source in project plaid by nickbutcher.
the class FilterAdapter method addFilter.
/**
* Adds a new data source to the list of filters. If the source already exists then it is simply
* activated.
*
* @param toAdd the source to add
* @return whether the filter was added (i.e. if it did not already exist)
*/
public boolean addFilter(Source toAdd) {
// first check if it already exists
final int count = filters.size();
for (int i = 0; i < count; i++) {
Source existing = filters.get(i);
if (existing.getClass() == toAdd.getClass() && existing.key.equalsIgnoreCase(toAdd.key)) {
// already exists, just ensure it's active
if (!existing.active) {
existing.active = true;
dispatchFiltersChanged(existing);
notifyItemChanged(i, FilterAnimator.FILTER_ENABLED);
SourceManager.updateSource(existing, context);
}
return false;
}
}
// didn't already exist, so add it
filters.add(toAdd);
Collections.sort(filters, new Source.SourceComparator());
dispatchFiltersChanged(toAdd);
notifyDataSetChanged();
SourceManager.addSource(toAdd, context);
return true;
}
use of io.plaidapp.data.Source in project plaid by nickbutcher.
the class SourceManager method getSources.
public static List<Source> getSources(Context context) {
SharedPreferences prefs = context.getSharedPreferences(SOURCES_PREF, Context.MODE_PRIVATE);
Set<String> sourceKeys = prefs.getStringSet(KEY_SOURCES, null);
if (sourceKeys == null) {
setupDefaultSources(context, prefs.edit());
return getDefaultSources(context);
}
List<Source> sources = new ArrayList<>(sourceKeys.size());
for (String sourceKey : sourceKeys) {
if (sourceKey.startsWith(Source.DribbbleSearchSource.DRIBBBLE_QUERY_PREFIX)) {
sources.add(new Source.DribbbleSearchSource(sourceKey.replace(Source.DribbbleSearchSource.DRIBBBLE_QUERY_PREFIX, ""), prefs.getBoolean(sourceKey, false)));
} else if (sourceKey.startsWith(Source.DesignerNewsSearchSource.DESIGNER_NEWS_QUERY_PREFIX)) {
sources.add(new Source.DesignerNewsSearchSource(sourceKey.replace(Source.DesignerNewsSearchSource.DESIGNER_NEWS_QUERY_PREFIX, ""), prefs.getBoolean(sourceKey, false)));
} else {
// TODO improve this O(n2) search
sources.add(getSource(context, sourceKey, prefs.getBoolean(sourceKey, false)));
}
}
Collections.sort(sources, new Source.SourceComparator());
return sources;
}
use of io.plaidapp.data.Source in project plaid by nickbutcher.
the class HomeActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
drawer.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
setActionBar(toolbar);
if (savedInstanceState == null) {
animateToolbar();
}
setExitSharedElementCallback(FeedAdapter.createSharedElementReenterCallback(this));
dribbblePrefs = DribbblePrefs.get(this);
designerNewsPrefs = DesignerNewsPrefs.get(this);
filtersAdapter = new FilterAdapter(this, SourceManager.getSources(this), new FilterAdapter.FilterAuthoriser() {
@Override
public void requestDribbbleAuthorisation(View sharedElement, Source forSource) {
Intent login = new Intent(HomeActivity.this, DribbbleLogin.class);
MorphTransform.addExtras(login, ContextCompat.getColor(HomeActivity.this, R.color.background_dark), sharedElement.getHeight() / 2);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(HomeActivity.this, sharedElement, getString(R.string.transition_dribbble_login));
startActivityForResult(login, getAuthSourceRequestCode(forSource), options.toBundle());
}
});
dataManager = new DataManager(this, filtersAdapter) {
@Override
public void onDataLoaded(List<? extends PlaidItem> data) {
adapter.addAndResort(data);
checkEmptyState();
}
};
adapter = new FeedAdapter(this, dataManager, columns, PocketUtils.isPocketInstalled(this));
grid.setAdapter(adapter);
layoutManager = new GridLayoutManager(this, columns);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return adapter.getItemColumnSpan(position);
}
});
grid.setLayoutManager(layoutManager);
grid.addOnScrollListener(toolbarElevation);
grid.addOnScrollListener(new InfiniteScrollListener(layoutManager, dataManager) {
@Override
public void onLoadMore() {
dataManager.loadAllDataSources();
}
});
grid.setHasFixedSize(true);
grid.addItemDecoration(new GridItemDividerDecoration(adapter.getDividedViewHolderClasses(), this, R.dimen.divider_height, R.color.divider));
grid.setItemAnimator(new HomeGridItemAnimator());
// drawer layout treats fitsSystemWindows specially so we have to handle insets ourselves
drawer.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
@Override
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
// inset the toolbar down by the status bar height
ViewGroup.MarginLayoutParams lpToolbar = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams();
lpToolbar.topMargin += insets.getSystemWindowInsetTop();
lpToolbar.leftMargin += insets.getSystemWindowInsetLeft();
lpToolbar.rightMargin += insets.getSystemWindowInsetRight();
toolbar.setLayoutParams(lpToolbar);
// inset the grid top by statusbar+toolbar & the bottom by the navbar (don't clip)
grid.setPadding(// landscape
grid.getPaddingLeft() + insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop() + ViewUtils.getActionBarSize(HomeActivity.this), // landscape
grid.getPaddingRight() + insets.getSystemWindowInsetRight(), grid.getPaddingBottom() + insets.getSystemWindowInsetBottom());
// inset the fab for the navbar
ViewGroup.MarginLayoutParams lpFab = (ViewGroup.MarginLayoutParams) fab.getLayoutParams();
// portrait
lpFab.bottomMargin += insets.getSystemWindowInsetBottom();
// landscape
lpFab.rightMargin += insets.getSystemWindowInsetRight();
fab.setLayoutParams(lpFab);
View postingStub = findViewById(R.id.stub_posting_progress);
ViewGroup.MarginLayoutParams lpPosting = (ViewGroup.MarginLayoutParams) postingStub.getLayoutParams();
// portrait
lpPosting.bottomMargin += insets.getSystemWindowInsetBottom();
// landscape
lpPosting.rightMargin += insets.getSystemWindowInsetRight();
postingStub.setLayoutParams(lpPosting);
// we place a background behind the status bar to combine with it's semi-transparent
// color to get the desired appearance. Set it's height to the status bar height
View statusBarBackground = findViewById(R.id.status_bar_background);
FrameLayout.LayoutParams lpStatus = (FrameLayout.LayoutParams) statusBarBackground.getLayoutParams();
lpStatus.height = insets.getSystemWindowInsetTop();
statusBarBackground.setLayoutParams(lpStatus);
// inset the filters list for the status bar / navbar
// need to set the padding end for landscape case
final boolean ltr = filtersList.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
filtersList.setPaddingRelative(filtersList.getPaddingStart(), filtersList.getPaddingTop() + insets.getSystemWindowInsetTop(), filtersList.getPaddingEnd() + (ltr ? insets.getSystemWindowInsetRight() : 0), filtersList.getPaddingBottom() + insets.getSystemWindowInsetBottom());
// clear this listener so insets aren't re-applied
drawer.setOnApplyWindowInsetsListener(null);
return insets.consumeSystemWindowInsets();
}
});
setupTaskDescription();
filtersList.setAdapter(filtersAdapter);
filtersList.setItemAnimator(new FilterAdapter.FilterAnimator());
filtersAdapter.registerFilterChangedCallback(filtersChangedCallbacks);
dataManager.loadAllDataSources();
ItemTouchHelper.Callback callback = new FilterTouchHelperCallback(filtersAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(filtersList);
checkEmptyState();
}
use of io.plaidapp.data.Source in project plaid by nickbutcher.
the class HomeActivity method onActivityResult.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode) {
case RC_SEARCH:
// reset the search icon which we hid
View searchMenuView = toolbar.findViewById(R.id.menu_search);
if (searchMenuView != null) {
searchMenuView.setAlpha(1f);
}
if (resultCode == SearchActivity.RESULT_CODE_SAVE) {
String query = data.getStringExtra(SearchActivity.EXTRA_QUERY);
if (TextUtils.isEmpty(query))
return;
Source dribbbleSearch = null;
Source designerNewsSearch = null;
boolean newSource = false;
if (data.getBooleanExtra(SearchActivity.EXTRA_SAVE_DRIBBBLE, false)) {
dribbbleSearch = new Source.DribbbleSearchSource(query, true);
newSource = filtersAdapter.addFilter(dribbbleSearch);
}
if (data.getBooleanExtra(SearchActivity.EXTRA_SAVE_DESIGNER_NEWS, false)) {
designerNewsSearch = new Source.DesignerNewsSearchSource(query, true);
newSource |= filtersAdapter.addFilter(designerNewsSearch);
}
if (newSource) {
highlightNewSources(dribbbleSearch, designerNewsSearch);
}
}
break;
case RC_NEW_DESIGNER_NEWS_STORY:
switch(resultCode) {
case PostNewDesignerNewsStory.RESULT_DRAG_DISMISSED:
// need to reshow the FAB as there's no shared element transition
showFab();
unregisterPostStoryResultListener();
break;
case PostNewDesignerNewsStory.RESULT_POSTING:
showPostingProgress();
break;
default:
unregisterPostStoryResultListener();
break;
}
break;
case RC_NEW_DESIGNER_NEWS_LOGIN:
if (resultCode == RESULT_OK) {
showFab();
}
break;
case RC_AUTH_DRIBBBLE_FOLLOWING:
if (resultCode == RESULT_OK) {
filtersAdapter.enableFilterByKey(SourceManager.SOURCE_DRIBBBLE_FOLLOWING, this);
}
break;
case RC_AUTH_DRIBBBLE_USER_LIKES:
if (resultCode == RESULT_OK) {
filtersAdapter.enableFilterByKey(SourceManager.SOURCE_DRIBBBLE_USER_LIKES, this);
}
break;
case RC_AUTH_DRIBBBLE_USER_SHOTS:
if (resultCode == RESULT_OK) {
filtersAdapter.enableFilterByKey(SourceManager.SOURCE_DRIBBBLE_USER_SHOTS, this);
}
break;
}
}
Aggregations