/* == This file is part of Tomahawk Player - <http://tomahawk-player.org> === * * Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com> * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Tomahawk is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>. */ package org.tomahawk.tomahawk_android.fragments; import org.tomahawk.libtomahawk.authentication.AuthenticatorManager; import org.tomahawk.libtomahawk.collection.CollectionManager; import org.tomahawk.libtomahawk.collection.ListItemString; import org.tomahawk.libtomahawk.resolver.HatchetStubResolver; import org.tomahawk.libtomahawk.resolver.PipeLine; import org.tomahawk.libtomahawk.resolver.Resolver; import org.tomahawk.libtomahawk.resolver.ScriptResolver; import org.tomahawk.libtomahawk.resolver.UserCollectionStubResolver; import org.tomahawk.tomahawk_android.R; import org.tomahawk.tomahawk_android.TomahawkApp; import org.tomahawk.tomahawk_android.activities.TomahawkMainActivity; import org.tomahawk.tomahawk_android.adapters.Segment; import org.tomahawk.tomahawk_android.adapters.TomahawkListAdapter; import org.tomahawk.tomahawk_android.dialogs.ConfigDialog; import org.tomahawk.tomahawk_android.dialogs.DirectoryChooserConfigDialog; import org.tomahawk.tomahawk_android.dialogs.GMusicConfigDialog; import org.tomahawk.tomahawk_android.dialogs.HatchetLoginDialog; import org.tomahawk.tomahawk_android.dialogs.ResolverConfigDialog; import org.tomahawk.tomahawk_android.dialogs.ResolverRedirectConfigDialog; import org.tomahawk.tomahawk_android.listeners.MultiColumnClickListener; import android.accounts.Account; import android.accounts.AccountManager; import android.os.Bundle; import android.util.Log; import android.view.View; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * {@link org.tomahawk.tomahawk_android.fragments.TomahawkListFragment} which fakes the standard * {@link android.preference.PreferenceFragment} behaviour. We need to fake it, because the official * support library doesn't provide a {@link android.preference.PreferenceFragment} class */ public class PreferenceConnectFragment extends TomahawkListFragment implements MultiColumnClickListener { private static final String TAG = PreferenceConnectFragment.class.getSimpleName(); @SuppressWarnings("unused") public void onEventMainThread(CollectionManager.UpdatedEvent event) { getListAdapter().notifyDataSetChanged(); } @SuppressWarnings("unused") public void onEventMainThread(AuthenticatorManager.ConfigTestResultEvent event) { getListAdapter().notifyDataSetChanged(); } @SuppressWarnings("unused") public void onEventMainThread(ScriptResolver.EnabledStateChangedEvent event) { getListAdapter().notifyDataSetChanged(); } @SuppressWarnings("unused") public void onEventMainThread(PipeLine.ResolversChangedEvent event) { updateAdapter(); } /** * Called, when this {@link org.tomahawk.tomahawk_android.fragments.PreferenceConnectFragment}'s * {@link android.view.View} has been created */ @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); updateAdapter(); } private void updateAdapter() { List<Segment> segments = new ArrayList<>(); // Add the header text item List<ListItemString> textItems = new ArrayList<>(); textItems.add(new ListItemString(getString(R.string.connect_headertext))); Segment segment = new Segment.Builder(textItems).build(); segments.add(segment); // Add all resolver grid items List<Resolver> resolvers = new ArrayList<>(); resolvers.add(UserCollectionStubResolver.get()); if (mContainerFragmentClass == null || !mContainerFragmentClass.equals(WelcomeFragment.class.getName())) { resolvers.add(HatchetStubResolver.get()); } List<ScriptResolver> scriptResolvers = PipeLine.get().getScriptResolvers(); Collections.sort(scriptResolvers, new Comparator<ScriptResolver>() { @Override public int compare(ScriptResolver lhs, ScriptResolver rhs) { return lhs.getPrettyName().compareToIgnoreCase(rhs.getPrettyName()); } }); for (ScriptResolver scriptResolver : scriptResolvers) { //TODO: Remove this hack once we can get rid of Tomahawk.resolver.instance completely (see ScriptAccount#onWebViewClientReady) if (!scriptResolver.getId().contains("-metadata") && !scriptResolver.getId().equals("echonest") && !scriptResolver.getId().equals("itunes") && !scriptResolver.getScriptAccount().isManuallyInstalled()) { resolvers.add(scriptResolver); } } segment = new Segment.Builder(resolvers) .showAsGrid(R.integer.grid_column_count, R.dimen.padding_superlarge, R.dimen.padding_superlarge) .build(); segments.add(segment); resolvers = new ArrayList<>(); for (ScriptResolver scriptResolver : scriptResolvers) { if (!scriptResolver.getId().contains("-metadata") && scriptResolver.getScriptAccount().isManuallyInstalled()) { resolvers.add(scriptResolver); } } segment = new Segment.Builder(resolvers) .headerLayout(R.layout.single_line_list_header) .headerString(R.string.connect_header_manualresolvers) .showAsGrid(R.integer.grid_column_count, R.dimen.padding_superlarge, R.dimen.padding_superlarge) .build(); segments.add(segment); if (getListView() != null) { if (getListAdapter() == null) { TomahawkListAdapter tomahawkListAdapter = new TomahawkListAdapter( (TomahawkMainActivity) getActivity(), getActivity().getLayoutInflater(), segments, getListView(), this); setListAdapter(tomahawkListAdapter); } else { ((TomahawkListAdapter) getListAdapter()).setSegments(segments, getListView()); } setupNonScrollableSpacer(getListView()); } else { Log.d(TAG, "Couldn't update adapter because getListView() returned null!"); } } @Override public void onItemClick(View view, Object item, Segment segment) { if (item instanceof Resolver) { String id = ((Resolver) item).getId(); ConfigDialog dialog; switch (id) { case TomahawkApp.PLUGINNAME_SPOTIFY: case TomahawkApp.PLUGINNAME_DEEZER: dialog = new ResolverRedirectConfigDialog(); break; case TomahawkApp.PLUGINNAME_USERCOLLECTION: dialog = new DirectoryChooserConfigDialog(); break; case TomahawkApp.PLUGINNAME_HATCHET: dialog = new HatchetLoginDialog(); break; case TomahawkApp.PLUGINNAME_GMUSIC: AccountManager accountManager = AccountManager.get(TomahawkApp.getContext()); Account[] accounts = accountManager.getAccountsByType("com.google"); if (accounts != null && accounts.length > 0) { dialog = new GMusicConfigDialog(); } else { dialog = new ResolverConfigDialog(); } break; default: dialog = new ResolverConfigDialog(); break; } Bundle args = new Bundle(); args.putString(TomahawkFragment.PREFERENCEID, id); dialog.setArguments(args); dialog.show(getFragmentManager(), null); } } @Override public boolean onItemLongClick(View view, Object item, Segment segment) { return false; } }