Merge lp:~rockstar/ubuntuone-ios-music/flurry-analytics into lp:ubuntuone-ios-music

Proposed by Paul Hummer
Status: Merged
Approved by: Paul Hummer
Approved revision: 294
Merged at revision: 250
Proposed branch: lp:~rockstar/ubuntuone-ios-music/flurry-analytics
Merge into: lp:ubuntuone-ios-music
Prerequisite: lp:~rockstar/ubuntuone-ios-music/polish-list-views
Diff against target: 982 lines (+737/-3)
13 files modified
Dependencies/Flurry/Flurry.h (+611/-0)
Music/UOAppDelegate.m (+1/-0)
Music/View Controllers/AlbumViewController.m (+9/-0)
Music/View Controllers/AlbumsViewController.m (+12/-0)
Music/View Controllers/ArtistViewController.m (+9/-0)
Music/View Controllers/ArtistsViewController.m (+12/-0)
Music/View Controllers/PlayerViewController.m (+3/-0)
Music/View Controllers/PlaylistsViewController.m (+12/-0)
Music/View Controllers/SettingsAuthenticationViewController.m (+12/-0)
Music/View Controllers/SettingsViewController.m (+12/-0)
Music/View Controllers/SongsViewController.m (+12/-0)
U1Music.xcodeproj/project.pbxproj (+20/-3)
U1Music_Prefix.pch (+12/-0)
To merge this branch: bzr merge lp:~rockstar/ubuntuone-ios-music/flurry-analytics
Reviewer Review Type Date Requested Status
Roberto Alsina (community) Approve
Review via email: mp+147592@code.launchpad.net

Commit message

Add Flurry analytics

Description of the change

This branch adds Flurry analytics to the U1 Music app. I added the base analytics, and timed event logging for each of the view controllers.

To post a comment you must log in.
294. By Paul Hummer

Fix copy and paste errors

Revision history for this message
Roberto Alsina (ralsina) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'Dependencies/Flurry'
=== added file 'Dependencies/Flurry/Flurry.h'
--- Dependencies/Flurry/Flurry.h 1970-01-01 00:00:00 +0000
+++ Dependencies/Flurry/Flurry.h 2013-02-11 04:20:26 +0000
@@ -0,0 +1,611 @@
1//
2// Flurry.h
3// Flurry iOS Analytics Agent
4//
5// Copyright 2009-2012 Flurry, Inc. All rights reserved.
6//
7// Methods in this header file are for use with Flurry Analytics
8
9#import <UIKit/UIKit.h>
10
11/*!
12 * @brief Provides all available methods for defining and reporting Analytics from use
13 * of your app.
14 *
15 * Set of methods that allow developers to capture detailed, aggregate information
16 * regarding the use of their app by end users.
17 *
18 * @note This class provides methods necessary for correct function of FlurryAds.h.
19 * For information on how to use Flurry's Ads SDK to
20 * attract high-quality users and monetize your user base see <a href="http://support.flurry.com/index.php?title=Publishers">Support Center - Publishers</a>.
21 *
22 * @author 2009 - 2012 Flurry, Inc. All Rights Reserved.
23 * @version 4.0.0
24 *
25 */
26@interface Flurry : NSObject {
27}
28
29/** @name Pre-Session Calls
30 * Optional sdk settings that should be called before start session.
31 */
32//@{
33
34/*!
35 * @brief Explicitly specifies the App Version that Flurry will use to group Analytics data.
36 * @since 2.7
37 *
38 * This is an optional method that overrides the App Version Flurry uses for reporting. Flurry will
39 * use the CFBundleVersion in your info.plist file when this method is not invoked.
40 *
41 * @note There is a maximum of 605 versions allowed for a single app. \n
42 * This method must be called prior to invoking #startSession:.
43 *
44 * @param version The custom version name.
45 */
46
47+ (void)setAppVersion:(NSString *)version;
48
49/*!
50 * @brief Retrieves the Flurry Agent Build Version.
51 * @since 2.7
52 *
53 * This is an optional method that retrieves the Flurry Agent Version the app is running under.
54 * It is most often used if reporting an unexpected behavior of the SDK to <a href="mailto:iphonesupport@flurry.com">
55 * Flurry Support</a>
56 *
57 * @note This method must be called prior to invoking #startSession:. \n
58 * FAQ for the iPhone SDK is located at <a href="http://wiki.flurry.com/index.php?title=IPhone_FAQ">
59 * Support Center - iPhone FAQ</a>.
60 *
61 * @see #setDebugLogEnabled: for information on how to view debugging information on your console.
62 *
63 * @return The agent version of the Flurry SDK.
64 *
65 */
66+ (NSString *)getFlurryAgentVersion;
67
68/*!
69 * @brief Displays an exception in the debug log if thrown during a Session.
70 * @since 2.7
71 *
72 * This is an optional method that augments the debug logs with exceptions that occur during the session.
73 * You must both capture exceptions to Flurry and set debug logging to enabled for this method to
74 * display information to the console. The default setting for this method is @c NO.
75 *
76 * @note This method must be called prior to invoking #startSession:.
77 *
78 * @see #setDebugLogEnabled: for information on how to view debugging information on your console. \n
79 * #logError:message:exception: for details on logging exceptions. \n
80 * #logError:message:error: for details on logging errors.
81 *
82 * @param value @c YES to show errors in debug logs, @c NO to omit errors in debug logs.
83 */
84+ (void)setShowErrorInLogEnabled:(BOOL)value;
85
86/*!
87 * @brief Generates debug logs to console.
88 * @since 2.7
89 *
90 * This is an optional method that displays debug information related to the Flurry SDK.
91 * display information to the console. The default setting for this method is @c NO.
92 *
93 * @note This method must be called prior to invoking #startSession:.
94 *
95 * @param value @c YES to show debug logs, @c NO to omit debug logs.
96 *
97 */
98+ (void)setDebugLogEnabled:(BOOL)value;
99
100/*!
101 * @brief Set the timeout for expiring a Flurry session.
102 * @since 2.7
103 *
104 * This is an optional method that sets the time the app may be in the background before
105 * starting a new session upon resume. The default value for the session timeout is 10
106 * seconds in the background.
107 *
108 * @note This method must be called prior to invoking #startSession:.
109 *
110 * @param seconds The time in seconds to set the session timeout to.
111 */
112+ (void)setSessionContinueSeconds:(int)seconds;
113
114/*!
115 * @brief Send data over a secure transport.
116 * @since 3.0
117 *
118 * This is an optional method that sends data over an SSL connection when enabled. The
119 * default value is @c NO.
120 *
121 * @note This method must be called prior to invoking #startSession:.
122 *
123 * @param value @c YES to send data over secure connection.
124 */
125+ (void)setSecureTransportEnabled:(BOOL)value;
126
127//@}
128
129/*!
130 * @brief Start a Flurry session for the project denoted by @c apiKey.
131 * @since 2.6
132 *
133 * This method serves as the entry point to Flurry Analytics collection. It must be
134 * called in the scope of @c applicationDidFinishLaunching. The session will continue
135 * for the period the app is in the foreground until your app is backgrounded for the
136 * time specified in #setSessionContinueSeconds:. If the app is resumed in that period
137 * the session will continue, otherwise a new session will begin.
138 *
139 * @note If testing on a simulator, please be sure to send App to background via home
140 * button. Flurry depends on the iOS lifecycle to be complete for full reporting.
141 *
142 * @see #setSessionContinueSeconds: for details on setting a custom session timeout.
143 *
144 * @code
145 * - (void)applicationDidFinishLaunching:(UIApplication *)application
146 {
147 // Optional Flurry startup methods
148 [Flurry startSession:@"YOUR_API_KEY"];
149 // ....
150 }
151 * @endcode
152 *
153 * @param apiKey The API key for this project.
154 */
155
156+ (void)startSession:(NSString *)apiKey;
157
158/** @name Event and Error Logging
159 * Methods for reporting custom events and errors during the session.
160 */
161//@{
162
163/*!
164 * @brief Records a custom event specified by @c eventName.
165 * @since 2.8.4
166 *
167 * This method allows you to specify custom events within your app. As a general rule
168 * you should capture events related to user navigation within your app, any action
169 * around monetization, and other events as they are applicable to tracking progress
170 * towards your business goals.
171 *
172 * @note You should not pass private or confidential information about your users in a
173 * custom event. \n
174 * Where applicable, you should make a concerted effort to use timed events with
175 * parameters (#logEvent:withParameters:timed:) or events with parameters
176 * (#logEvent:withParameters:). This provides valuable information around the time the user
177 * spends within an action (e.g. - time spent on a level or viewing a page) or characteristics
178 * of an action (e.g. - Buy Event that has a Parameter of Widget with Value Golden Sword).
179 *
180 * @see #logEvent:withParameters: for details on storing events with parameters. \n
181 * #logEvent:timed: for details on storing timed events. \n
182 * #logEvent:withParameters:timed: for details on storing timed events with parameters. \n
183 * #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating
184 * parameters.
185 *
186 * @code
187 * - (void)interestingAppAction
188 {
189 [Flurry logEvent:@"Interesting_Action"];
190 // Perform interesting action
191 }
192 * @endcode
193 *
194 * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme
195 * that can be easily understood by non-technical people in your business domain.
196 */
197+ (void)logEvent:(NSString *)eventName;
198
199/*!
200 * @brief Records a custom parameterized event specified by @c eventName with @c parameters.
201 * @since 2.8.4
202 *
203 * This method overrides #logEvent to allow you to associate parameters with an event. Parameters
204 * are extremely valuable as they allow you to store characteristics of an action. For example,
205 * if a user purchased an item it may be helpful to know what level that user was on.
206 * By setting this parameter you will be able to view a distribution of levels for the purcahsed
207 * event on the <a href="http://dev.flurry.com">Flurrly Dev Portal</a>.
208 *
209 * @note You should not pass private or confidential information about your users in a
210 * custom event. \n
211 * A maximum of 10 parameter names may be associated with any event. Sending
212 * over 10 parameter names with a single event will result in no parameters being logged
213 * for that event. You may specify an infinite number of Parameter values. For example,
214 * a Search Box would have 1 parameter name (e.g. - Search Box) and many values, which would
215 * allow you to see what values users look for the most in your app. \n
216 * Where applicable, you should make a concerted effort to use timed events with
217 * parameters (#logEvent:withParameters:timed:). This provides valuable information
218 * around the time the user spends within an action (e.g. - time spent on a level or
219 * viewing a page).
220 *
221 * @see #logEvent:withParameters:timed: for details on storing timed events with parameters. \n
222 * #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating
223 * parameters.
224 *
225 * @code
226 * - (void)userPurchasedSomethingCool
227 {
228 NSDictionary *params =
229 [NSDictionary dictionaryWithObjectsAndKeys:@"Cool Item", // Parameter Value
230 @"Item Purchased", // Parameter Name
231 nil];
232 [Flurry logEvent:@"Something Cool Purchased" withParameters:params];
233 // Give user cool item
234 }
235 * @endcode
236 *
237 * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme
238 * that can be easily understood by non-technical people in your business domain.
239 * @param parameters A map containing Name-Value pairs of parameters.
240 */
241+ (void)logEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters;
242
243/*!
244 * @brief Records an app exception. Commonly used to catch unhandled exceptions.
245 * @since 2.7
246 *
247 * This method captures an exception for reporting to Flurry. We recommend adding an uncaught
248 * exception listener to capture any exceptions that occur during usage that is not
249 * anticipated by your app.
250 *
251 * @see #logError:message:error: for details on capturing errors.
252 *
253 * @code
254 * - (void) uncaughtExceptionHandler(NSException *exception)
255 {
256 [Flurry logError:@"Uncaught" message:@"Crash!" exception:exception];
257 }
258
259 - (void)applicationDidFinishLaunching:(UIApplication *)application
260 {
261 NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
262 [Flurry startSession:@"YOUR_API_KEY"];
263 // ....
264 }
265 * @endcode
266 *
267 * @param errorID Name of the error.
268 * @param message The message to associate with the error.
269 * @param exception The exception object to report.
270 */
271+ (void)logError:(NSString *)errorID message:(NSString *)message exception:(NSException *)exception;
272
273/*!
274 * @brief Records an app error.
275 * @since 2.7
276 *
277 * This method captures an error for reporting to Flurry.
278 *
279 * @see #logError:message:exception: for details on capturing exceptions.
280 *
281 * @code
282 * - (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
283 {
284 [Flurry logError:@"WebView No Load" message:[error localizedDescription] error:error];
285 }
286 * @endcode
287 *
288 * @param errorID Name of the error.
289 * @param message The message to associate with the error.
290 * @param error The error object to report.
291 */
292+ (void)logError:(NSString *)errorID message:(NSString *)message error:(NSError *)error;
293
294/*!
295 * @brief Records a timed event specified by @c eventName.
296 * @since 2.8.4
297 *
298 * This method overrides #logEvent to allow you to capture the length of an event. This can
299 * be extremely valuable to understand the level of engagement with a particular action. For
300 * example, you can capture how long a user spends on a level or reading an article.
301 *
302 * @note You should not pass private or confidential information about your users in a
303 * custom event. \n
304 * Where applicable, you should make a concerted effort to use parameters with your timed
305 * events (#logEvent:withParameters:timed:). This provides valuable information
306 * around the characteristics of an action (e.g. - Buy Event that has a Parameter of Widget with
307 * Value Golden Sword).
308 *
309 * @see #logEvent:withParameters:timed: for details on storing timed events with parameters. \n
310 * #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating
311 * parameters.
312 *
313 * @code
314 * - (void)startLevel
315 {
316 [Flurry logEvent:@"Level Played" timed:YES];
317 // Start user on level
318 }
319
320 - (void)endLevel
321 {
322 [Flurry endTimedEvent:@"Level Played" withParameters:nil];
323 // User done with level
324 }
325 * @endcode
326 *
327 * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme
328 * that can be easily understood by non-technical people in your business domain.
329 * @param timed Specifies the event will be timed.
330 */
331+ (void)logEvent:(NSString *)eventName timed:(BOOL)timed;
332
333/*!
334 * @brief Records a custom parameterized timed event specified by @c eventName with @c parameters.
335 * @since 2.8.4
336 *
337 * This method overrides #logEvent to allow you to capture the length of an event with parameters.
338 * This can be extremely valuable to understand the level of engagement with a particular action
339 * and the characteristics associated with that action. For example, you can capture how long a user
340 * spends on a level or reading an article. Parameters can be used to capture, for example, the
341 * author of an article or if something was purchased while on the level.
342 *
343 * @note You should not pass private or confidential information about your users in a
344 * custom event.
345 *
346 * @see #endTimedEvent:withParameters: for details on stopping a timed event and (optionally) updating
347 * parameters.
348 *
349 * @code
350 * - (void)startLevel
351 {
352 NSDictionary *params =
353 [NSDictionary dictionaryWithObjectsAndKeys:@"100", // Parameter Value
354 @"Current Points", // Parameter Name
355 nil];
356
357 [Flurry logEvent:@"Level Played" withParameters:params timed:YES];
358 // Start user on level
359 }
360
361 - (void)endLevel
362 {
363 // User gained additional 100 points in Level
364 NSDictionary *params =
365 [NSDictionary dictionaryWithObjectsAndKeys:@"200", // Parameter Value
366 @"Current Points", // Parameter Name
367 nil];
368 [Flurry endTimedEvent:@"Level Played" withParameters:params];
369 // User done with level
370 }
371 * @endcode
372 *
373 * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme
374 * that can be easily understood by non-technical people in your business domain.
375 * @param parameters A map containing Name-Value pairs of parameters.
376 * @param timed Specifies the event will be timed.
377 */
378+ (void)logEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters timed:(BOOL)timed;
379
380/*!
381 * @brief Ends a timed event specified by @c eventName and optionally updates parameters with @c parameters.
382 * @since 2.8.4
383 *
384 * This method ends an existing timed event. If parameters are provided, this will overwrite existing
385 * parameters with the same name or create new parameters if the name does not exist in the parameter
386 * map set by #logEvent:withParameters:timed:.
387 *
388 * @note You should not pass private or confidential information about your users in a
389 * custom event. \n
390 * If the app is backgrounded prior to ending a timed event, the Flurry SDK will automatically
391 * end the timer on the event. \n
392 * #endTimedEvent:withParameters: is ignored if called on a previously
393 * terminated event.
394 *
395 * @see #logEvent:withParameters:timed: for details on starting a timed event with parameters.
396 *
397 * @code
398 * - (void)startLevel
399 {
400 NSDictionary *params =
401 [NSDictionary dictionaryWithObjectsAndKeys:@"100", // Parameter Value
402 @"Current Points", // Parameter Name
403 nil];
404
405 [Flurry logEvent:@"Level Played" withParameters:params timed:YES];
406 // Start user on level
407 }
408
409 - (void)endLevel
410 {
411 // User gained additional 100 points in Level
412 NSDictionary *params =
413 [NSDictionary dictionaryWithObjectsAndKeys:@"200", // Parameter Value
414 @"Current Points", // Parameter Name
415 nil];
416 [Flurry endTimedEvent:@"Level Played" withParameters:params];
417 // User done with level
418 }
419 * @endcode
420 *
421 * @param eventName Name of the event. For maximum effectiveness, we recommend using a naming scheme
422 * that can be easily understood by non-technical people in your business domain.
423 * @param parameters A map containing Name-Value pairs of parameters.
424 */
425+ (void)endTimedEvent:(NSString *)eventName withParameters:(NSDictionary *)parameters; // non-nil parameters will update the parameters
426
427//@}
428
429
430/** @name Page View Methods
431 * Count page views.
432 */
433//@{
434
435/*!
436 * @brief Automatically track page views on a @c UINavigationController or @c UITabBarController.
437 * @since 2.7
438 *
439 * This method increments the page view count for a session based on traversing a UINavigationController
440 * or UITabBarController. The page view count is only a counter for the number of transitions in your
441 * app. It does not associate a name with the page count. To associate a name with a count of occurences
442 * see #logEvent:.
443 *
444 * @note Please make sure you assign the Tab and Navigation controllers to the view controllers before
445 * passing them to this method.
446 *
447 * @see #logPageView for details on explictly incrementing page view count.
448 *
449 * @code
450 * -(void) trackViewsFromTabBar:(UITabBarController*) tabBar
451 {
452 [Flurry logAllPageViews:tabBar];
453 }
454 * @endcode
455 *
456 * @param target The navigation or tab bar controller.
457 */
458+ (void)logAllPageViews:(id)target;
459
460/*!
461 * @brief Explicitly track a page view during a session.
462 * @since 2.7
463 *
464 * This method increments the page view count for a session when invoked. It does not associate a name
465 * with the page count. To associate a name with a count of occurences see #logEvent:.
466 *
467 * @see #logAllPageViews for details on automatically incrementing page view count based on user
468 * traversing navigation or tab bar controller.
469 *
470 * @code
471 * -(void) trackView
472 {
473 [Flurry logPageView];
474 }
475 * @endcode
476 *
477 */
478+ (void)logPageView;
479
480//@}
481
482/** @name User Info
483 * Methods to set user information.
484 */
485//@{
486
487/*!
488 * @brief Assign a unique id for a user in your app.
489 * @since 2.7
490 *
491 * @note Please be sure not to use this method to pass any private or confidential information
492 * about the user.
493 *
494 * @param userID The app id for a user.
495 */
496+ (void)setUserID:(NSString *)userID;
497
498/*!
499 * @brief Set your user's age in years.
500 * @since 2.7
501 *
502 * Use this method to capture the age of your user. Only use this method if you collect this
503 * information explictly from your user (i.e. - there is no need to set a default value).
504 *
505 * @note The age is aggregated across all users of your app and not available on a per user
506 * basis.
507 *
508 * @param age Reported age of user.
509 *
510 */
511+ (void)setAge:(int)age;
512
513/*!
514 * @brief Set your user's gender.
515 * @since 2.7
516 *
517 * Use this method to capture the gender of your user. Only use this method if you collect this
518 * information explictly from your user (i.e. - there is no need to set a default value). Allowable
519 * values are @c @"M" or @c @"F"
520 *
521 * @note The gender is aggregated across all users of your app and not available on a per user
522 * basis.
523 *
524 * @param gender Reported gender of user.
525 *
526 */
527+ (void)setGender:(NSString *)gender; // user's gender m or f
528
529//@}
530
531/** @name Location Reporting
532 * Methods for setting location information.
533 */
534//@{
535/*!
536 * @brief Set the location of the session.
537 * @since 2.7
538 *
539 * Use information from the CLLocationManager to specify the location of the session. Flurry does not
540 * automatically track this information or include the CLLocation framework.
541 *
542 * @note Only the last location entered is captured per session. \n
543 * Regardless of accuracy specified, the Flurry SDK will only report location at city level or higher. \n
544 * Location is aggregated across all users of your app and not available on a per user basis. \n
545 * This information should only be captured if it is germaine to the use of your app.
546 *
547 * @code
548 CLLocationManager *locationManager = [[CLLocationManager alloc] init];
549 [locationManager startUpdatingLocation];
550
551 CLLocation *location = locationManager.location;
552 [Flurry setLatitude:location.coordinate.latitude
553 longitude:location.coordinate.longitude
554 horizontalAccuracy:location.horizontalAccuracy
555 verticalAccuracy:location.verticalAccuracy];
556 * @endcode
557 * @param latitude The latitude.
558 * @param longitude The longitude.
559 * @param horizontalAccuracy The radius of uncertainty for the location in meters.
560 * @param verticalAccuracy The accuracy of the altitude value in meters.
561 *
562 */
563+ (void)setLatitude:(double)latitude longitude:(double)longitude horizontalAccuracy:(float)horizontalAccuracy verticalAccuracy:(float)verticalAccuracy;
564
565//@}
566
567/** @name Session Reporting Calls
568 * Optional methods that can be called at any point to control session reporting.
569 */
570//@{
571
572/*!
573 * @brief Set session to report when app closes.
574 * @since 2.7
575 *
576 * Use this method report session data when the app is closed. The default value is @c YES.
577 *
578 * @note This method is rarely invoked in iOS >= 3.2 due to the updated iOS lifecycle.
579 *
580 * @see #setSessionReportsOnPauseEnabled:
581 *
582 * @param sendSessionReportsOnClose YES to send on close, NO to omit reporting on close.
583 *
584 */
585+ (void)setSessionReportsOnCloseEnabled:(BOOL)sendSessionReportsOnClose;
586
587/*!
588 * @brief Set session to report when app is sent to the background.
589 * @since 2.7
590 *
591 * Use this method report session data when the app is paused. The default value is @c NO.
592 *
593 * @param setSessionReportsOnPauseEnabled YES to send on pause, NO to omit reporting on pause.
594 *
595 */
596+ (void)setSessionReportsOnPauseEnabled:(BOOL)setSessionReportsOnPauseEnabled;
597
598/*!
599 * @brief Enable custom event logging.
600 * @since 2.7
601 *
602 * Use this method to allow the capture of custom events. The default value is @c YES.
603 *
604 * @param value YES to enable event logging, NO to stop custom logging.
605 *
606 */
607+ (void)setEventLoggingEnabled:(BOOL)value;
608
609//@}
610
611@end
0612
=== added file 'Dependencies/Flurry/libFlurry.a'
1Binary files Dependencies/Flurry/libFlurry.a 1970-01-01 00:00:00 +0000 and Dependencies/Flurry/libFlurry.a 2013-02-11 04:20:26 +0000 differ613Binary files Dependencies/Flurry/libFlurry.a 1970-01-01 00:00:00 +0000 and Dependencies/Flurry/libFlurry.a 2013-02-11 04:20:26 +0000 differ
=== modified file 'Music/UOAppDelegate.m'
--- Music/UOAppDelegate.m 2013-02-08 17:05:40 +0000
+++ Music/UOAppDelegate.m 2013-02-11 04:20:26 +0000
@@ -56,6 +56,7 @@
5656
57- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {57- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {
58 [Crashlytics startWithAPIKey:@"0606692bafe724ed1413548f6211a8557140eade"];58 [Crashlytics startWithAPIKey:@"0606692bafe724ed1413548f6211a8557140eade"];
59 [Flurry startSession:@"BTQGJ5ZF8C7SMQG3GC5F"];
59 60
60 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds ]];61 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds ]];
6162
6263
=== modified file 'Music/View Controllers/AlbumViewController.m'
--- Music/View Controllers/AlbumViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/AlbumViewController.m 2013-02-11 04:20:26 +0000
@@ -34,10 +34,12 @@
34@synthesize artistId = _artistId;34@synthesize artistId = _artistId;
3535
36- (void)viewDidLoad {36- (void)viewDidLoad {
37 [super viewDidLoad];
37 [self.tableView setDataSource:self];38 [self.tableView setDataSource:self];
38}39}
3940
40- (void)viewWillAppear:(BOOL)animated {41- (void)viewWillAppear:(BOOL)animated {
42 [super viewWillAppear:animated];
41 [self fetchAlbum];43 [self fetchAlbum];
42 44
43 if ([[UOPlayer player] currentSong]) {45 if ([[UOPlayer player] currentSong]) {
@@ -69,6 +71,13 @@
69 } else {71 } else {
70 [[UOWebServiceController controller] updateSongs:self];72 [[UOWebServiceController controller] updateSongs:self];
71 }73 }
74
75 [Flurry logEvent:EVENT_ALBUM_VIEW timed:YES];
76}
77
78- (void)viewDidDisappear:(BOOL)animated {
79 [super viewDidDisappear:animated];
80 [Flurry endTimedEvent:EVENT_ALBUM_VIEW withParameters:nil];
72}81}
7382
74- (void)viewDidUnload {83- (void)viewDidUnload {
7584
=== modified file 'Music/View Controllers/AlbumsViewController.m'
--- Music/View Controllers/AlbumsViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/AlbumsViewController.m 2013-02-11 04:20:26 +0000
@@ -50,6 +50,18 @@
50 [[UOWebServiceController controller] updateAlbums:self clearCache:YES];50 [[UOWebServiceController controller] updateAlbums:self clearCache:YES];
51}51}
5252
53#pragma mark - View controller lifecycle
54
55- (void)viewWillAppear:(BOOL)animated {
56 [super viewWillAppear:animated];
57 [Flurry logEvent:EVENT_ALBUMS_VIEW timed:YES];
58}
59
60- (void)viewDidDisappear:(BOOL)animated {
61 [super viewDidDisappear:animated];
62 [Flurry endTimedEvent:EVENT_ALBUMS_VIEW withParameters:nil];
63}
64
53#pragma mark - Storyboard methods65#pragma mark - Storyboard methods
5466
55- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {67- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
5668
=== modified file 'Music/View Controllers/ArtistViewController.m'
--- Music/View Controllers/ArtistViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/ArtistViewController.m 2013-02-11 04:20:26 +0000
@@ -35,6 +35,7 @@
35@synthesize artistId = _artistId;35@synthesize artistId = _artistId;
3636
37- (void)viewDidLoad {37- (void)viewDidLoad {
38 [super viewDidLoad];
38 [self.tableView setDataSource:self];39 [self.tableView setDataSource:self];
39}40}
4041
@@ -63,6 +64,14 @@
63 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" ascending:NO];64 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" ascending:NO];
64 tableData = [artist.albums sortedArrayUsingDescriptors:@[sortDescriptor]];65 tableData = [artist.albums sortedArrayUsingDescriptors:@[sortDescriptor]];
65 [self.tableView reloadData];66 [self.tableView reloadData];
67
68 [super viewWillAppear:animated];
69 [Flurry logEvent:EVENT_ARTIST_VIEW timed:YES];
70}
71
72- (void)viewDidDisappear:(BOOL)animated {
73 [super viewDidDisappear:animated];
74 [Flurry endTimedEvent:EVENT_ARTIST_VIEW withParameters:nil];
66}75}
6776
68- (void)viewDidUnload {77- (void)viewDidUnload {
6978
=== modified file 'Music/View Controllers/ArtistsViewController.m'
--- Music/View Controllers/ArtistsViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/ArtistsViewController.m 2013-02-11 04:20:26 +0000
@@ -53,6 +53,18 @@
53 [[UOWebServiceController controller] updateArtists:self clearCache:YES];53 [[UOWebServiceController controller] updateArtists:self clearCache:YES];
54}54}
5555
56#pragma mark - View controller lifecycle
57
58- (void)viewWillAppear:(BOOL)animated {
59 [super viewWillAppear:animated];
60 [Flurry logEvent:EVENT_ARTISTS_VIEW timed:YES];
61}
62
63- (void)viewDidDisappear:(BOOL)animated {
64 [super viewDidDisappear:animated];
65 [Flurry endTimedEvent:EVENT_ARTISTS_VIEW withParameters:nil];
66}
67
56#pragma mark - Storyboard methods68#pragma mark - Storyboard methods
5769
58- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {70- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
5971
=== modified file 'Music/View Controllers/PlayerViewController.m'
--- Music/View Controllers/PlayerViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/PlayerViewController.m 2013-02-11 04:20:26 +0000
@@ -41,6 +41,7 @@
41 [self updateCurrentSong];41 [self updateCurrentSong];
42 42
43 heartbeat = [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(heartbeat:) userInfo:nil repeats:YES];43 heartbeat = [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(heartbeat:) userInfo:nil repeats:YES];
44 [Flurry logEvent:EVENT_PLAYER_VIEW timed:YES];
44}45}
4546
46- (void)viewDidDisappear:(BOOL)animated {47- (void)viewDidDisappear:(BOOL)animated {
@@ -51,6 +52,8 @@
51 52
52 [heartbeat invalidate];53 [heartbeat invalidate];
53 heartbeat = nil;54 heartbeat = nil;
55
56 [Flurry endTimedEvent:EVENT_PLAYER_VIEW withParameters:nil];
54}57}
5558
56- (void)viewDidUnload {59- (void)viewDidUnload {
5760
=== modified file 'Music/View Controllers/PlaylistsViewController.m'
--- Music/View Controllers/PlaylistsViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/PlaylistsViewController.m 2013-02-11 04:20:26 +0000
@@ -49,4 +49,16 @@
49 [[UOWebServiceController controller] updatePlaylists:self clearCache:YES];49 [[UOWebServiceController controller] updatePlaylists:self clearCache:YES];
50}50}
5151
52#pragma mark - View controller lifecycle
53
54- (void)viewWillAppear:(BOOL)animated {
55 [super viewWillAppear:animated];
56 [Flurry logEvent:EVENT_PLAYLISTS_VIEW timed:YES];
57}
58
59- (void)viewDidDisappear:(BOOL)animated {
60 [super viewDidDisappear:animated];
61 [Flurry endTimedEvent:EVENT_PLAYLISTS_VIEW withParameters:nil];
62}
63
52@end64@end
5365
=== modified file 'Music/View Controllers/SettingsAuthenticationViewController.m'
--- Music/View Controllers/SettingsAuthenticationViewController.m 2013-01-26 02:37:04 +0000
+++ Music/View Controllers/SettingsAuthenticationViewController.m 2013-02-11 04:20:26 +0000
@@ -92,6 +92,18 @@
92 [self.spinner setHidden:YES];92 [self.spinner setHidden:YES];
93}93}
9494
95#pragma mark - View controller lifecycle
96
97- (void)viewWillAppear:(BOOL)animated {
98 [super viewWillAppear:animated];
99 [Flurry logEvent:EVENT_AUTHENTICATION_VIEW timed:YES];
100}
101
102- (void)viewDidDisappear:(BOOL)animated {
103 [super viewDidDisappear:animated];
104 [Flurry endTimedEvent:EVENT_AUTHENTICATION_VIEW withParameters:nil];
105}
106
95#pragma mark - Private methods107#pragma mark - Private methods
96108
97- (void)showAlert:(NSString *)message {109- (void)showAlert:(NSString *)message {
98110
=== modified file 'Music/View Controllers/SettingsViewController.m'
--- Music/View Controllers/SettingsViewController.m 2013-01-28 17:21:44 +0000
+++ Music/View Controllers/SettingsViewController.m 2013-02-11 04:20:26 +0000
@@ -23,6 +23,18 @@
2323
24@implementation SettingsViewController24@implementation SettingsViewController
2525
26#pragma mark - View controller lifecycle
27
28- (void)viewWillAppear:(BOOL)animated {
29 [super viewWillAppear:animated];
30 [Flurry logEvent:EVENT_SETTINGS_VIEW timed:YES];
31}
32
33- (void)viewDidDisappear:(BOOL)animated {
34 [super viewDidDisappear:animated];
35 [Flurry endTimedEvent:EVENT_SETTINGS_VIEW withParameters:nil];
36}
37
26- (void)viewDidAppear:(BOOL)animated {38- (void)viewDidAppear:(BOOL)animated {
27 [super viewDidAppear:animated];39 [super viewDidAppear:animated];
28 40
2941
=== modified file 'Music/View Controllers/SongsViewController.m'
--- Music/View Controllers/SongsViewController.m 2013-02-11 04:20:26 +0000
+++ Music/View Controllers/SongsViewController.m 2013-02-11 04:20:26 +0000
@@ -50,6 +50,18 @@
50 [[UOWebServiceController controller] updateSongs:self clearCache:YES];50 [[UOWebServiceController controller] updateSongs:self clearCache:YES];
51}51}
5252
53#pragma mark - View controller lifecycle
54
55- (void)viewWillAppear:(BOOL)animated {
56 [super viewWillAppear:animated];
57 [Flurry logEvent:EVENT_SONGS_VIEW timed:YES];
58}
59
60- (void)viewDidDisappear:(BOOL)animated {
61 [super viewDidDisappear:animated];
62 [Flurry endTimedEvent:EVENT_SONGS_VIEW withParameters:nil];
63}
64
53#pragma mark - UIStoryboard methods65#pragma mark - UIStoryboard methods
5466
55- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {67- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
5668
=== modified file 'U1Music.xcodeproj/project.pbxproj'
--- U1Music.xcodeproj/project.pbxproj 2013-02-11 04:20:26 +0000
+++ U1Music.xcodeproj/project.pbxproj 2013-02-11 04:20:26 +0000
@@ -10,6 +10,7 @@
10 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };10 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
11 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };11 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
12 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; };12 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; };
13 5207A4C216C89B140006A4E6 /* libFlurry.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5207A4C116C89B140006A4E6 /* libFlurry.a */; };
13 520BBF2416B51F2A00307F32 /* UODownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 520BBF2316B51F2A00307F32 /* UODownloader.m */; };14 520BBF2416B51F2A00307F32 /* UODownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 520BBF2316B51F2A00307F32 /* UODownloader.m */; };
14 52169C9815D95DD100ED366D /* cancel-grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 52169C9415D95DD100ED366D /* cancel-grey.png */; };15 52169C9815D95DD100ED366D /* cancel-grey.png in Resources */ = {isa = PBXBuildFile; fileRef = 52169C9415D95DD100ED366D /* cancel-grey.png */; };
15 52169C9915D95DD100ED366D /* cancel-grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 52169C9515D95DD100ED366D /* cancel-grey@2x.png */; };16 52169C9915D95DD100ED366D /* cancel-grey@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 52169C9515D95DD100ED366D /* cancel-grey@2x.png */; };
@@ -32,9 +33,9 @@
32 5257415416C37E1A00530CCC /* SSPullToRefreshDefaultContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257414F16C37E1A00530CCC /* SSPullToRefreshDefaultContentView.m */; };33 5257415416C37E1A00530CCC /* SSPullToRefreshDefaultContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257414F16C37E1A00530CCC /* SSPullToRefreshDefaultContentView.m */; };
33 5257415516C37E1A00530CCC /* SSPullToRefreshSimpleContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257415116C37E1A00530CCC /* SSPullToRefreshSimpleContentView.m */; };34 5257415516C37E1A00530CCC /* SSPullToRefreshSimpleContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257415116C37E1A00530CCC /* SSPullToRefreshSimpleContentView.m */; };
34 5257415616C37E1A00530CCC /* SSPullToRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257415316C37E1A00530CCC /* SSPullToRefreshView.m */; };35 5257415616C37E1A00530CCC /* SSPullToRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257415316C37E1A00530CCC /* SSPullToRefreshView.m */; };
36 5257416D16C5653100530CCC /* Crashlytics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5257416C16C5653100530CCC /* Crashlytics.framework */; };
35 5257417716C5CC5D00530CCC /* NSString+UbuntuOne.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257417616C5CC5D00530CCC /* NSString+UbuntuOne.m */; };37 5257417716C5CC5D00530CCC /* NSString+UbuntuOne.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257417616C5CC5D00530CCC /* NSString+UbuntuOne.m */; };
36 5257417A16C5CDA900530CCC /* UIImageView+UbuntuOne.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257417916C5CDA900530CCC /* UIImageView+UbuntuOne.m */; };38 5257417A16C5CDA900530CCC /* UIImageView+UbuntuOne.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257417916C5CDA900530CCC /* UIImageView+UbuntuOne.m */; };
37 5257416D16C5653100530CCC /* Crashlytics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5257416C16C5653100530CCC /* Crashlytics.framework */; };
38 5268509716AE5267001F65A6 /* libRestKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5268509016AE516C001F65A6 /* libRestKit.a */; };39 5268509716AE5267001F65A6 /* libRestKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5268509016AE516C001F65A6 /* libRestKit.a */; };
39 526850A816AEE4E1001F65A6 /* Storyboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 526850A516AEE4E1001F65A6 /* Storyboard_iPhone.storyboard */; };40 526850A816AEE4E1001F65A6 /* Storyboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 526850A516AEE4E1001F65A6 /* Storyboard_iPhone.storyboard */; };
40 526850A916AEE4E1001F65A6 /* UOAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 526850A716AEE4E1001F65A6 /* UOAppDelegate.m */; };41 526850A916AEE4E1001F65A6 /* UOAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 526850A716AEE4E1001F65A6 /* UOAppDelegate.m */; };
@@ -256,6 +257,8 @@
256 1D6058910D05DD3D006BFB54 /* U1 Music.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "U1 Music.app"; sourceTree = BUILT_PRODUCTS_DIR; };257 1D6058910D05DD3D006BFB54 /* U1 Music.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "U1 Music.app"; sourceTree = BUILT_PRODUCTS_DIR; };
257 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };258 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
258 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };259 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
260 5207A4C016C89B140006A4E6 /* Flurry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Flurry.h; sourceTree = "<group>"; };
261 5207A4C116C89B140006A4E6 /* libFlurry.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libFlurry.a; sourceTree = "<group>"; };
259 520BBF2216B51F2A00307F32 /* UODownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UODownloader.h; sourceTree = "<group>"; };262 520BBF2216B51F2A00307F32 /* UODownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UODownloader.h; sourceTree = "<group>"; };
260 520BBF2316B51F2A00307F32 /* UODownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UODownloader.m; sourceTree = "<group>"; };263 520BBF2316B51F2A00307F32 /* UODownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UODownloader.m; sourceTree = "<group>"; };
261 52169C9415D95DD100ED366D /* cancel-grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cancel-grey.png"; sourceTree = "<group>"; };264 52169C9415D95DD100ED366D /* cancel-grey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cancel-grey.png"; sourceTree = "<group>"; };
@@ -287,11 +290,11 @@
287 5257415116C37E1A00530CCC /* SSPullToRefreshSimpleContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSPullToRefreshSimpleContentView.m; sourceTree = "<group>"; };290 5257415116C37E1A00530CCC /* SSPullToRefreshSimpleContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSPullToRefreshSimpleContentView.m; sourceTree = "<group>"; };
288 5257415216C37E1A00530CCC /* SSPullToRefreshView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSPullToRefreshView.h; sourceTree = "<group>"; };291 5257415216C37E1A00530CCC /* SSPullToRefreshView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSPullToRefreshView.h; sourceTree = "<group>"; };
289 5257415316C37E1A00530CCC /* SSPullToRefreshView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSPullToRefreshView.m; sourceTree = "<group>"; };292 5257415316C37E1A00530CCC /* SSPullToRefreshView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSPullToRefreshView.m; sourceTree = "<group>"; };
293 5257416C16C5653100530CCC /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = "<group>"; };
290 5257417516C5CC5D00530CCC /* NSString+UbuntuOne.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+UbuntuOne.h"; path = "Categories/NSString+UbuntuOne.h"; sourceTree = "<group>"; };294 5257417516C5CC5D00530CCC /* NSString+UbuntuOne.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+UbuntuOne.h"; path = "Categories/NSString+UbuntuOne.h"; sourceTree = "<group>"; };
291 5257417616C5CC5D00530CCC /* NSString+UbuntuOne.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+UbuntuOne.m"; path = "Categories/NSString+UbuntuOne.m"; sourceTree = "<group>"; };295 5257417616C5CC5D00530CCC /* NSString+UbuntuOne.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+UbuntuOne.m"; path = "Categories/NSString+UbuntuOne.m"; sourceTree = "<group>"; };
292 5257417816C5CDA900530CCC /* UIImageView+UbuntuOne.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImageView+UbuntuOne.h"; path = "Categories/UIImageView+UbuntuOne.h"; sourceTree = "<group>"; };296 5257417816C5CDA900530CCC /* UIImageView+UbuntuOne.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImageView+UbuntuOne.h"; path = "Categories/UIImageView+UbuntuOne.h"; sourceTree = "<group>"; };
293 5257417916C5CDA900530CCC /* UIImageView+UbuntuOne.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+UbuntuOne.m"; path = "Categories/UIImageView+UbuntuOne.m"; sourceTree = "<group>"; };297 5257417916C5CDA900530CCC /* UIImageView+UbuntuOne.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+UbuntuOne.m"; path = "Categories/UIImageView+UbuntuOne.m"; sourceTree = "<group>"; };
294 5257416C16C5653100530CCC /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = "<group>"; };
295 5268508516AE516B001F65A6 /* RestKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RestKit.xcodeproj; path = ../RestKit/RestKit.xcodeproj; sourceTree = "<group>"; };298 5268508516AE516B001F65A6 /* RestKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RestKit.xcodeproj; path = ../RestKit/RestKit.xcodeproj; sourceTree = "<group>"; };
296 526850A516AEE4E1001F65A6 /* Storyboard_iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard_iPhone.storyboard; sourceTree = "<group>"; };299 526850A516AEE4E1001F65A6 /* Storyboard_iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard_iPhone.storyboard; sourceTree = "<group>"; };
297 526850A616AEE4E1001F65A6 /* UOAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UOAppDelegate.h; sourceTree = "<group>"; };300 526850A616AEE4E1001F65A6 /* UOAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UOAppDelegate.h; sourceTree = "<group>"; };
@@ -640,6 +643,7 @@
640 5268509716AE5267001F65A6 /* libRestKit.a in Frameworks */,643 5268509716AE5267001F65A6 /* libRestKit.a in Frameworks */,
641 52E7F4A316AF1522003A46DA /* UbuntuOneAuthKit.a in Frameworks */,644 52E7F4A316AF1522003A46DA /* UbuntuOneAuthKit.a in Frameworks */,
642 5257416D16C5653100530CCC /* Crashlytics.framework in Frameworks */,645 5257416D16C5653100530CCC /* Crashlytics.framework in Frameworks */,
646 5207A4C216C89B140006A4E6 /* libFlurry.a in Frameworks */,
643 );647 );
644 runOnlyForDeploymentPostprocessing = 0;648 runOnlyForDeploymentPostprocessing = 0;
645 };649 };
@@ -672,7 +676,6 @@
672 29B97317FDCFA39411CA2CEA /* Resources */,676 29B97317FDCFA39411CA2CEA /* Resources */,
673 964FA39013CA5BE60018A65B /* Dependencies */,677 964FA39013CA5BE60018A65B /* Dependencies */,
674 29B97323FDCFA39411CA2CEA /* Frameworks */,678 29B97323FDCFA39411CA2CEA /* Frameworks */,
675 5279764815F00B2600F8435F /* libz.dylib */,
676 19C28FACFE9D520D11CA2CBB /* Products */,679 19C28FACFE9D520D11CA2CBB /* Products */,
677 );680 );
678 name = CustomTemplate;681 name = CustomTemplate;
@@ -690,6 +693,7 @@
690 29B97323FDCFA39411CA2CEA /* Frameworks */ = {693 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
691 isa = PBXGroup;694 isa = PBXGroup;
692 children = (695 children = (
696 5279764815F00B2600F8435F /* libz.dylib */,
693 5257416C16C5653100530CCC /* Crashlytics.framework */,697 5257416C16C5653100530CCC /* Crashlytics.framework */,
694 5268510716AEFD20001F65A6 /* MobileCoreServices.framework */,698 5268510716AEFD20001F65A6 /* MobileCoreServices.framework */,
695 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,699 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
@@ -707,6 +711,16 @@
707 name = Frameworks;711 name = Frameworks;
708 sourceTree = "<group>";712 sourceTree = "<group>";
709 };713 };
714 5207A4BF16C89B140006A4E6 /* Flurry */ = {
715 isa = PBXGroup;
716 children = (
717 5207A4C016C89B140006A4E6 /* Flurry.h */,
718 5207A4C116C89B140006A4E6 /* libFlurry.a */,
719 );
720 name = Flurry;
721 path = Dependencies/Flurry;
722 sourceTree = "<group>";
723 };
710 522B24E716B4BBC30084B023 /* Controls */ = {724 522B24E716B4BBC30084B023 /* Controls */ = {
711 isa = PBXGroup;725 isa = PBXGroup;
712 children = (726 children = (
@@ -1299,6 +1313,7 @@
1299 964FA39013CA5BE60018A65B /* Dependencies */ = {1313 964FA39013CA5BE60018A65B /* Dependencies */ = {
1300 isa = PBXGroup;1314 isa = PBXGroup;
1301 children = (1315 children = (
1316 5207A4BF16C89B140006A4E6 /* Flurry */,
1302 5257414C16C37E1A00530CCC /* SSPullToRefresh */,1317 5257414C16C37E1A00530CCC /* SSPullToRefresh */,
1303 93BC520A124C187700B7587C /* SynthesizeSingleton.h */,1318 93BC520A124C187700B7587C /* SynthesizeSingleton.h */,
1304 91328278144E07EA00395F40 /* TestFlight SDK */,1319 91328278144E07EA00395F40 /* TestFlight SDK */,
@@ -1714,6 +1729,7 @@
1714 "$(inherited)",1729 "$(inherited)",
1715 "\"$(SRCROOT)/TestFlight SDK\"",1730 "\"$(SRCROOT)/TestFlight SDK\"",
1716 "$(BUILT_PRODUCTS_DIR)/**",1731 "$(BUILT_PRODUCTS_DIR)/**",
1732 "\"$(SRCROOT)/Dependencies/Flurry\"",
1717 );1733 );
1718 OTHER_LDFLAGS = "-ObjC";1734 OTHER_LDFLAGS = "-ObjC";
1719 PRODUCT_NAME = "U1 Music";1735 PRODUCT_NAME = "U1 Music";
@@ -1754,6 +1770,7 @@
1754 "$(inherited)",1770 "$(inherited)",
1755 "\"$(SRCROOT)/TestFlight SDK\"",1771 "\"$(SRCROOT)/TestFlight SDK\"",
1756 "$(BUILT_PRODUCTS_DIR)/**",1772 "$(BUILT_PRODUCTS_DIR)/**",
1773 "\"$(SRCROOT)/Dependencies/Flurry\"",
1757 );1774 );
1758 OTHER_LDFLAGS = "-ObjC";1775 OTHER_LDFLAGS = "-ObjC";
1759 PRODUCT_NAME = "U1 Music";1776 PRODUCT_NAME = "U1 Music";
17601777
=== modified file 'U1Music_Prefix.pch'
--- U1Music_Prefix.pch 2013-01-28 22:54:20 +0000
+++ U1Music_Prefix.pch 2013-02-11 04:20:26 +0000
@@ -21,10 +21,22 @@
21 #import "NSManagedObjectContext+Additions.h"21 #import "NSManagedObjectContext+Additions.h"
22 #import "NSString+Extras.h"22 #import "NSString+Extras.h"
23 #import "TestFlight.h"23 #import "TestFlight.h"
24 #import "Flurry.h"
24 #define RELEASE_SAFELY(__obj) [__obj release], __obj = nil;25 #define RELEASE_SAFELY(__obj) [__obj release], __obj = nil;
2526
26 #define UBUNTU_ONE_SERVICE_NAME @"com.ubuntu.one"27 #define UBUNTU_ONE_SERVICE_NAME @"com.ubuntu.one"
27 #define UBUNTU_ONE_DUMMY_USER_NAME @"_UBUNTU_ONE_USER_NAME"28 #define UBUNTU_ONE_DUMMY_USER_NAME @"_UBUNTU_ONE_USER_NAME"
2829
29 #define AUTHORIZATION_HEADER_KEY @"Authorization"30 #define AUTHORIZATION_HEADER_KEY @"Authorization"
31
32 #define EVENT_ALBUMS_VIEW @"AlbumsView"
33 #define EVENT_ARTISTS_VIEW @"ArtistsView"
34 #define EVENT_SONGS_VIEW @"SongsView"
35 #define EVENT_PLAYLISTS_VIEW @"PlaylistsView"
36 #define EVENT_SETTINGS_VIEW @"SettingsView"
37 #define EVENT_AUTHENTICATION_VIEW @"AuthenticationView"
38 #define EVENT_ALBUM_VIEW @"AlbumView"
39 #define EVENT_ARTIST_VIEW @"ArtistView"
40 #define EVENT_PLAYER_VIEW @"PlayerView"
41 #define EVENT_PLAYLIST_VIEW @"PlaylistView"
30#endif42#endif

Subscribers

People subscribed via source and target branches