diff options
| author | Teddy Wing | 2012-06-24 05:38:01 -0400 |
|---|---|---|
| committer | Teddy Wing | 2012-06-24 05:38:01 -0400 |
| commit | 6f5e24ff830fa83e7fc640c4ce5599381dbf282c (patch) | |
| tree | 2e2003086f403aeedb4ecbc29bc0eabf474cda89 /Resources | |
| parent | 4ca2c86c189db5b476c9bef9c4b8f0744eada30b (diff) | |
| parent | 7f28bc955883e3847eae5ddaeac87445567660b3 (diff) | |
| download | LikeFeed-6f5e24ff830fa83e7fc640c4ce5599381dbf282c.tar.bz2 | |
Merge branch 'master' of github.com:teddywing/LikeFeed
Merged my & Nikita's table view UI edits.
Conflicts:
Resources/friendship/ui/LikeList.js
Diffstat (limited to 'Resources')
| -rw-r--r-- | Resources/friendship/core/FacebookFQL.js | 47 | ||||
| -rw-r--r-- | Resources/friendship/core/core.js | 3 | ||||
| -rw-r--r-- | Resources/friendship/ui/ApplicationWindow.js | 14 | ||||
| -rw-r--r-- | Resources/friendship/ui/LikeList.js | 148 | ||||
| -rw-r--r-- | Resources/friendship/ui/LoginWindow.js | 5 |
5 files changed, 178 insertions, 39 deletions
diff --git a/Resources/friendship/core/FacebookFQL.js b/Resources/friendship/core/FacebookFQL.js index 2d04bcb..9a011aa 100644 --- a/Resources/friendship/core/FacebookFQL.js +++ b/Resources/friendship/core/FacebookFQL.js @@ -16,15 +16,42 @@ } }; // TODO: find some way to handle timeout (via Ti.Facebook....) - fs.core.handleAllFriendPostsFQLResponse = function (result) { fs.core.handleFQLResponse(result, "processPosts"); }; - fs.core.queryAllFriendPostsFQL = function() { // TODO: make a variant that takes in user list and other filter info + fs.core.handleFriendIDsFQLResponse = function (result) { fs.core.handleFQLResponse(result, "processFriendIDs"); }; + fs.core.queryFriendIDsFQL = function() { + var query = "SELECT uid, name, pic_square FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = " + Ti.Facebook.uid + ")" + Ti.Facebook.request('fql.query', {query: query}, fs.core.handleFriendIDsFQLResponse); + }; + + fs.core.handleLikeIDsFQLResponse = function (result) { fs.core.handleFQLResponse(result, "processLikeIDs"); }; + fs.core.queryLikeIDsFQL = function(friend_ids) { + var query = "SELECT page_id, created_time, uid FROM page_fan WHERE uid IN (" + friend_ids.join() + ")"; + Ti.Facebook.request('fql.query', {query: query}, fs.core.handleLikeIDsFQLResponse); + }; + + fs.core.handleAllFriendLikeIDsFQLResponse = function (result) { fs.core.handleFQLResponse(result, "processLikeIDs"); }; + fs.core.queryAllFriendLikeIDsFQL = function() { + var query = "SELECT page_id, created_time, uid FROM page_fan WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = " + Ti.Facebook.uid + ")"; + Ti.Facebook.request('fql.query', {query: query}, fs.core.handleAllFriendLikeIDsFQLResponse); + }; + + fs.core.handleLikesFQLResponse = function (result) { fs.core.handleFQLResponse(result, "processLikes"); }; + fs.core.queryLikesFQL = function(page_ids) { + //var query = "SELECT page_id, name, description, page_url, pic_square, fan_count, type, website, general_info "; + //query += "FROM page WHERE page_id "; + //query += "IN (SELECT page_id FROM page_fan WHERE uid "; + //query += "IN (SELECT uid2 FROM friend WHERE uid1 = " + Titanium.Facebook.uid + "))"; + //query += " limit 20"; var query = "SELECT page_id, name, description, page_url, pic_square, fan_count, type, website, general_info "; - query += "FROM page WHERE page_id "; - query += "IN (SELECT page_id FROM page_fan WHERE uid "; - //query += "= " + Ti.Facebook.uid + ")"; - query += "IN (SELECT uid2 FROM friend WHERE uid1 = " + Titanium.Facebook.uid + "))"; - query += " limit 20"; // TODO: remove the limit - Ti.API.info(query); // TODO: remove debug printout - Ti.Facebook.request('fql.query', {query: query}, fs.core.handleAllFriendPostsFQLResponse); - }; + query += "FROM page WHERE page_id IN (" + page_ids.join() + ")"; + Ti.Facebook.request('fql.query', {query: query}, fs.core.handleLikesFQLResponse); + }; + + fs.core.fetchMoreLikes = function(numLikesMore) { + numLikesMore = Math.min((fs.data.reverseChronoLikedIDs.length - fs.data.numLikesFetched), numLikesMore); + page_ids = Array(); + for (var i = fs.data.numLikesFetched; i < fs.data.numLikesFetched + numLikesMore; i++) { + page_ids.push(fs.data.reverseChronoLikedIDs[i]); + } + fs.core.queryLikesFQL(page_ids); + }; })(); diff --git a/Resources/friendship/core/core.js b/Resources/friendship/core/core.js index dd75086..fe6cb00 100644 --- a/Resources/friendship/core/core.js +++ b/Resources/friendship/core/core.js @@ -3,5 +3,6 @@ })(); Ti.include( - '/friendship/core/FacebookFQL.js' + '/friendship/core/FacebookFQL.js', + '/friendship/core/DataManipulation.js' ) diff --git a/Resources/friendship/ui/ApplicationWindow.js b/Resources/friendship/ui/ApplicationWindow.js index aab8262..8f4835b 100644 --- a/Resources/friendship/ui/ApplicationWindow.js +++ b/Resources/friendship/ui/ApplicationWindow.js @@ -27,7 +27,19 @@ }); win.add(fs.ui.createLikeList()); - fs.ui.refreshLikeList(); + + Ti.API.addEventListener("processFQLError", function(e) { + alert(e.what); + }); + + Ti.API.addEventListener("refreshAllData", function(e) { + if (Ti.Facebook.loggedIn) { + Ti.App.fireEvent('app:show.loader'); + fs.core.queryFriendIDsFQL(); + } + }) + Ti.API.fireEvent("refreshAllData"); + tab_group.addTab(tab); return tab_group; diff --git a/Resources/friendship/ui/LikeList.js b/Resources/friendship/ui/LikeList.js index 0bf744c..793a836 100644 --- a/Resources/friendship/ui/LikeList.js +++ b/Resources/friendship/ui/LikeList.js @@ -1,4 +1,20 @@ (function() { + var MAX_ROW_HEIGHT = 150; + var lookup = { + 'BOOK':'#b0d3a4', + 'SHOW':'#c7b0b5', + 'MUSICIAN/BAND':'#c7bbb0', + 'MOVIE':'#ccc399', + 'TV SHOW':'#5c9aa7' + }; + + function getTypeColor(type_str) + { + var r = lookup[type_str]; + if( r ) return r; + return '#bbbbbb'; + } + function addCommas(nStr) { nStr += ''; @@ -18,7 +34,7 @@ create_row( { pic_square: "images/fb_test_profile.jpg", name: "Test Name", - description: "Description Description Description Description Description Description Description Description Description Description Description Description ", + description: "Description Description Description. Description Description Description Description Description Description Description Description Description ", fan_count: "1000000000000000", page_url: "http://www.google.com", website: "http://www.google.com", @@ -97,26 +113,14 @@ text: " " + key.type + " ", font:{fontSize:11,fontWeight:'single'}, color:'white', - backgroundColor: '#b0d3a4', + backgroundColor: getTypeColor( key.type ), width:'auto', textAlign:'left', top:2, left: profile_icon.width + 12, height:'auto' }); - - var liked_by = Ti.UI.createLabel({ - text: " Friend Bob ", - font:{fontSize:11,fontWeight:'bold'}, - color: 'white', - backgroundColor:"#d1d5e0", - width:'auto', - textAlign:'left', - top:2, - left: item_type.left + item_type.width + 2, - height:'auto' - }); - + var title = Ti.UI.createLabel({ text:key.name, font:{fontSize:16,fontWeight:'bold'}, @@ -128,8 +132,27 @@ wordWrap:'true' }); + var liked_by = Ti.UI.createLabel({ + text: " Friend Bob ", + font:{fontSize:11,fontWeight:'single'}, + + //color: 'white', + //backgroundColor:"#d1d5e0", + + color: '#aaaaaa', + + width:'auto', + textAlign:'left', + top:2, + height:'auto' + }); + + liked_by.left = 320 - liked_by.width; key.description = key.description.replace(/<(?:.|\n)*?>/gm, ''); + if( key.description.indexOf('.') > 0 ){ + key.description = key.description.substr( 0, key.description.indexOf('.') + 1 ) ; + } var description = Ti.UI.createLabel({ text:key.description, @@ -138,17 +161,23 @@ width:'auto', textAlign:'left', top: title.top + title.height, - left:profile_icon.width + 14 + left:profile_icon.width + 14, + height:'auto', + wordWrap:true }); + var max_height = MAX_ROW_HEIGHT - description.top; + + if( description.height > max_height ) description.height = max_height; + var item_view = Ti.UI.createView({ height: 'auto', top: 5, bottom: 5 }); - - row.height = 'auto'; //50; + + row.height = 'auto'; item_view.add( profile_icon ); // row.add( thumb_icon ); @@ -161,10 +190,15 @@ row.add(item_view); return row; - } + }; + + function sortLikeIDsByTime(a, b) { // TODO: deprecated + return ((a.time > b.time) ? -1 : ((a.time < b.time) ? 1 : 0)); + }; fs.ui.createLikeList = function() { var ll_view = Ti.UI.createTableView(); + ll_view.maxRowHeight = MAX_ROW_HEIGHT; var loading = fs.ui.createLoadingView(); ll_view.add(loading); @@ -173,13 +207,79 @@ //Ti.App.fireEvent('app:show.loader'); - Ti.API.addEventListener("processPosts", function(d) { - for ( key in d.data ) { - ll_view.appendRow( create_row( d.data[key] ) ); + Ti.API.addEventListener("processFriendIDs", function(e) { + fs.data.friends = e.data; + fs.core.queryAllFriendLikeIDsFQL(); + }); + + Ti.API.addEventListener("processLikeIDs", function(e) { + fs.data.likeIDs = Array(); + fs.data.reverseChronoLikedIDs = Array(); + + for ( key in e.data ) { + pid = e.data[key].page_id + ''; + tm = e.data[key].created_time; + uid = e.data[key].uid; + + if (pid in fs.data.likeIDs) { + fs.data.likeIDs[pid].count += 1; + + if (tm >= fs.data.likeIDs[pid].time) { + fs.data.likeIDs[pid].time = tm; + fs.data.likeIDs[pid].uid = uid; + } + } else { + fs.data.likeIDs[pid] = {count: 1, time: tm, uid: uid}; + } + } + + if (e.data.length > 0) { + var tuples = []; + + for (var key in fs.data.likeIDs) { + tuples.push([key, fs.data.likeIDs[key]]); + } + tuples.sort(function(a, b) { + a = a[1].time; + b = b[1].time; + return a < b ? 1 : (a > b ? -1 : 0); + }); + + for (var i = 0; i < tuples.length; i++) { + fs.data.reverseChronoLikedIDs.push(tuples[i][0]); + //Ti.API.info(tuples[i][0] + ' ' + tuples[i][1].time); + } + fs.data.numLikesFetched = 0; + + ll_view.footerTitle = "0 / " + fs.data.reverseChronoLikedIDs.length + " loaded"; + + fs.core.fetchMoreLikes(fs.data.NUM_LIKES_PER_FETCH); + } else { + ll_view.footerTitle = "0 / 0 loaded"; + Ti.App.fireEvent('app:hide.loader'); + } + }); + + Ti.API.addEventListener("processLikes", function(e) { + for ( key in e.data ) { + fs.data.numLikesFetched++; + ll_view.appendRow(create_row(e.data[key])); } + ll_view.footerTitle = fs.data.numLikesFetched + " / " + fs.data.reverseChronoLikedIDs.length + " loaded"; + /* + if (fs.data.numLikesFetched < fs.data.reverseChronoLikedIDs.length) { + fs.core.fetchMoreLikes(fs.data.NUM_LIKES_PER_FETCH); + } + */ + // TODO: when UI scrolls to bottom, can call this (might need mutex) Ti.App.fireEvent('app:hide.loader'); }); + + ll_view.addEventListener("scrollEnd", function(e) { + Ti.API.info("scroll ended"); + Ti.API.info(e.contentOffset); + }); return ll_view; }; @@ -187,9 +287,7 @@ fs.ui.refreshLikeList = function(e) { if (Ti.Facebook.loggedIn) { Ti.App.fireEvent('app:show.loader'); - fs.core.queryAllFriendPostsFQL(); - } else { - Ti.Facebook.fireEvent('login'); + fs.core.queryAllFriendLikeIDsFQL(); // TODO: switch to friend_ids version of query } }; })(); diff --git a/Resources/friendship/ui/LoginWindow.js b/Resources/friendship/ui/LoginWindow.js index e51db53..3acd885 100644 --- a/Resources/friendship/ui/LoginWindow.js +++ b/Resources/friendship/ui/LoginWindow.js @@ -6,6 +6,7 @@ Ti.Facebook.addEventListener('login', function(e) { if (e.success) { fs.app.mainTabGroup.open(); + Ti.API.fireEvent("refreshAllData"); } else { alert('Could not log into Facebook'); } @@ -41,6 +42,6 @@ win.add(view); return tab_group; - } - + }; + })(); |
