Locker.java :  » Mp3 » mp3tunes » com » binaryelysium » mp3tunes » api » Android Open Source

Android Open Source » Mp3 » mp3tunes 
mp3tunes » com » binaryelysium » mp3tunes » api » Locker.java
/***************************************************************************
 *   Copyright 2008 Casey Link <unnamedrambler@gmail.com>                  *
 *                                                                         *
 *   This program 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.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 ***************************************************************************/

package com.binaryelysium.mp3tunes.api;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import com.binaryelysium.mp3tunes.api.HttpClientCaller.CreateStreamCallback;
import com.binaryelysium.mp3tunes.api.Session.LoginException;
import com.binaryelysium.mp3tunes.api.results.SearchResult;

public class Locker
{
    public enum UpdateType {
        locker, playlist, preferences
    };

    public Locker()
    {}
    
//    public Locker(String username, String password, HttpClient client)
//            throws LockerException, LoginException
//    {
//        refreshSession(username, password, client);
//    }
    
    public Locker(String username, String password)
    throws LockerException, LoginException
    {
        refreshSession(username, password);
    }
    
    public boolean testSession()
    {
        String text;
        try {
            text = HttpClientCaller.getInstance().callNoFixSession(new RemoteMethod.Builder(RemoteMethod.METHODS.LAST_UPDATE)
            .addParam("type", UpdateType.locker.toString())
            .create());
        } catch (HttpResponseException e) {
            if (e.getStatusCode() == 401) {
                return false;
            }
            e.printStackTrace();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return true;
        } catch (InvalidSessionException e) {
            e.printStackTrace();
            return false;
        } catch (LockerException e) {
            e.printStackTrace();
            return false;
        } catch (LoginException e) {
            e.printStackTrace();
            return false;
        }

        try {
            JSONObject json = new JSONObject(text);
            if (json.getInt("status") == 1)
                return true;
            else {
                int error = json.getInt("errorCode");
                if (error == 401001) return false;
                String errorStr = Integer.toString(error);
                Log.e("Mp3Tunes", "Got error " + errorStr + " testing for valid session");
            }
        } catch (JSONException e) {
            e.printStackTrace();
            return true;
        }

        return false;
    }
    
//    public void refreshSession(String username, String password, HttpClient client) throws LockerException, LoginException
//    {
//        refreshSessionImpl(username, password, client);
//    }
    
    public void refreshSession(String username, String password) throws LockerException, LoginException
    {
        refreshSessionImpl(username, password, null);
    }
    
    private void refreshSessionImpl(String username, String password, HttpClient client) throws LockerException, LoginException
    {
        Log.w("Mp3Tunes", "Called refresh session");
        
        try {
            HttpClientCaller caller = HttpClientCaller.getInstance();
            RemoteMethod method = new RemoteMethod.Builder(RemoteMethod.METHODS.LOGIN)
                                                          .addParam("username", username)
                                                          .addParam("password", password)
                                                          .create();
            String response;
            if (client != null) {
                response = caller.call(method, client);
            } else {
                response = caller.call(method);
            }
            try {
                LockerContext.instance().setSession(Session.sessionFromJson(response));
            } catch (JSONException e) {
                throw new LockerException("Server returned corrupt data");
            } 
        } catch (IllegalArgumentException e) {
            throw new LoginException();
        } catch (HttpResponseException e) {
            Log.w("Mp3Tunes", "Error code: " + Integer.toString(e.getStatusCode()) + "\n" + Log.getStackTraceString(e));
            throw new LockerException("connection issue");
        } catch (IOException e) {
            Log.w("Mp3Tunes", Log.getStackTraceString(e));
            throw new LockerException("connection issue");
        } catch (InvalidSessionException e) {
            throw new LoginException();
        }
    }

    public long getLastUpdate(UpdateType type) throws LockerException, InvalidSessionException, LoginException, JSONException
    {
        String text;
        try {
            text = HttpClientCaller.getInstance().call(new RemoteMethod.Builder(RemoteMethod.METHODS.LAST_UPDATE)
            .addParam("type", type.toString())
            .create());
        } catch (IOException e) {
            throw new LockerException("download failed");
        }

        JSONObject json = new JSONObject(text);
        if (json.getInt("status") == 1)
            return json.getLong("timestamp");

        return 0;
    }
    
    public List<Artist> getArtist(int id) throws LockerException
    {
        try {
            return getArtistsList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "artist")
                .addParam("artist_id", Integer.toString(id))
                .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
    }
    
    public List<Artist> getArtists(int count, int set) throws LockerException 
    {
        try {
            return getArtistsList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type",  "artist")
                .addParam("count", Integer.toString(count))
                .addParam("set",   Integer.toString(set))
                .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
    }
    
    public List<Artist> getArtistsList(RemoteMethod method) throws LockerException
    {
        try {
            String text;
            try {
                text = HttpClientCaller.getInstance().call(method);
            } catch (IOException e) {
                throw new LockerException("download failed");
            }
        
            JSONObject json = new JSONObject(text);
            int numResults = json.getJSONObject("summary").getInt("totalResults");
            //Log.w("Mp3Tunes", "Get artists call got: " + Integer.toString(numResults) + " results");
            ArrayList<Artist> artists = new ArrayList<Artist>();
            if (numResults == 0) return artists;
        
            JSONArray jsonArtists = json.optJSONArray("artistList");
            if (jsonArtists == null) return artists;
            for (int i = 0; i < jsonArtists.length(); i++) {
                JSONObject obj = jsonArtists.getJSONObject(i);
                Artist a = Artist.artistFromJson(obj);
                if (a != null)
                    artists.add(a);
            }
            if (artists.size() < 1) throw new LockerException("Sever Sent Corrupt Data");
            return artists;
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        } catch (JSONException e) {
            e.printStackTrace();
            throw new LockerException("Sever Sent Corrupt Data");
        } catch (LoginException e) {
            throw new LockerException("Unable to refresh session");
        }
    }
    
    public List<Album> getAlbum(int id) throws LockerException
    {
        try {
            return getAlbumsList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "album")
                .addParam("album_id", Integer.toString(id))
                .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
    }
    
    public List<Album> getAlbumsForArtist(int id) throws LockerException
    {
        try {
            return getAlbumsList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "album")
                .addParam("artist_id", Integer.toString(id))
                .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
    }

    public List<Album> getAlbums(int count, int set) throws LockerException
    {
        try {
            return getAlbumsList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                            .addParam("type",  "album")
                            .addParam("count", Integer.toString(count))
                            .addParam("set",   Integer.toString(set))
                            .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
            
    }
    
    public List<Album> getAlbumsList(RemoteMethod method) throws LockerException
    {
        try {
            String text;
            try {
                text = HttpClientCaller.getInstance().call(method);
            } catch (IOException e) {
                throw new LockerException("download failed");
            }

            JSONObject json = new JSONObject(text);
            int numResults = json.getJSONObject("summary").getInt("totalResults");
            //Log.w("Mp3Tunes", "Get artists call got: " + Integer.toString(numResults) + " results");
            ArrayList<Album> albums = new ArrayList<Album>();
            if (numResults == 0) return albums;
        
            JSONArray jsonAlbums = json.optJSONArray("albumList");
            if (jsonAlbums == null) return albums;
            for (int i = 0; i < jsonAlbums.length(); i++) {
                JSONObject obj = jsonAlbums.getJSONObject(i);
                Album a = Album.albumFromJson(obj);
                if (a != null)
                    albums.add(a);
            }
        
            if (albums.size() < 1) throw new LockerException("Sever Sent Corrupt Data");
            return albums;
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        } catch (JSONException e) {
            e.printStackTrace();
            throw new LockerException("Sever Sent Corrupt Data");
        } catch (LoginException e) {
            throw new LockerException("Unable to refresh session");
        }
    }

    public List<Track> getTrackList(RemoteMethod method) throws LockerException
    {
        try {
            String text;
            try {
                text = HttpClientCaller.getInstance().call(method);
            } catch (IOException e) {
                throw new LockerException("download failed");
            }
        
            //We get the extra data here because the sets for generated playlists do not behave
            //the same way as no
            JSONObject json  = new JSONObject(text);
            JSONObject obj   = json.getJSONObject("summary");
            int numResults   = obj.optInt("totalResults");
            int set          = obj.optInt("set");
            //int count        = obj.optInt("count");
            double totalSets = obj.optDouble("totalResultSets");
        
            //Log.w("Mp3Tunes", "Get Tracks call got: " + Integer.toString(numResults) + " results");
            ArrayList<Track> tracks = new ArrayList<Track>();
            if (numResults == 0 || set > totalSets) return tracks;
        
            JSONArray jsonTracks = json.optJSONArray("trackList");
            if (jsonTracks == null) return tracks;
            for (int i = 0; i < jsonTracks.length(); i++) {
                JSONObject track = jsonTracks.getJSONObject(i);
                Track t = ConcreteTrack.trackFromJson(track);
                if (t != null) 
                    tracks.add(t);
                else
                    Log.e("Mp3tunes", "Got null track. Now why did that happen");
            }
            if (tracks.size() < 1) throw new LockerException("Sever Sent Corrupt Data");
            return tracks;
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        } catch (JSONException e) {
            e.printStackTrace();
            throw new LockerException("Sever Sent Corrupt Data");
        } catch (LoginException e) {
            throw new LockerException("Unable to refresh session");
        }
    }
    
    public List<Track> getTracks(int count, int set) throws LockerException
    {
            try {
                return getTrackList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                    .addParam("type", "track")
                    .addParam("count", Integer.toString(count))
                    .addParam("set",   Integer.toString(set))
                    .create());
            } catch (InvalidSessionException e) {
                throw new LockerException("Bad Session Data");
            }
    }
    
    public List<Track> getTracksForArtistFromJson(int id) throws LockerException
    {
        try {
            return getTrackList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "track")
                .addParam("artist_id", Integer.toString(id))
                .create());
    } catch (InvalidSessionException e) {
        throw new LockerException("Bad Session Data");
    }
    }
    
    public List<Track> getTracksForAlbumFromJson(int id) throws LockerException
    {
        try {
            return getTrackList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "track")
                .addParam("album_id", Integer.toString(id))
                .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
    }
    
    public List<Track> getTracksForPlaylist(String id, int count, int set) throws LockerException
    {
        try {
            return getTrackList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "track")
                .addParam("playlist_id", id)
                .addParam("count", Integer.toString(count))
                .addParam("set", Integer.toString(set))
                .create());
        } catch (InvalidSessionException e) {
                    throw new LockerException("Bad Session Data");
                }
    }

    public List<Playlist> getPlaylistList(RemoteMethod method) throws LockerException
    {
        try {
            String text;
            try {
                text = HttpClientCaller.getInstance().call(method);
            } catch (IOException e) {
                throw new LockerException("download failed");
            }
        
            JSONObject json = new JSONObject(text);
            int numResults = json.getJSONObject("summary").getInt("totalResults");
            //Log.w("Mp3Tunes", "Get Playlists call got: " + Integer.toString(numResults) + " results");
            ArrayList<Playlist> playlists = new ArrayList<Playlist>();
            if (numResults == 0) return playlists;
        
            JSONArray jsonPlaylists = json.optJSONArray("playlistList");
            if (jsonPlaylists == null) return playlists;
            for (int i = 0; i < jsonPlaylists.length(); i++) {
                JSONObject obj = jsonPlaylists.getJSONObject(i);
                Playlist p = Playlist.playlistFromJson(obj);
                if (p != null) 
                    playlists.add(p);
                else
                    Log.e("Mp3tunes", "Got null playlist. Now why did that happen");
            }
        
            if (playlists.size() < 1) throw new LockerException("Sever Sent Corrupt Data");
            return playlists;
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        } catch (JSONException e) {
            e.printStackTrace();
            throw new LockerException("Sever Sent Corrupt Data");
        } catch (LoginException e) {
            throw new LockerException("Unable to refresh session");
        }
    }
    
    public List<Playlist> getPlaylists(int count, int set) throws LockerException
    {
        try {
            return getPlaylistList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "playlist")
                .addParam("count", Integer.toString(count))
                .addParam("set",   Integer.toString(set))
                .create());
        } catch (InvalidSessionException e) {
            throw new LockerException("Bad Session Data");
        }
    }
    
    public SearchResult search(String query) throws LockerException, InvalidSessionException, JSONException, LoginException
    {
        return search(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_SEARCH)
        .addParam("type", "artist,album,track")
        .addParam("s", query)
        .addParam("count", "200")
        .addParam("set", "0")
        .create());
    }

    public SearchResult search(RemoteMethod method) throws LockerException, InvalidSessionException, JSONException, LoginException
    {
        String text;
        try {
            text = HttpClientCaller.getInstance().call(method);
        } catch (IOException e) {
            throw new LockerException("download failed");
        }
        
        JSONObject json = new JSONObject(text);
        JSONObject results = json.getJSONObject("summary").getJSONObject("totalResults");
        
        int numArtists = results.getInt("artist");
        int numAlbums  = results.getInt("album");
        int numTracks  = results.getInt("track");
        
        Log.w("Mp3Tunes", "Get search call got: " + Integer.toString(numArtists) + " artists: " +
              Integer.toString(numAlbums) + " albums: " + Integer.toString(numTracks) + " tracks");
        
        SearchResult result = new SearchResult();
        if (numArtists > 0) {
            ArrayList<Artist> artists = new ArrayList<Artist>();
            JSONArray jsonArray = json.getJSONArray("artistList");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject obj = jsonArray.getJSONObject(i);
                Artist a = Artist.artistFromJson(obj);
                if (a != null) 
                    artists.add(a);
                else
                    Log.e("Mp3tunes", "Got null artist. Now why did that happen");
            }
            result.setArtists(artists);
        }
        
        if (numAlbums > 0) {
            ArrayList<Album> albums = new ArrayList<Album>();
            JSONArray jsonArray = json.getJSONArray("albumList");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject obj = jsonArray.getJSONObject(i);
                Album a = Album.albumFromJson(obj);
                if (a != null) 
                    albums.add(a);
                else
                    Log.e("Mp3tunes", "Got null artist. Now why did that happen");
            }
            result.setAlbums(albums);
        }
        
        if (numTracks > 0) {
            ArrayList<Track> tracks = new ArrayList<Track>();
            JSONArray jsonArray = json.getJSONArray("trackList");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject obj = jsonArray.getJSONObject(i);
                Track t = ConcreteTrack.trackFromJson(obj);
                if (t != null) 
                    tracks.add(t);
                else
                    Log.e("Mp3tunes", "Got null artist. Now why did that happen");
            }
            result.setTracks(tracks);
        }
        return result;
    }

    public Bitmap getAlbumArtFromFileKey(String key) throws InvalidSessionException, LockerException, LoginException
    {
        RemoteMethod method = 
            new RemoteMethod.Builder(RemoteMethod.METHODS.ALBUM_ART_GET)
                                     .addFileKey(key)
                                     .create();     
        try {
            byte[] data = HttpClientCaller.getInstance().callBytes(method);
            Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); 
            return bm;
        } catch (IOException e) {
            throw new LockerException("download failed");
        }
    }

    public boolean getTrack(String key, CreateStreamCallback callback, HttpClientCaller.Progress progressCallback) throws InvalidSessionException, LockerException, LoginException
    {
        RemoteMethod method = 
            new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_GET)
                                    .addFileKey(key)
                                    .create();
        try {
            return HttpClientCaller.getInstance().callStream(method, callback, progressCallback);
        } catch (IOException e) {
            throw new LockerException("download failed");
        }
    }

    public List<Track> getSimilarTracks(LockerId id, int count, int set) throws LockerException
    {
        try {
            return getTrackList(new RemoteMethod.Builder(RemoteMethod.METHODS.LOCKER_DATA)
                .addParam("type", "track")
                .addParam("playlist_id", "PLAYMIX_TRACK_" + id.asString())
                .addParam("playmix_map", "")
                //.addParam("count", Integer.toString(count)) You cannot seem to set the count and set with this call.  Ask Breneden to investigate.
                //.addParam("set", Integer.toString(set))
                .create());
        } catch (InvalidSessionException e) {
                    throw new LockerException("Bad Session Data");
        }
    }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.