Search in sources :

Example 6 with Source

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;
}
Also used : Source(io.plaidapp.data.Source)

Example 7 with Source

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;
}
Also used : SharedPreferences(android.content.SharedPreferences) ArrayList(java.util.ArrayList) Source(io.plaidapp.data.Source)

Example 8 with Source

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();
}
Also used : FilterTouchHelperCallback(io.plaidapp.ui.recyclerview.FilterTouchHelperCallback) Source(io.plaidapp.data.Source) GridItemDividerDecoration(io.plaidapp.ui.recyclerview.GridItemDividerDecoration) ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper) WindowInsets(android.view.WindowInsets) ActivityOptions(android.app.ActivityOptions) ViewGroup(android.view.ViewGroup) Intent(android.content.Intent) DataManager(io.plaidapp.data.DataManager) ImageView(android.widget.ImageView) BindView(butterknife.BindView) View(android.view.View) TextView(android.widget.TextView) RecyclerView(android.support.v7.widget.RecyclerView) GridLayoutManager(android.support.v7.widget.GridLayoutManager) FrameLayout(android.widget.FrameLayout) InfiniteScrollListener(io.plaidapp.ui.recyclerview.InfiniteScrollListener)

Example 9 with Source

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;
    }
}
Also used : ImageView(android.widget.ImageView) BindView(butterknife.BindView) View(android.view.View) TextView(android.widget.TextView) RecyclerView(android.support.v7.widget.RecyclerView) Source(io.plaidapp.data.Source)

Aggregations

Source (io.plaidapp.data.Source)9 RecyclerView (android.support.v7.widget.RecyclerView)2 View (android.view.View)2 ImageView (android.widget.ImageView)2 TextView (android.widget.TextView)2 BindView (butterknife.BindView)2 ArrayList (java.util.ArrayList)2 ActivityOptions (android.app.ActivityOptions)1 Intent (android.content.Intent)1 SharedPreferences (android.content.SharedPreferences)1 GridLayoutManager (android.support.v7.widget.GridLayoutManager)1 ItemTouchHelper (android.support.v7.widget.helper.ItemTouchHelper)1 ViewGroup (android.view.ViewGroup)1 WindowInsets (android.view.WindowInsets)1 FrameLayout (android.widget.FrameLayout)1 DataManager (io.plaidapp.data.DataManager)1 FilterTouchHelperCallback (io.plaidapp.ui.recyclerview.FilterTouchHelperCallback)1 GridItemDividerDecoration (io.plaidapp.ui.recyclerview.GridItemDividerDecoration)1 InfiniteScrollListener (io.plaidapp.ui.recyclerview.InfiniteScrollListener)1 HashSet (java.util.HashSet)1