Android Open Source - yammp Query Fragment






From Project

Back to project page yammp.

License

The source code is released under:

GNU Lesser General Public License

If you think the Android project yammp listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 *  YAMMP - Yet Another Multi Media Player for android
 *  Copyright (C) 2011-2012  Mariotaku Lee <mariotaku.lee@gmail.com>
 */*from  ww w  . j  a v  a  2s.  c  o  m*/
 *  This file is part of YAMMP.
 *
 *  YAMMP 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.
 *
 *  YAMMP 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 YAMMP.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.yammp.app;

import org.yammp.Constants;
import org.yammp.R;
import org.yammp.util.MusicUtils;

import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class QueryFragment extends ListFragment implements Constants, LoaderCallbacks<Cursor> {

  private QueryListAdapter mAdapter;

  private String mFilterString = "";
  private Cursor mQueryCursor;
  private ListView mTrackList;

  public QueryFragment() {

  }

  public QueryFragment(Bundle arguments) {
    setArguments(arguments);
  }

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // We have a menu item to show in action bar.
    setHasOptionsMenu(true);

    mAdapter = new QueryListAdapter(getActivity(), R.layout.query_list_item, null,
        new String[] {}, new int[] {}, 0);

    setListAdapter(mAdapter);

    getListView().setOnCreateContextMenuListener(this);

    // Prepare the loader. Either re-connect with an existing one,
    // or start a new one.
    getLoaderManager().initLoader(0, getArguments(), this);

  }

  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    String filter = "";

    if (args != null) {
      filter = args.getString(INTENT_KEY_FILTER) != null ? args.getString(INTENT_KEY_FILTER)
          : "";
    }

    StringBuilder where = new StringBuilder();

    where.append(Audio.Media.IS_MUSIC + "=1");
    where.append(" AND " + Audio.Media.TITLE + " != ''");

    String[] cols = new String[] { BaseColumns._ID, Audio.Media.MIME_TYPE,
        Audio.Artists.ARTIST, Audio.Albums.ALBUM, Audio.Media.TITLE, "data1", "data2" };

    Uri uri = Uri.parse("content://media/external/audio/search/fancy/" + Uri.encode(filter));

    // Now create and return a CursorLoader that will take care of
    // creating a Cursor for the data being displayed.
    return new CursorLoader(getActivity(), uri, cols, where.toString(), null, null);
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.query_browser, container, false);
    return view;
  }

  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {

    // Dialog doesn't allow us to wait for a result, so we need to store
    // the info we need for when the dialog posts its result
    mQueryCursor.moveToPosition(position);
    if (mQueryCursor.isBeforeFirst() || mQueryCursor.isAfterLast()) return;
    String selectedType = mQueryCursor.getString(mQueryCursor
        .getColumnIndexOrThrow(Audio.Media.MIME_TYPE));

    if ("artist".equals(selectedType)) {
      Intent intent = new Intent(Intent.ACTION_PICK);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album");
      intent.putExtra("artist", Long.valueOf(id).toString());
      startActivity(intent);
    } else if ("album".equals(selectedType)) {
      Intent intent = new Intent(Intent.ACTION_PICK);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
      intent.putExtra("album", Long.valueOf(id).toString());
      startActivity(intent);
    } else if (position >= 0 && id >= 0) {
      long[] list = new long[] { id };
      MusicUtils.playAll(getActivity(), list, 0);
    } else {
      Log.e("QueryBrowser", "invalid position/id: " + position + "/" + id);
    }
  }

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.swapCursor(null);
  }

  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

    if (data == null) {
      getActivity().finish();
      return;
    }

    mQueryCursor = data;
    mAdapter.swapCursor(data);

  }

  public void onServiceConnected(ComponentName name, IBinder service) {

    Bundle bundle = getArguments();

    String action = bundle != null ? bundle.getString(INTENT_KEY_ACTION) : null;
    String data = bundle != null ? bundle.getString(INTENT_KEY_DATA) : null;

    if (Intent.ACTION_VIEW.equals(action)) {
      // this is something we got from the search bar
      Uri uri = Uri.parse(data);
      if (data.startsWith("content://media/external/audio/media/")) {
        // This is a specific file
        String id = uri.getLastPathSegment();
        long[] list = new long[] { Long.valueOf(id) };
        MusicUtils.playAll(getActivity(), list, 0);
        getActivity().finish();
        return;
      } else if (data.startsWith("content://media/external/audio/albums/")) {
        // This is an album, show the songs on it
        Intent i = new Intent(Intent.ACTION_PICK);
        i.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
        i.putExtra("album", uri.getLastPathSegment());
        startActivity(i);
        return;
      } else if (data.startsWith("content://media/external/audio/artists/")) {
        // This is an artist, show the albums for that artist
        Intent i = new Intent(Intent.ACTION_PICK);
        i.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album");
        i.putExtra("artist", uri.getLastPathSegment());
        startActivity(i);
        return;
      }
    }

    mFilterString = bundle != null ? bundle.getString(SearchManager.QUERY) : null;
    if (MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)) {
      String focus = bundle != null ? bundle.getString(MediaStore.EXTRA_MEDIA_FOCUS) : null;
      String artist = bundle != null ? bundle.getString(MediaStore.EXTRA_MEDIA_ARTIST) : null;
      String album = bundle != null ? bundle.getString(MediaStore.EXTRA_MEDIA_ALBUM) : null;
      String title = bundle != null ? bundle.getString(MediaStore.EXTRA_MEDIA_TITLE) : null;
      if (focus != null) {
        if (focus.startsWith("audio/") && title != null) {
          mFilterString = title;
        } else if (Audio.Albums.ENTRY_CONTENT_TYPE.equals(focus)) {
          if (album != null) {
            mFilterString = album;
            if (artist != null) {
              mFilterString = mFilterString + " " + artist;
            }
          }
        } else if (Audio.Artists.ENTRY_CONTENT_TYPE.equals(focus)) {
          if (artist != null) {
            mFilterString = artist;
          }
        }
      }
    }

    mTrackList = getListView();
    mTrackList.setTextFilterEnabled(true);
  }

  public void onServiceDisconnected(ComponentName name) {

  }

  private class QueryListAdapter extends SimpleCursorAdapter {

    private QueryListAdapter(Context context, int layout, Cursor cursor, String[] from,
        int[] to, int flags) {
      super(context, layout, cursor, from, to, flags);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

      ViewHolder viewholder = (ViewHolder) view.getTag();

      String mimetype = cursor.getString(cursor.getColumnIndexOrThrow(Audio.Media.MIME_TYPE));

      if (mimetype == null) {
        mimetype = "audio/";
      }
      if (mimetype.equals("artist")) {
        viewholder.result_icon.setImageResource(R.drawable.ic_mp_list_artist);
        String name = cursor.getString(cursor.getColumnIndexOrThrow(Audio.Artists.ARTIST));
        String displayname = name;
        boolean isunknown = false;
        if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
          displayname = context.getString(R.string.unknown_artist);
          isunknown = true;
        }
        viewholder.query_result.setText(displayname);

        int numalbums = cursor.getInt(cursor.getColumnIndexOrThrow("data1"));
        int numsongs = cursor.getInt(cursor.getColumnIndexOrThrow("data2"));

        String songs_albums = MusicUtils.makeAlbumsSongsLabel(context, numalbums, numsongs,
            isunknown);

        viewholder.result_summary.setText(songs_albums);

      } else if (mimetype.equals("album")) {
        viewholder.result_icon.setImageResource(R.drawable.ic_mp_list_album);
        String name = cursor.getString(cursor.getColumnIndexOrThrow(Audio.Albums.ALBUM));
        String displayname = name;
        if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
          displayname = context.getString(R.string.unknown_album);
        }
        viewholder.query_result.setText(displayname);

        name = cursor.getString(cursor.getColumnIndexOrThrow(Audio.Artists.ARTIST));
        displayname = name;
        if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
          displayname = context.getString(R.string.unknown_artist);
        }
        viewholder.result_summary.setText(displayname);

      } else if (mimetype.startsWith("audio/") || mimetype.equals("application/ogg")
          || mimetype.equals("application/x-ogg")) {
        viewholder.result_icon.setImageResource(R.drawable.ic_mp_list_song);
        String name = cursor.getString(cursor.getColumnIndexOrThrow(Audio.Media.TITLE));
        viewholder.query_result.setText(name);

        String displayname = cursor.getString(cursor
            .getColumnIndexOrThrow(Audio.Artists.ARTIST));
        if (displayname == null || displayname.equals(MediaStore.UNKNOWN_STRING)) {
          displayname = context.getString(R.string.unknown_artist);
        }
        name = cursor.getString(cursor.getColumnIndexOrThrow(Audio.Albums.ALBUM));
        if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
          name = context.getString(R.string.unknown_album);
        }
        viewholder.result_summary.setText(displayname + " - " + name);
      }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

      View view = super.newView(context, cursor, parent);
      ViewHolder viewholder = new ViewHolder(view);
      view.setTag(viewholder);
      return view;
    }

    private class ViewHolder {

      ImageView result_icon;
      TextView query_result;
      TextView result_summary;

      public ViewHolder(View view) {
        result_icon = (ImageView) view.findViewById(R.id.icon);
        query_result = (TextView) view.findViewById(R.id.name);
        result_summary = (TextView) view.findViewById(R.id.summary);
      }

    }

  }

}




Java Source Code List

org.yammp.Constants.java
org.yammp.MediaAppWidgetProvider4x1.java
org.yammp.MediaAppWidgetProvider4x2.java
org.yammp.MediaButtonIntentReceiver.java
org.yammp.MusicPlaybackService.java
org.yammp.app.AlbumFragment.java
org.yammp.app.AppearanceSettingsActivity.java
org.yammp.app.ArtistFragment.java
org.yammp.app.Equalizer.java
org.yammp.app.GenreFragment.java
org.yammp.app.LyricsFragment.java
org.yammp.app.MusicBrowserActivity.java
org.yammp.app.MusicBrowserFragment.java
org.yammp.app.MusicPlaybackActivity.java
org.yammp.app.MusicSettingsActivity.java
org.yammp.app.PlaylistFragment.java
org.yammp.app.PluginFragment.java
org.yammp.app.PluginsManagerActivity.java
org.yammp.app.QueryBrowserActivity.java
org.yammp.app.QueryFragment.java
org.yammp.app.TrackBrowserActivity.java
org.yammp.app.TrackFragment.java
org.yammp.dialog.DeleteDialog.java
org.yammp.dialog.PlayShortcut.java
org.yammp.dialog.PlaylistDialog.java
org.yammp.dialog.PlaylistPickerDialog.java
org.yammp.dialog.PlaylistPicker.java
org.yammp.dialog.ScanningProgress.java
org.yammp.dialog.SearchDialog.java
org.yammp.dialog.SleepTimerDialog.java
org.yammp.dialog.VerticalTextSpinnerDialog.java
org.yammp.dialog.WeekSelector.java
org.yammp.util.ColorAnalyser.java
org.yammp.util.EqualizerWrapper.java
org.yammp.util.ImageDownloader.java
org.yammp.util.LazyImageLoader.java
org.yammp.util.LyricsDownloader.java
org.yammp.util.LyricsParser.java
org.yammp.util.LyricsSplitter.java
org.yammp.util.MusicUtils.java
org.yammp.util.PreferencesEditor.java
org.yammp.util.ServiceToken.java
org.yammp.util.ShakeListener.java
org.yammp.util.SortCursor.java
org.yammp.util.VisualizerCompatAudioFX.java
org.yammp.util.VisualizerCompatScoop.java
org.yammp.util.VisualizerCompat.java
org.yammp.util.VisualizerWrapper.java
org.yammp.view.EqualizerView.java
org.yammp.view.SliderView.java
org.yammp.view.TouchPaintView.java
org.yammp.view.VerticalTextSpinner.java
org.yammp.view.VisualizerViewFftSpectrum.java
org.yammp.view.VisualizerViewWaveForm.java
org.yammp.widget.CheckableRelativeLayout.java
org.yammp.widget.RepeatingImageButton.java
org.yammp.widget.SeparatedListAdapter.java
org.yammp.widget.TextScrollView.java
org.yammp.widget.TouchInterceptor.java