From d4cb3098a27be8302a23b7c679aeb838f680035b Mon Sep 17 00:00:00 2001 From: Ty Smith Date: Wed, 27 May 2015 10:56:08 -0700 Subject: [PATCH] Initial commit for Open Sourcing Twitter --- CONTRIBUTING.md | 97 ++ LICENSE | 176 +++ README.md | 103 ++ build.gradle | 67 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52141 bytes gradle/wrapper/gradle-wrapper.properties | 23 + gradlew | 164 +++ gradlew.bat | 90 ++ samples/app/build.gradle | 68 + samples/app/fabric.properties.sample | 7 + samples/app/lint.xml | 27 + samples/app/src/main/AndroidManifest.xml | 81 ++ samples/app/src/main/ic_launcher-web.png | Bin 0 -> 47072 bytes .../java/com/example/app/MainActivity.java | 57 + .../com/example/app/SampleApplication.java | 47 + .../TweetComposerMainActivity.java | 52 + .../tweetui/CollectionTimelineFragment.java | 57 + .../app/tweetui/SearchTimelineFragment.java | 57 + .../example/app/tweetui/TimelineActivity.java | 104 ++ .../app/tweetui/TimelinesActivity.java | 96 ++ .../example/app/tweetui/TweetActivity.java | 126 ++ .../app/tweetui/TweetListActivity.java | 36 + .../app/tweetui/TweetListFragment.java | 86 ++ .../app/tweetui/TweetPreviewActivity.java | 132 ++ .../example/app/tweetui/TweetUiActivity.java | 45 + .../app/tweetui/TweetUiMainActivity.java | 92 ++ .../app/tweetui/UniqueTweetActivity.java | 84 ++ .../app/tweetui/UserTimelineFragment.java | 54 + .../example/app/tweetui/XmlTweetActivity.java | 39 + .../twittercore/TwitterCoreMainActivity.java | 83 ++ .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3476 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2534 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 4260 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 5864 bytes .../main/res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 7784 bytes .../src/main/res/layout/activity_frame.xml | 6 + .../app/src/main/res/layout/activity_main.xml | 55 + .../src/main/res/layout/activity_pager.xml | 19 + .../layout/tweetcomposer_activity_main.xml | 13 + .../main/res/layout/tweetui_activity_main.xml | 50 + .../res/layout/tweetui_fragment_tweet.xml | 13 + .../layout/tweetui_fragment_tweet_preview.xml | 40 + .../layout/tweetui_fragment_unique_tweet.xml | 108 ++ .../res/layout/tweetui_fragment_xml_tweet.xml | 79 ++ .../res/layout/tweetui_swipe_timeline.xml | 37 + .../src/main/res/layout/tweetui_timeline.xml | 21 + .../res/layout/twittercore_activity_main.xml | 14 + .../main/res/menu/activity_main_actions.xml | 22 + .../app/src/main/res/values-v11/themes.xml | 25 + .../app/src/main/res/values-v21/themes.xml | 26 + samples/app/src/main/res/values/colors.xml | 7 + samples/app/src/main/res/values/dimens.xml | 8 + samples/app/src/main/res/values/strings.xml | 48 + samples/app/src/main/res/values/styles.xml | 35 + samples/app/src/main/res/values/themes.xml | 25 + settings.gradle | 22 + tweet-composer/build.gradle | 61 + tweet-composer/changelog.md | 32 + tweet-composer/gradle.properties | 32 + tweet-composer/internal-build.gradle | 85 ++ tweet-composer/lint.xml | 19 + .../tweetcomposer/TweetComposerTest.java | 230 ++++ tweet-composer/src/main/AndroidManifest.xml | 26 + .../android/tweetcomposer/TweetComposer.java | 194 +++ ...tter.sdk.android.tweet-composer.properties | 20 + tweet-ui/build.gradle | 64 + tweet-ui/changelog.md | 196 +++ tweet-ui/gradle.properties | 32 + tweet-ui/internal-build.gradle | 93 ++ tweet-ui/lint.xml | 34 + tweet-ui/portlog.md | 25 + tweet-ui/proguard.txt | 2 + .../android/tweetui/AuthRequestQueueTest.java | 259 ++++ .../sdk/android/tweetui/BaseTimelineTest.java | 105 ++ .../android/tweetui/BaseTweetViewTest.java | 489 +++++++ .../android/tweetui/BaseTweetViewXmlTest.java | 294 ++++ .../tweetui/CollectionTimelineTest.java | 282 ++++ .../sdk/android/tweetui/ColorUtilsTest.java | 49 + .../android/tweetui/CompactTweetViewTest.java | 78 ++ .../tweetui/CompactTweetViewXmlTest.java | 39 + .../android/tweetui/DateTranslationsTest.java | 68 + .../tweetui/EnglishLocaleTestCase.java | 42 + .../android/tweetui/LoggingCallbackTest.java | 72 + .../OnShareButtonClickListenerTest.java | 93 ++ .../tweetui/ScribeEventFactoryTest.java | 58 + .../android/tweetui/SearchTimelineTest.java | 200 +++ .../twitter/sdk/android/tweetui/TestItem.java | 48 + .../android/tweetui/TimelineCursorTest.java | 43 + .../tweetui/TimelineListAdapterTest.java | 140 ++ .../android/tweetui/TweetDateUtilsTest.java | 132 ++ .../android/tweetui/TweetRepositoryTest.java | 50 + .../tweetui/TweetTextLinkifierTest.java | 172 +++ .../android/tweetui/TweetTextUtilsTest.java | 192 +++ .../tweetui/TweetTimelineListAdapterTest.java | 83 ++ .../tweetui/TweetUiBackgroundTest.java | 72 + .../sdk/android/tweetui/TweetUiTest.java | 106 ++ .../sdk/android/tweetui/TweetUiTestCase.java | 114 ++ .../sdk/android/tweetui/TweetUtilsTest.java | 228 +++ .../android/tweetui/TweetViewAdapterTest.java | 96 ++ .../tweetui/TweetViewFetchAdapterTest.java | 126 ++ .../sdk/android/tweetui/TweetViewTest.java | 105 ++ .../sdk/android/tweetui/TweetViewXmlTest.java | 52 + .../sdk/android/tweetui/UserTimelineTest.java | 197 +++ .../sdk/android/tweetui/UserUtilsTest.java | 59 + .../sdk/android/tweetui/UtilsTest.java | 114 ++ .../internal/ActiveSessionProviderTest.java | 72 + .../internal/TimelineDelegateTest.java | 618 +++++++++ .../internal/TimelineStateHolderTest.java | 135 ++ .../util/AspectRatioImageViewTest.java | 59 + tweet-ui/src/debug/AndroidManifest.xml | 33 + .../sdk/android/tweetui/EntityFactory.java | 30 + .../sdk/android/tweetui/MockUtils.java | 83 ++ .../sdk/android/tweetui/TestActivity.java | 30 + .../tweetui/TestCollectionTimeline.java | 40 + .../tweetui/TestDependencyProvider.java | 32 + .../sdk/android/tweetui/TestFixtures.java | 175 +++ .../android/tweetui/TestSearchTimeline.java | 40 + .../android/tweetui/TestTweetRepository.java | 29 + .../sdk/android/tweetui/TestTweetUi.java | 28 + .../sdk/android/tweetui/TestUserTimeline.java | 41 + .../sdk/android/tweetui/TestUtils.java | 63 + .../sdk/android/tweetui/TweetAsserts.java | 84 ++ .../activity_aspect_ratio_image_view_test.xml | 44 + .../res/layout/activity_invalid_tweet_id.xml | 32 + .../res/layout/activity_tweet_view_test.xml | 55 + tweet-ui/src/main/AndroidManifest.xml | 26 + .../sdk/android/tweetui/ApiCallback.java | 66 + .../sdk/android/tweetui/AuthRequestQueue.java | 166 +++ .../sdk/android/tweetui/BaseTimeline.java | 96 ++ .../sdk/android/tweetui/BaseTweetView.java | 812 +++++++++++ .../android/tweetui/CollectionTimeline.java | 227 +++ .../sdk/android/tweetui/ColorUtils.java | 68 + .../sdk/android/tweetui/CompactTweetView.java | 95 ++ .../android/tweetui/FormattedMediaEntity.java | 31 + .../android/tweetui/FormattedTweetText.java | 37 + .../android/tweetui/FormattedUrlEntity.java | 34 + .../android/tweetui/LinkClickListener.java | 38 + .../sdk/android/tweetui/LoadCallback.java | 30 + .../sdk/android/tweetui/LoggingCallback.java | 54 + .../tweetui/OnShareButtonClickListener.java | 74 + .../sdk/android/tweetui/Repository.java | 38 + .../android/tweetui/ScribeEventFactory.java | 34 + .../sdk/android/tweetui/SearchTimeline.java | 195 +++ .../tweetui/SyndicationClientEvent.java | 74 + .../twitter/sdk/android/tweetui/Timeline.java | 42 + .../sdk/android/tweetui/TimelineCursor.java | 50 + .../android/tweetui/TimelineListAdapter.java | 94 ++ .../sdk/android/tweetui/TimelineResult.java | 40 + .../sdk/android/tweetui/TweetDateUtils.java | 110 ++ .../sdk/android/tweetui/TweetRepository.java | 192 +++ .../android/tweetui/TweetTextLinkifier.java | 183 +++ .../sdk/android/tweetui/TweetTextUtils.java | 228 +++ .../tweetui/TweetTimelineListAdapter.java | 61 + .../twitter/sdk/android/tweetui/TweetUi.java | 183 +++ .../sdk/android/tweetui/TweetUtils.java | 148 ++ .../sdk/android/tweetui/TweetView.java | 155 +++ .../sdk/android/tweetui/TweetViewAdapter.java | 109 ++ .../tweetui/TweetViewFetchAdapter.java | 96 ++ .../sdk/android/tweetui/UserTimeline.java | 213 +++ .../sdk/android/tweetui/UserUtils.java | 84 ++ .../twitter/sdk/android/tweetui/Utils.java | 72 + .../internal/ActiveSessionProvider.java | 49 + .../tweetui/internal/TimelineDelegate.java | 312 +++++ .../tweetui/internal/TimelineStateHolder.java | 112 ++ .../internal/util/AspectRatioImageView.java | 81 ++ .../tweetui/internal/util/HtmlEntities.java | 1225 +++++++++++++++++ .../tweetui/internal/util/IntHashMap.java | 391 ++++++ .../res/drawable-hdpi/tw__ic_logo_blue.png | Bin 0 -> 529 bytes .../res/drawable-hdpi/tw__ic_logo_white.png | Bin 0 -> 1311 bytes .../res/drawable-hdpi/tw__ic_retweet_dark.png | Bin 0 -> 1461 bytes .../drawable-hdpi/tw__ic_retweet_light.png | Bin 0 -> 1560 bytes .../tw__ic_tweet_photo_error_dark.png | Bin 0 -> 1161 bytes .../tw__ic_tweet_photo_error_light.png | Bin 0 -> 1070 bytes .../drawable-hdpi/tw__ic_tweet_verified.png | Bin 0 -> 597 bytes .../res/drawable-mdpi/tw__ic_logo_blue.png | Bin 0 -> 361 bytes .../res/drawable-mdpi/tw__ic_logo_white.png | Bin 0 -> 1146 bytes .../res/drawable-mdpi/tw__ic_retweet_dark.png | Bin 0 -> 1072 bytes .../drawable-mdpi/tw__ic_retweet_light.png | Bin 0 -> 1107 bytes .../tw__ic_tweet_photo_error_dark.png | Bin 0 -> 888 bytes .../tw__ic_tweet_photo_error_light.png | Bin 0 -> 737 bytes .../drawable-mdpi/tw__ic_tweet_verified.png | Bin 0 -> 450 bytes .../res/drawable-xhdpi/tw__ic_logo_blue.png | Bin 0 -> 676 bytes .../res/drawable-xhdpi/tw__ic_logo_white.png | Bin 0 -> 1448 bytes .../drawable-xhdpi/tw__ic_retweet_dark.png | Bin 0 -> 1806 bytes .../drawable-xhdpi/tw__ic_retweet_light.png | Bin 0 -> 2006 bytes .../tw__ic_tweet_photo_error_dark.png | Bin 0 -> 1638 bytes .../tw__ic_tweet_photo_error_light.png | Bin 0 -> 1435 bytes .../drawable-xhdpi/tw__ic_tweet_verified.png | Bin 0 -> 729 bytes .../res/drawable-xxhdpi/tw__ic_logo_blue.png | Bin 0 -> 977 bytes .../res/drawable-xxhdpi/tw__ic_logo_white.png | Bin 0 -> 1741 bytes .../drawable-xxhdpi/tw__ic_retweet_dark.png | Bin 0 -> 709 bytes .../drawable-xxhdpi/tw__ic_retweet_light.png | Bin 0 -> 724 bytes .../tw__ic_tweet_photo_error_dark.png | Bin 0 -> 2426 bytes .../tw__ic_tweet_photo_error_light.png | Bin 0 -> 2095 bytes .../drawable-xxhdpi/tw__ic_tweet_verified.png | Bin 0 -> 1035 bytes .../src/main/res/drawable/tw__bg_tweet.xml | 24 + .../res/drawable/tw__bg_tweet_compact.xml | 21 + tweet-ui/src/main/res/layout/tw__tweet.xml | 104 ++ .../src/main/res/layout/tw__tweet_compact.xml | 87 ++ .../src/main/res/values-ar/const_strings.xml | 22 + tweet-ui/src/main/res/values-ar/plurals.xml | 33 + tweet-ui/src/main/res/values-ar/strings.xml | 27 + tweet-ui/src/main/res/values-bn/plurals.xml | 33 + tweet-ui/src/main/res/values-bn/strings.xml | 27 + tweet-ui/src/main/res/values-cs/plurals.xml | 33 + tweet-ui/src/main/res/values-cs/strings.xml | 27 + .../src/main/res/values-da/const_strings.xml | 22 + tweet-ui/src/main/res/values-da/plurals.xml | 33 + tweet-ui/src/main/res/values-da/strings.xml | 27 + .../src/main/res/values-de/const_strings.xml | 22 + tweet-ui/src/main/res/values-de/plurals.xml | 33 + tweet-ui/src/main/res/values-de/strings.xml | 27 + .../main/res/values-en-rGB/const_strings.xml | 22 + .../src/main/res/values-en-rGB/plurals.xml | 33 + .../src/main/res/values-en-rGB/strings.xml | 26 + .../main/res/values-en-rSS/const_strings.xml | 22 + .../src/main/res/values-en-rSS/plurals.xml | 33 + .../src/main/res/values-en-rSS/strings.xml | 27 + .../main/res/values-en-rXX/const_strings.xml | 22 + .../src/main/res/values-en-rXX/plurals.xml | 33 + .../src/main/res/values-en-rXX/strings.xml | 27 + .../src/main/res/values-es/const_strings.xml | 22 + tweet-ui/src/main/res/values-es/plurals.xml | 33 + tweet-ui/src/main/res/values-es/strings.xml | 27 + .../src/main/res/values-fa/const_strings.xml | 22 + tweet-ui/src/main/res/values-fa/plurals.xml | 33 + tweet-ui/src/main/res/values-fa/strings.xml | 27 + .../src/main/res/values-fi/const_strings.xml | 22 + tweet-ui/src/main/res/values-fi/plurals.xml | 33 + tweet-ui/src/main/res/values-fi/strings.xml | 27 + .../src/main/res/values-fr/const_strings.xml | 22 + tweet-ui/src/main/res/values-fr/plurals.xml | 33 + tweet-ui/src/main/res/values-fr/strings.xml | 27 + .../src/main/res/values-hi/const_strings.xml | 22 + tweet-ui/src/main/res/values-hi/plurals.xml | 33 + tweet-ui/src/main/res/values-hi/strings.xml | 27 + .../src/main/res/values-hu/const_strings.xml | 22 + tweet-ui/src/main/res/values-hu/plurals.xml | 33 + tweet-ui/src/main/res/values-hu/strings.xml | 27 + .../src/main/res/values-in/const_strings.xml | 22 + tweet-ui/src/main/res/values-in/plurals.xml | 33 + tweet-ui/src/main/res/values-in/strings.xml | 27 + .../src/main/res/values-it/const_strings.xml | 22 + tweet-ui/src/main/res/values-it/plurals.xml | 33 + tweet-ui/src/main/res/values-it/strings.xml | 27 + .../src/main/res/values-iw/const_strings.xml | 22 + tweet-ui/src/main/res/values-iw/plurals.xml | 33 + tweet-ui/src/main/res/values-iw/strings.xml | 22 + .../src/main/res/values-ja/const_strings.xml | 22 + tweet-ui/src/main/res/values-ja/plurals.xml | 33 + tweet-ui/src/main/res/values-ja/strings.xml | 27 + .../src/main/res/values-ko/const_strings.xml | 22 + tweet-ui/src/main/res/values-ko/plurals.xml | 33 + tweet-ui/src/main/res/values-ko/strings.xml | 27 + .../src/main/res/values-ms/const_strings.xml | 22 + tweet-ui/src/main/res/values-ms/plurals.xml | 33 + tweet-ui/src/main/res/values-ms/strings.xml | 27 + .../src/main/res/values-nb/const_strings.xml | 22 + tweet-ui/src/main/res/values-nb/plurals.xml | 33 + tweet-ui/src/main/res/values-nb/strings.xml | 27 + .../src/main/res/values-nl/const_strings.xml | 22 + tweet-ui/src/main/res/values-nl/plurals.xml | 33 + tweet-ui/src/main/res/values-nl/strings.xml | 27 + .../src/main/res/values-pl/const_strings.xml | 22 + tweet-ui/src/main/res/values-pl/plurals.xml | 33 + tweet-ui/src/main/res/values-pl/strings.xml | 27 + .../src/main/res/values-pt/const_strings.xml | 22 + tweet-ui/src/main/res/values-pt/plurals.xml | 33 + tweet-ui/src/main/res/values-pt/strings.xml | 27 + tweet-ui/src/main/res/values-ro/plurals.xml | 33 + tweet-ui/src/main/res/values-ro/strings.xml | 27 + .../src/main/res/values-ru/const_strings.xml | 22 + tweet-ui/src/main/res/values-ru/plurals.xml | 33 + tweet-ui/src/main/res/values-ru/strings.xml | 27 + .../src/main/res/values-sv/const_strings.xml | 22 + tweet-ui/src/main/res/values-sv/plurals.xml | 33 + tweet-ui/src/main/res/values-sv/strings.xml | 27 + .../src/main/res/values-th/const_strings.xml | 22 + tweet-ui/src/main/res/values-th/plurals.xml | 33 + tweet-ui/src/main/res/values-th/strings.xml | 27 + .../src/main/res/values-tl/const_strings.xml | 22 + tweet-ui/src/main/res/values-tl/plurals.xml | 33 + tweet-ui/src/main/res/values-tl/strings.xml | 27 + .../src/main/res/values-tr/const_strings.xml | 22 + tweet-ui/src/main/res/values-tr/plurals.xml | 33 + tweet-ui/src/main/res/values-tr/strings.xml | 27 + tweet-ui/src/main/res/values-uk/plurals.xml | 33 + tweet-ui/src/main/res/values-uk/strings.xml | 27 + .../src/main/res/values-ur/const_strings.xml | 22 + tweet-ui/src/main/res/values-ur/plurals.xml | 33 + tweet-ui/src/main/res/values-ur/strings.xml | 22 + .../res/values-v16/tw__tweet_text_styles.xml | 27 + .../res/values-v21/tw_tweet_text_styles.xml | 26 + tweet-ui/src/main/res/values-vi/plurals.xml | 33 + tweet-ui/src/main/res/values-vi/strings.xml | 27 + .../main/res/values-zh-rCN/const_strings.xml | 22 + .../src/main/res/values-zh-rCN/plurals.xml | 33 + .../src/main/res/values-zh-rCN/strings.xml | 27 + .../main/res/values-zh-rTW/const_strings.xml | 22 + .../src/main/res/values-zh-rTW/plurals.xml | 33 + .../src/main/res/values-zh-rTW/strings.xml | 22 + tweet-ui/src/main/res/values/attrs.xml | 33 + tweet-ui/src/main/res/values/colors.xml | 30 + .../src/main/res/values/const_strings.xml | 24 + tweet-ui/src/main/res/values/dimens.xml | 113 ++ tweet-ui/src/main/res/values/plurals.xml | 34 + tweet-ui/src/main/res/values/strings.xml | 32 + tweet-ui/src/main/res/values/styles.xml | 33 + .../res/values/tw__tweet_layout_styles.xml | 37 + .../res/values/tw__tweet_media_styles.xml | 84 ++ .../main/res/values/tw__tweet_text_styles.xml | 165 +++ ...om.twitter.sdk.android.tweet-ui.properties | 20 + twitter-core/README.md | 25 + twitter-core/build.gradle | 97 ++ twitter-core/changelog.md | 187 +++ twitter-core/gradle.properties | 32 + twitter-core/internal-build.gradle | 110 ++ twitter-core/lint.xml | 38 + twitter-core/proguard.txt | 13 + .../src/androidTest/assets/model_places.json | 84 ++ .../src/androidTest/assets/model_tweet.json | 107 ++ .../assets/model_tweetentities.json | 72 + .../assets/model_twitter_collection.json | 541 ++++++++ .../src/androidTest/assets/model_user.json | 147 ++ .../assets/model_userentities.json | 13 + .../src/androidTest/assets/scribe_event.json | 1 + ...8-45a1-a3ca-5941e4c35f26_1404423214376.tap | Bin 0 -> 4096 bytes ...a-4e52-8bf8-d1d461b64392_1404423154382.tap | Bin 0 -> 4096 bytes .../core/AppSessionSerializerTest.java | 93 ++ .../android/core/AuthTokenAdapterTest.java | 183 +++ .../android/core/AuthenticatedClientTest.java | 103 ++ .../sdk/android/core/DefaultClientTest.java | 75 + .../sdk/android/core/GuestAuthClientTest.java | 139 ++ .../sdk/android/core/OAuthSigningTests.java | 82 ++ .../core/ParallelCallableExecutorTest.java | 104 ++ .../core/PersistedSessionManagerTest.java | 424 ++++++ .../core/PreferenceStoreStrategyTest.java | 61 + .../core/SessionEqualsHashCodeTest.java | 40 + .../sdk/android/core/TestFixtures.java | 38 + .../android/core/TwitterApiClientTest.java | 75 + .../android/core/TwitterApiExceptionTest.java | 64 + .../android/core/TwitterAuthConfigTest.java | 142 ++ .../TwitterAuthTokenEqualsHashCodeTest.java | 37 + .../android/core/TwitterAuthTokenTest.java | 42 + .../sdk/android/core/TwitterCoreTest.java | 244 ++++ .../android/core/TwitterRateLimitTest.java | 71 + .../TwitterSessionEqualsHashCodeTest.java | 38 + .../core/TwitterSessionSerializerTest.java | 98 ++ .../sdk/android/core/TwitterSessionTest.java | 79 ++ .../core/identity/AuthHandlerTest.java | 163 +++ .../android/core/identity/AuthStateTest.java | 108 ++ .../core/identity/OAuthActivityTest.java | 88 ++ .../core/identity/OAuthControllerTest.java | 194 +++ .../core/identity/OAuthHandlerTest.java | 62 + .../identity/OAuthWebChromeClientTest.java | 41 + .../core/identity/OAuthWebViewClientTest.java | 114 ++ .../core/identity/SSOAuthHandlerTest.java | 102 ++ .../core/identity/ShareEmailActivityTest.java | 165 +++ .../core/identity/ShareEmailClientTest.java | 72 + .../identity/ShareEmailControllerTest.java | 150 ++ .../ShareEmailResultReceiverTest.java | 101 ++ .../android/core/identity/TestAuthState.java | 21 + .../core/identity/TestOAuthController.java | 35 + .../core/identity/TestShareEmailClient.java | 29 + .../identity/TestShareEmailController.java | 27 + .../sdk/android/core/identity/TestUtils.java | 59 + .../core/identity/TwitterAuthClientTest.java | 338 +++++ .../core/identity/TwitterLoginButtonTest.java | 373 +++++ .../core/internal/GuestCallbackTest.java | 136 ++ .../core/internal/SessionMonitorTest.java | 189 +++ .../android/core/internal/TwitterApiTest.java | 52 + .../core/internal/TwitterCollectionTest.java | 82 ++ .../internal/TwitterRequestHeadersTest.java | 118 ++ .../GuestAuthTokenEqualsHashCodeTest.java | 38 + .../internal/oauth/GuestAuthTokenTest.java | 63 + .../internal/oauth/OAuth1aHeadersTest.java | 83 ++ .../internal/oauth/OAuth1aParametersTest.java | 145 ++ .../internal/oauth/OAuth1aServiceTest.java | 294 ++++ .../internal/oauth/OAuth2ServiceTest.java | 234 ++++ .../oauth/OAuth2TokenEqualsHashCodeTest.java | 37 + .../core/internal/oauth/OAuth2TokenTest.java | 54 + .../internal/oauth/OAuthResponseTest.java | 43 + .../scribe/DefaultScribeClientTest.java | 213 +++ .../scribe/EnabledScribeStrategyTest.java | 63 + .../EventNamespaceEqualsHashCodeTest.java | 38 + .../internal/scribe/ScribeClientTest.java | 136 ++ .../scribe/ScribeEventEqualsHashCodeTest.java | 41 + .../scribe/ScribeEventTransformTest.java | 62 + .../scribe/ScribeFilesSenderTest.java | 293 ++++ .../internal/scribe/ScribeHandlerTest.java | 58 + .../scribe/TestScribeFilesManager.java | 38 + .../scribe/TestScribeFilesSender.java | 45 + .../internal/scribe/TestScribeHandler.java | 33 + .../android/core/models/CoordinatesTest.java | 54 + .../sdk/android/core/models/EntityTest.java | 45 + .../core/models/HashTagEntityTest.java | 47 + .../android/core/models/MediaEntityTest.java | 92 ++ .../core/models/MentionEntityTest.java | 55 + .../sdk/android/core/models/PlaceTest.java | 95 ++ .../core/models/SafeListAdapterTest.java | 104 ++ .../core/models/SafeMapAdapterTest.java | 97 ++ .../core/models/TweetEntitiesTest.java | 73 + .../sdk/android/core/models/TweetTest.java | 61 + .../android/core/models/UrlEntityTest.java | 54 + .../android/core/models/UserEntitiesTest.java | 57 + .../sdk/android/core/models/UserTest.java | 67 + .../core/services/params/GeocodeTest.java | 28 + twitter-core/src/debug/AndroidManifest.xml | 28 + .../android/core/MockTwitterApiException.java | 29 + .../core/ParallelCallableExecutor.java | 74 + .../android/core/SimpleSessionManager.java | 72 + .../android/core/TwitterActivityTestCase.java | 37 + .../sdk/android/core/TwitterTestUtils.java | 30 + .../core/internal/oauth/OAuthUtils.java | 31 + twitter-core/src/main/AndroidManifest.xml | 39 + .../twitter/sdk/android/core/AppSession.java | 76 + .../twitter/sdk/android/core/AuthToken.java | 47 + .../sdk/android/core/AuthTokenAdapter.java | 85 ++ .../sdk/android/core/AuthenticatedClient.java | 102 ++ .../twitter/sdk/android/core/Callback.java | 60 + .../sdk/android/core/DefaultClient.java | 104 ++ .../sdk/android/core/GuestAuthClient.java | 83 ++ .../sdk/android/core/OAuthSigning.java | 93 ++ .../android/core/PersistedSessionManager.java | 212 +++ .../com/twitter/sdk/android/core/Result.java | 35 + .../com/twitter/sdk/android/core/Session.java | 67 + .../sdk/android/core/SessionManager.java | 62 + .../sdk/android/core/TwitterApiClient.java | 138 ++ .../core/TwitterApiErrorConstants.java | 49 + .../sdk/android/core/TwitterApiException.java | 152 ++ .../sdk/android/core/TwitterAuthConfig.java | 136 ++ .../android/core/TwitterAuthException.java | 34 + .../sdk/android/core/TwitterAuthToken.java | 126 ++ .../twitter/sdk/android/core/TwitterCore.java | 273 ++++ .../sdk/android/core/TwitterException.java | 32 + .../core/TwitterPinningInfoProvider.java | 87 ++ .../sdk/android/core/TwitterRateLimit.java | 94 ++ .../sdk/android/core/TwitterSession.java | 119 ++ .../android/core/identity/AuthHandler.java | 102 ++ .../sdk/android/core/identity/AuthState.java | 60 + .../android/core/identity/OAuthActivity.java | 94 ++ .../core/identity/OAuthController.java | 204 +++ .../android/core/identity/OAuthHandler.java | 52 + .../core/identity/OAuthWebChromeClient.java | 30 + .../core/identity/OAuthWebViewClient.java | 80 ++ .../android/core/identity/SSOAuthHandler.java | 139 ++ .../core/identity/ShareEmailActivity.java | 112 ++ .../core/identity/ShareEmailClient.java | 59 + .../core/identity/ShareEmailController.java | 94 ++ .../identity/ShareEmailResultReceiver.java | 63 + .../core/identity/TwitterAuthClient.java | 240 ++++ .../core/identity/TwitterLoginButton.java | 206 +++ .../core/identity/WebViewException.java | 46 + .../core/internal/CollectionService.java | 50 + .../android/core/internal/GuestCallback.java | 94 ++ .../android/core/internal/SessionMonitor.java | 182 +++ .../sdk/android/core/internal/TwitterApi.java | 81 ++ .../core/internal/TwitterApiConstants.java | 39 + .../core/internal/TwitterCollection.java | 147 ++ .../core/internal/TwitterRequestHeaders.java | 87 ++ .../core/internal/oauth/AuthHeaders.java | 29 + .../core/internal/oauth/GuestAuthToken.java | 90 ++ .../internal/oauth/GuestTokenResponse.java | 30 + .../core/internal/oauth/OAuth1aHeaders.java | 73 + .../internal/oauth/OAuth1aParameters.java | 191 +++ .../core/internal/oauth/OAuth1aService.java | 219 +++ .../core/internal/oauth/OAuth2Service.java | 146 ++ .../core/internal/oauth/OAuth2Token.java | 128 ++ .../core/internal/oauth/OAuthConstants.java | 40 + .../core/internal/oauth/OAuthResponse.java | 86 ++ .../core/internal/oauth/OAuthService.java | 81 ++ .../internal/scribe/DefaultScribeClient.java | 197 +++ .../scribe/EnabledScribeStrategy.java | 43 + .../core/internal/scribe/EventNamespace.java | 141 ++ .../core/internal/scribe/ScribeClient.java | 179 +++ .../core/internal/scribe/ScribeConfig.java | 71 + .../core/internal/scribe/ScribeConstants.java | 25 + .../core/internal/scribe/ScribeEvent.java | 121 ++ .../internal/scribe/ScribeFilesManager.java | 54 + .../internal/scribe/ScribeFilesSender.java | 282 ++++ .../core/internal/scribe/ScribeHandler.java | 54 + .../scribe/SyndicatedSdkImpressionEvent.java | 84 ++ .../scribe/TwitterCoreScribeClientHolder.java | 48 + .../sdk/android/core/models/ApiError.java | 46 + .../sdk/android/core/models/Coordinates.java | 63 + .../sdk/android/core/models/Entity.java | 54 + .../android/core/models/HashtagEntity.java | 37 + .../sdk/android/core/models/Identifiable.java | 30 + .../sdk/android/core/models/MediaEntity.java | 160 +++ .../android/core/models/MentionEntity.java | 59 + .../sdk/android/core/models/Place.java | 121 ++ .../android/core/models/SafeListAdapter.java | 58 + .../android/core/models/SafeMapAdapter.java | 58 + .../sdk/android/core/models/Search.java | 38 + .../android/core/models/SearchMetadata.java | 63 + .../sdk/android/core/models/Tweet.java | 298 ++++ .../sdk/android/core/models/TweetBuilder.java | 232 ++++ .../android/core/models/TweetEntities.java | 71 + .../sdk/android/core/models/UrlEntity.java | 53 + .../twitter/sdk/android/core/models/User.java | 379 +++++ .../sdk/android/core/models/UserBuilder.java | 286 ++++ .../sdk/android/core/models/UserEntities.java | 61 + .../android/core/services/AccountService.java | 59 + .../core/services/FavoriteService.java | 95 ++ .../android/core/services/SearchService.java | 91 ++ .../core/services/StatusesService.java | 353 +++++ .../android/core/services/params/Geocode.java | 60 + .../res/drawable-hdpi/tw__ic_logo_default.png | Bin 0 -> 784 bytes .../drawable-hdpi/tw__share_email_header.png | Bin 0 -> 12256 bytes .../res/drawable-mdpi/tw__ic_logo_default.png | Bin 0 -> 530 bytes .../drawable-mdpi/tw__share_email_header.png | Bin 0 -> 8196 bytes .../drawable-xhdpi/tw__ic_logo_default.png | Bin 0 -> 1038 bytes .../drawable-xhdpi/tw__share_email_header.png | Bin 0 -> 16646 bytes .../drawable-xxhdpi/tw__ic_logo_default.png | Bin 0 -> 1622 bytes .../tw__share_email_header.png | Bin 0 -> 25289 bytes .../src/main/res/drawable/tw__login_btn.xml | 32 + .../res/drawable/tw__login_btn_default.xml | 29 + .../drawable/tw__login_btn_default_light.xml | 28 + .../res/drawable/tw__login_btn_disabled.xml | 29 + .../main/res/drawable/tw__login_btn_light.xml | 30 + .../res/drawable/tw__login_btn_pressed.xml | 29 + .../drawable/tw__login_btn_pressed_light.xml | 29 + .../tw__login_btn_text_color_light.xml | 25 + .../src/main/res/drawable/tw__transparent.xml | 22 + .../main/res/layout/tw__activity_oauth.xml | 34 + .../res/layout/tw__activity_share_email.xml | 89 ++ twitter-core/src/main/res/raw/tw__cacerts | Bin 0 -> 138259 bytes .../src/main/res/values-ar/strings.xml | 26 + .../src/main/res/values-bn/strings.xml | 26 + .../src/main/res/values-cs/strings.xml | 26 + .../src/main/res/values-da/strings.xml | 26 + .../src/main/res/values-de/strings.xml | 26 + .../src/main/res/values-en-rGB/strings.xml | 26 + .../src/main/res/values-en-rSS/strings.xml | 27 + .../src/main/res/values-en-rXX/strings.xml | 27 + .../src/main/res/values-es/strings.xml | 26 + .../src/main/res/values-fa/strings.xml | 26 + .../src/main/res/values-fi/strings.xml | 26 + .../src/main/res/values-fr/strings.xml | 26 + .../src/main/res/values-hdpi/dimens.xml | 25 + .../src/main/res/values-hi/strings.xml | 26 + .../src/main/res/values-hu/strings.xml | 26 + .../src/main/res/values-in/strings.xml | 26 + .../src/main/res/values-it/strings.xml | 26 + .../src/main/res/values-iw/strings.xml | 26 + .../src/main/res/values-ja/strings.xml | 26 + .../src/main/res/values-ko/strings.xml | 26 + .../src/main/res/values-ms/strings.xml | 26 + .../src/main/res/values-nb/strings.xml | 26 + .../src/main/res/values-nl/strings.xml | 26 + .../src/main/res/values-pl/strings.xml | 26 + .../src/main/res/values-pt/strings.xml | 26 + .../src/main/res/values-ro/strings.xml | 26 + .../src/main/res/values-ru/strings.xml | 26 + .../src/main/res/values-sv/strings.xml | 26 + .../src/main/res/values-sw720dp/dimens.xml | 21 + .../src/main/res/values-th/strings.xml | 26 + .../src/main/res/values-tl/strings.xml | 26 + .../src/main/res/values-tr/strings.xml | 26 + .../src/main/res/values-uk/strings.xml | 26 + .../src/main/res/values-ur/strings.xml | 25 + .../src/main/res/values-vi/strings.xml | 26 + .../src/main/res/values-xhdpi/dimens.xml | 21 + .../src/main/res/values-xxhdpi/dimens.xml | 21 + .../src/main/res/values-zh-rCN/strings.xml | 26 + .../src/main/res/values-zh-rTW/strings.xml | 26 + twitter-core/src/main/res/values/colors.xml | 28 + .../src/main/res/values/const_strings.xml | 22 + twitter-core/src/main/res/values/dimens.xml | 34 + twitter-core/src/main/res/values/strings.xml | 36 + twitter-core/src/main/res/values/styles.xml | 60 + ...witter.sdk.android.twitter-core.properties | 20 + twitter/build.gradle | 61 + twitter/gradle.properties | 32 + twitter/internal-build.gradle | 87 ++ .../com/twitter/sdk/android/TwitterTest.java | 78 ++ twitter/src/main/AndroidManifest.xml | 24 + .../java/com/twitter/sdk/android/Twitter.java | 159 +++ ...com.twitter.sdk.android.twitter.properties | 20 + 579 files changed, 41609 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 samples/app/build.gradle create mode 100644 samples/app/fabric.properties.sample create mode 100644 samples/app/lint.xml create mode 100644 samples/app/src/main/AndroidManifest.xml create mode 100644 samples/app/src/main/ic_launcher-web.png create mode 100644 samples/app/src/main/java/com/example/app/MainActivity.java create mode 100644 samples/app/src/main/java/com/example/app/SampleApplication.java create mode 100644 samples/app/src/main/java/com/example/app/tweetcomposer/TweetComposerMainActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/CollectionTimelineFragment.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/SearchTimelineFragment.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TimelineActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TimelinesActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TweetActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TweetListActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TweetListFragment.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TweetPreviewActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TweetUiActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/TweetUiMainActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/UniqueTweetActivity.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/UserTimelineFragment.java create mode 100644 samples/app/src/main/java/com/example/app/tweetui/XmlTweetActivity.java create mode 100644 samples/app/src/main/java/com/example/app/twittercore/TwitterCoreMainActivity.java create mode 100644 samples/app/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 samples/app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 samples/app/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 samples/app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 samples/app/src/main/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 samples/app/src/main/res/layout/activity_frame.xml create mode 100644 samples/app/src/main/res/layout/activity_main.xml create mode 100644 samples/app/src/main/res/layout/activity_pager.xml create mode 100644 samples/app/src/main/res/layout/tweetcomposer_activity_main.xml create mode 100644 samples/app/src/main/res/layout/tweetui_activity_main.xml create mode 100644 samples/app/src/main/res/layout/tweetui_fragment_tweet.xml create mode 100644 samples/app/src/main/res/layout/tweetui_fragment_tweet_preview.xml create mode 100644 samples/app/src/main/res/layout/tweetui_fragment_unique_tweet.xml create mode 100644 samples/app/src/main/res/layout/tweetui_fragment_xml_tweet.xml create mode 100644 samples/app/src/main/res/layout/tweetui_swipe_timeline.xml create mode 100644 samples/app/src/main/res/layout/tweetui_timeline.xml create mode 100644 samples/app/src/main/res/layout/twittercore_activity_main.xml create mode 100644 samples/app/src/main/res/menu/activity_main_actions.xml create mode 100644 samples/app/src/main/res/values-v11/themes.xml create mode 100644 samples/app/src/main/res/values-v21/themes.xml create mode 100644 samples/app/src/main/res/values/colors.xml create mode 100644 samples/app/src/main/res/values/dimens.xml create mode 100644 samples/app/src/main/res/values/strings.xml create mode 100644 samples/app/src/main/res/values/styles.xml create mode 100644 samples/app/src/main/res/values/themes.xml create mode 100644 settings.gradle create mode 100644 tweet-composer/build.gradle create mode 100644 tweet-composer/changelog.md create mode 100644 tweet-composer/gradle.properties create mode 100644 tweet-composer/internal-build.gradle create mode 100644 tweet-composer/lint.xml create mode 100644 tweet-composer/src/androidTest/java/com/twitter/sdk/android/tweetcomposer/TweetComposerTest.java create mode 100644 tweet-composer/src/main/AndroidManifest.xml create mode 100644 tweet-composer/src/main/java/com/twitter/sdk/android/tweetcomposer/TweetComposer.java create mode 100644 tweet-composer/src/main/resources/.fabric/com.twitter.sdk.android.tweet-composer.properties create mode 100644 tweet-ui/build.gradle create mode 100644 tweet-ui/changelog.md create mode 100644 tweet-ui/gradle.properties create mode 100644 tweet-ui/internal-build.gradle create mode 100644 tweet-ui/lint.xml create mode 100644 tweet-ui/portlog.md create mode 100644 tweet-ui/proguard.txt create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/AuthRequestQueueTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/BaseTimelineTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/BaseTweetViewTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/BaseTweetViewXmlTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/CollectionTimelineTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/ColorUtilsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/CompactTweetViewTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/CompactTweetViewXmlTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/DateTranslationsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/EnglishLocaleTestCase.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/LoggingCallbackTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/OnShareButtonClickListenerTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/ScribeEventFactoryTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/SearchTimelineTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TestItem.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TimelineCursorTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TimelineListAdapterTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetDateUtilsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetRepositoryTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetTextLinkifierTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetTextUtilsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetTimelineListAdapterTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetUiBackgroundTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetUiTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetUiTestCase.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetUtilsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetViewAdapterTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetViewFetchAdapterTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetViewTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/TweetViewXmlTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/UserTimelineTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/UserUtilsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/UtilsTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/internal/ActiveSessionProviderTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/internal/TimelineDelegateTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/internal/TimelineStateHolderTest.java create mode 100644 tweet-ui/src/androidTest/java/com/twitter/sdk/android/tweetui/internal/util/AspectRatioImageViewTest.java create mode 100644 tweet-ui/src/debug/AndroidManifest.xml create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/EntityFactory.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/MockUtils.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestActivity.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestCollectionTimeline.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestDependencyProvider.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestFixtures.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestSearchTimeline.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestTweetRepository.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestTweetUi.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestUserTimeline.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TestUtils.java create mode 100644 tweet-ui/src/debug/java/com/twitter/sdk/android/tweetui/TweetAsserts.java create mode 100644 tweet-ui/src/debug/res/layout/activity_aspect_ratio_image_view_test.xml create mode 100644 tweet-ui/src/debug/res/layout/activity_invalid_tweet_id.xml create mode 100644 tweet-ui/src/debug/res/layout/activity_tweet_view_test.xml create mode 100644 tweet-ui/src/main/AndroidManifest.xml create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/ApiCallback.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/AuthRequestQueue.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/BaseTimeline.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/BaseTweetView.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/CollectionTimeline.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/ColorUtils.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/CompactTweetView.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/FormattedMediaEntity.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/FormattedTweetText.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/FormattedUrlEntity.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/LinkClickListener.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/LoadCallback.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/LoggingCallback.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/OnShareButtonClickListener.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/Repository.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/ScribeEventFactory.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/SearchTimeline.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/SyndicationClientEvent.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/Timeline.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TimelineCursor.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TimelineListAdapter.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TimelineResult.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetDateUtils.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetRepository.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetTextLinkifier.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetTextUtils.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetTimelineListAdapter.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetUi.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetUtils.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetView.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetViewAdapter.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/TweetViewFetchAdapter.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/UserTimeline.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/UserUtils.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/Utils.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/internal/ActiveSessionProvider.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/internal/TimelineDelegate.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/internal/TimelineStateHolder.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/internal/util/AspectRatioImageView.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/internal/util/HtmlEntities.java create mode 100644 tweet-ui/src/main/java/com/twitter/sdk/android/tweetui/internal/util/IntHashMap.java create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_logo_blue.png create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_logo_white.png create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_retweet_dark.png create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_retweet_light.png create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_tweet_photo_error_dark.png create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_tweet_photo_error_light.png create mode 100644 tweet-ui/src/main/res/drawable-hdpi/tw__ic_tweet_verified.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_logo_blue.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_logo_white.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_retweet_dark.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_retweet_light.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_tweet_photo_error_dark.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_tweet_photo_error_light.png create mode 100644 tweet-ui/src/main/res/drawable-mdpi/tw__ic_tweet_verified.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_logo_blue.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_logo_white.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_retweet_dark.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_retweet_light.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_tweet_photo_error_dark.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_tweet_photo_error_light.png create mode 100644 tweet-ui/src/main/res/drawable-xhdpi/tw__ic_tweet_verified.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_logo_blue.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_logo_white.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_retweet_dark.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_retweet_light.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_tweet_photo_error_dark.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_tweet_photo_error_light.png create mode 100644 tweet-ui/src/main/res/drawable-xxhdpi/tw__ic_tweet_verified.png create mode 100644 tweet-ui/src/main/res/drawable/tw__bg_tweet.xml create mode 100644 tweet-ui/src/main/res/drawable/tw__bg_tweet_compact.xml create mode 100644 tweet-ui/src/main/res/layout/tw__tweet.xml create mode 100644 tweet-ui/src/main/res/layout/tw__tweet_compact.xml create mode 100644 tweet-ui/src/main/res/values-ar/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-ar/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ar/strings.xml create mode 100644 tweet-ui/src/main/res/values-bn/plurals.xml create mode 100644 tweet-ui/src/main/res/values-bn/strings.xml create mode 100644 tweet-ui/src/main/res/values-cs/plurals.xml create mode 100644 tweet-ui/src/main/res/values-cs/strings.xml create mode 100644 tweet-ui/src/main/res/values-da/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-da/plurals.xml create mode 100644 tweet-ui/src/main/res/values-da/strings.xml create mode 100644 tweet-ui/src/main/res/values-de/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-de/plurals.xml create mode 100644 tweet-ui/src/main/res/values-de/strings.xml create mode 100644 tweet-ui/src/main/res/values-en-rGB/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-en-rGB/plurals.xml create mode 100644 tweet-ui/src/main/res/values-en-rGB/strings.xml create mode 100644 tweet-ui/src/main/res/values-en-rSS/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-en-rSS/plurals.xml create mode 100644 tweet-ui/src/main/res/values-en-rSS/strings.xml create mode 100644 tweet-ui/src/main/res/values-en-rXX/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-en-rXX/plurals.xml create mode 100644 tweet-ui/src/main/res/values-en-rXX/strings.xml create mode 100644 tweet-ui/src/main/res/values-es/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-es/plurals.xml create mode 100644 tweet-ui/src/main/res/values-es/strings.xml create mode 100644 tweet-ui/src/main/res/values-fa/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-fa/plurals.xml create mode 100644 tweet-ui/src/main/res/values-fa/strings.xml create mode 100644 tweet-ui/src/main/res/values-fi/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-fi/plurals.xml create mode 100644 tweet-ui/src/main/res/values-fi/strings.xml create mode 100644 tweet-ui/src/main/res/values-fr/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-fr/plurals.xml create mode 100644 tweet-ui/src/main/res/values-fr/strings.xml create mode 100644 tweet-ui/src/main/res/values-hi/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-hi/plurals.xml create mode 100644 tweet-ui/src/main/res/values-hi/strings.xml create mode 100644 tweet-ui/src/main/res/values-hu/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-hu/plurals.xml create mode 100644 tweet-ui/src/main/res/values-hu/strings.xml create mode 100644 tweet-ui/src/main/res/values-in/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-in/plurals.xml create mode 100644 tweet-ui/src/main/res/values-in/strings.xml create mode 100644 tweet-ui/src/main/res/values-it/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-it/plurals.xml create mode 100644 tweet-ui/src/main/res/values-it/strings.xml create mode 100644 tweet-ui/src/main/res/values-iw/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-iw/plurals.xml create mode 100644 tweet-ui/src/main/res/values-iw/strings.xml create mode 100644 tweet-ui/src/main/res/values-ja/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-ja/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ja/strings.xml create mode 100644 tweet-ui/src/main/res/values-ko/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-ko/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ko/strings.xml create mode 100644 tweet-ui/src/main/res/values-ms/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-ms/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ms/strings.xml create mode 100644 tweet-ui/src/main/res/values-nb/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-nb/plurals.xml create mode 100644 tweet-ui/src/main/res/values-nb/strings.xml create mode 100644 tweet-ui/src/main/res/values-nl/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-nl/plurals.xml create mode 100644 tweet-ui/src/main/res/values-nl/strings.xml create mode 100644 tweet-ui/src/main/res/values-pl/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-pl/plurals.xml create mode 100644 tweet-ui/src/main/res/values-pl/strings.xml create mode 100644 tweet-ui/src/main/res/values-pt/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-pt/plurals.xml create mode 100644 tweet-ui/src/main/res/values-pt/strings.xml create mode 100644 tweet-ui/src/main/res/values-ro/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ro/strings.xml create mode 100644 tweet-ui/src/main/res/values-ru/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-ru/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ru/strings.xml create mode 100644 tweet-ui/src/main/res/values-sv/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-sv/plurals.xml create mode 100644 tweet-ui/src/main/res/values-sv/strings.xml create mode 100644 tweet-ui/src/main/res/values-th/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-th/plurals.xml create mode 100644 tweet-ui/src/main/res/values-th/strings.xml create mode 100644 tweet-ui/src/main/res/values-tl/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-tl/plurals.xml create mode 100644 tweet-ui/src/main/res/values-tl/strings.xml create mode 100644 tweet-ui/src/main/res/values-tr/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-tr/plurals.xml create mode 100644 tweet-ui/src/main/res/values-tr/strings.xml create mode 100644 tweet-ui/src/main/res/values-uk/plurals.xml create mode 100644 tweet-ui/src/main/res/values-uk/strings.xml create mode 100644 tweet-ui/src/main/res/values-ur/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-ur/plurals.xml create mode 100644 tweet-ui/src/main/res/values-ur/strings.xml create mode 100644 tweet-ui/src/main/res/values-v16/tw__tweet_text_styles.xml create mode 100644 tweet-ui/src/main/res/values-v21/tw_tweet_text_styles.xml create mode 100644 tweet-ui/src/main/res/values-vi/plurals.xml create mode 100644 tweet-ui/src/main/res/values-vi/strings.xml create mode 100644 tweet-ui/src/main/res/values-zh-rCN/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-zh-rCN/plurals.xml create mode 100644 tweet-ui/src/main/res/values-zh-rCN/strings.xml create mode 100644 tweet-ui/src/main/res/values-zh-rTW/const_strings.xml create mode 100644 tweet-ui/src/main/res/values-zh-rTW/plurals.xml create mode 100644 tweet-ui/src/main/res/values-zh-rTW/strings.xml create mode 100644 tweet-ui/src/main/res/values/attrs.xml create mode 100644 tweet-ui/src/main/res/values/colors.xml create mode 100644 tweet-ui/src/main/res/values/const_strings.xml create mode 100644 tweet-ui/src/main/res/values/dimens.xml create mode 100644 tweet-ui/src/main/res/values/plurals.xml create mode 100644 tweet-ui/src/main/res/values/strings.xml create mode 100644 tweet-ui/src/main/res/values/styles.xml create mode 100644 tweet-ui/src/main/res/values/tw__tweet_layout_styles.xml create mode 100644 tweet-ui/src/main/res/values/tw__tweet_media_styles.xml create mode 100644 tweet-ui/src/main/res/values/tw__tweet_text_styles.xml create mode 100644 tweet-ui/src/main/resources/.fabric/com.twitter.sdk.android.tweet-ui.properties create mode 100644 twitter-core/README.md create mode 100644 twitter-core/build.gradle create mode 100644 twitter-core/changelog.md create mode 100644 twitter-core/gradle.properties create mode 100644 twitter-core/internal-build.gradle create mode 100644 twitter-core/lint.xml create mode 100644 twitter-core/proguard.txt create mode 100644 twitter-core/src/androidTest/assets/model_places.json create mode 100644 twitter-core/src/androidTest/assets/model_tweet.json create mode 100644 twitter-core/src/androidTest/assets/model_tweetentities.json create mode 100644 twitter-core/src/androidTest/assets/model_twitter_collection.json create mode 100644 twitter-core/src/androidTest/assets/model_user.json create mode 100644 twitter-core/src/androidTest/assets/model_userentities.json create mode 100644 twitter-core/src/androidTest/assets/scribe_event.json create mode 100644 twitter-core/src/androidTest/assets/se_c9666213-d768-45a1-a3ca-5941e4c35f26_1404423214376.tap create mode 100644 twitter-core/src/androidTest/assets/se_f6a58964-88aa-4e52-8bf8-d1d461b64392_1404423154382.tap create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/AppSessionSerializerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/AuthTokenAdapterTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/AuthenticatedClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/DefaultClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/GuestAuthClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/OAuthSigningTests.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/ParallelCallableExecutorTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/PersistedSessionManagerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/PreferenceStoreStrategyTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/SessionEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TestFixtures.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterApiClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterApiExceptionTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterAuthConfigTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterAuthTokenEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterAuthTokenTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterCoreTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterRateLimitTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterSessionEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterSessionSerializerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/TwitterSessionTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/AuthHandlerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/AuthStateTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/OAuthActivityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/OAuthControllerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/OAuthHandlerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/OAuthWebChromeClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/OAuthWebViewClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/SSOAuthHandlerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/ShareEmailActivityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/ShareEmailClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/ShareEmailControllerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/ShareEmailResultReceiverTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TestAuthState.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TestOAuthController.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TestShareEmailClient.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TestShareEmailController.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TestUtils.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TwitterAuthClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/identity/TwitterLoginButtonTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/GuestCallbackTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/SessionMonitorTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/TwitterApiTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/TwitterCollectionTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/TwitterRequestHeadersTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/GuestAuthTokenEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/GuestAuthTokenTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuth1aHeadersTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuth1aParametersTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuth1aServiceTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuth2ServiceTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuth2TokenEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuth2TokenTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/oauth/OAuthResponseTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/DefaultScribeClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/EnabledScribeStrategyTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/EventNamespaceEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/ScribeClientTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/ScribeEventEqualsHashCodeTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/ScribeEventTransformTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/ScribeFilesSenderTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/ScribeHandlerTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/TestScribeFilesManager.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/TestScribeFilesSender.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/internal/scribe/TestScribeHandler.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/CoordinatesTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/EntityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/HashTagEntityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/MediaEntityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/MentionEntityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/PlaceTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/SafeListAdapterTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/SafeMapAdapterTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/TweetEntitiesTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/TweetTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/UrlEntityTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/UserEntitiesTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/models/UserTest.java create mode 100644 twitter-core/src/androidTest/java/com/twitter/sdk/android/core/services/params/GeocodeTest.java create mode 100644 twitter-core/src/debug/AndroidManifest.xml create mode 100644 twitter-core/src/debug/java/com/twitter/sdk/android/core/MockTwitterApiException.java create mode 100644 twitter-core/src/debug/java/com/twitter/sdk/android/core/ParallelCallableExecutor.java create mode 100644 twitter-core/src/debug/java/com/twitter/sdk/android/core/SimpleSessionManager.java create mode 100644 twitter-core/src/debug/java/com/twitter/sdk/android/core/TwitterActivityTestCase.java create mode 100644 twitter-core/src/debug/java/com/twitter/sdk/android/core/TwitterTestUtils.java create mode 100644 twitter-core/src/debug/java/com/twitter/sdk/android/core/internal/oauth/OAuthUtils.java create mode 100644 twitter-core/src/main/AndroidManifest.xml create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/AppSession.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/AuthToken.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/AuthTokenAdapter.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/AuthenticatedClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/Callback.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/DefaultClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/GuestAuthClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/OAuthSigning.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/PersistedSessionManager.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/Result.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/Session.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/SessionManager.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterApiClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterApiErrorConstants.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterApiException.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterAuthConfig.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterAuthException.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterAuthToken.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterCore.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterException.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterPinningInfoProvider.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterRateLimit.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/TwitterSession.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/AuthHandler.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/AuthState.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/OAuthActivity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/OAuthController.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/OAuthHandler.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/OAuthWebChromeClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/OAuthWebViewClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/SSOAuthHandler.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/ShareEmailActivity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/ShareEmailClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/ShareEmailController.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/ShareEmailResultReceiver.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/TwitterAuthClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/TwitterLoginButton.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/identity/WebViewException.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/CollectionService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/GuestCallback.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/SessionMonitor.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/TwitterApi.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/TwitterApiConstants.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/TwitterCollection.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/TwitterRequestHeaders.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/AuthHeaders.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/GuestAuthToken.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/GuestTokenResponse.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuth1aHeaders.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuth1aParameters.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuth1aService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuth2Service.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuth2Token.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuthConstants.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuthResponse.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/oauth/OAuthService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/DefaultScribeClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/EnabledScribeStrategy.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/EventNamespace.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeClient.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeConfig.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeConstants.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeEvent.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeFilesManager.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeFilesSender.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/ScribeHandler.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/SyndicatedSdkImpressionEvent.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/internal/scribe/TwitterCoreScribeClientHolder.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/ApiError.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/Coordinates.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/Entity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/HashtagEntity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/Identifiable.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/MediaEntity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/MentionEntity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/Place.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/SafeListAdapter.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/SafeMapAdapter.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/Search.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/SearchMetadata.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/Tweet.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/TweetBuilder.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/TweetEntities.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/UrlEntity.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/User.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/UserBuilder.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/models/UserEntities.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/services/AccountService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/services/FavoriteService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/services/SearchService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/services/StatusesService.java create mode 100644 twitter-core/src/main/java/com/twitter/sdk/android/core/services/params/Geocode.java create mode 100644 twitter-core/src/main/res/drawable-hdpi/tw__ic_logo_default.png create mode 100644 twitter-core/src/main/res/drawable-hdpi/tw__share_email_header.png create mode 100644 twitter-core/src/main/res/drawable-mdpi/tw__ic_logo_default.png create mode 100644 twitter-core/src/main/res/drawable-mdpi/tw__share_email_header.png create mode 100644 twitter-core/src/main/res/drawable-xhdpi/tw__ic_logo_default.png create mode 100644 twitter-core/src/main/res/drawable-xhdpi/tw__share_email_header.png create mode 100644 twitter-core/src/main/res/drawable-xxhdpi/tw__ic_logo_default.png create mode 100644 twitter-core/src/main/res/drawable-xxhdpi/tw__share_email_header.png create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_default.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_default_light.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_disabled.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_light.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_pressed.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_pressed_light.xml create mode 100644 twitter-core/src/main/res/drawable/tw__login_btn_text_color_light.xml create mode 100644 twitter-core/src/main/res/drawable/tw__transparent.xml create mode 100644 twitter-core/src/main/res/layout/tw__activity_oauth.xml create mode 100644 twitter-core/src/main/res/layout/tw__activity_share_email.xml create mode 100644 twitter-core/src/main/res/raw/tw__cacerts create mode 100644 twitter-core/src/main/res/values-ar/strings.xml create mode 100644 twitter-core/src/main/res/values-bn/strings.xml create mode 100644 twitter-core/src/main/res/values-cs/strings.xml create mode 100644 twitter-core/src/main/res/values-da/strings.xml create mode 100644 twitter-core/src/main/res/values-de/strings.xml create mode 100644 twitter-core/src/main/res/values-en-rGB/strings.xml create mode 100644 twitter-core/src/main/res/values-en-rSS/strings.xml create mode 100644 twitter-core/src/main/res/values-en-rXX/strings.xml create mode 100644 twitter-core/src/main/res/values-es/strings.xml create mode 100644 twitter-core/src/main/res/values-fa/strings.xml create mode 100644 twitter-core/src/main/res/values-fi/strings.xml create mode 100644 twitter-core/src/main/res/values-fr/strings.xml create mode 100644 twitter-core/src/main/res/values-hdpi/dimens.xml create mode 100644 twitter-core/src/main/res/values-hi/strings.xml create mode 100644 twitter-core/src/main/res/values-hu/strings.xml create mode 100644 twitter-core/src/main/res/values-in/strings.xml create mode 100644 twitter-core/src/main/res/values-it/strings.xml create mode 100644 twitter-core/src/main/res/values-iw/strings.xml create mode 100644 twitter-core/src/main/res/values-ja/strings.xml create mode 100644 twitter-core/src/main/res/values-ko/strings.xml create mode 100644 twitter-core/src/main/res/values-ms/strings.xml create mode 100644 twitter-core/src/main/res/values-nb/strings.xml create mode 100644 twitter-core/src/main/res/values-nl/strings.xml create mode 100644 twitter-core/src/main/res/values-pl/strings.xml create mode 100644 twitter-core/src/main/res/values-pt/strings.xml create mode 100644 twitter-core/src/main/res/values-ro/strings.xml create mode 100644 twitter-core/src/main/res/values-ru/strings.xml create mode 100644 twitter-core/src/main/res/values-sv/strings.xml create mode 100644 twitter-core/src/main/res/values-sw720dp/dimens.xml create mode 100644 twitter-core/src/main/res/values-th/strings.xml create mode 100644 twitter-core/src/main/res/values-tl/strings.xml create mode 100644 twitter-core/src/main/res/values-tr/strings.xml create mode 100644 twitter-core/src/main/res/values-uk/strings.xml create mode 100644 twitter-core/src/main/res/values-ur/strings.xml create mode 100644 twitter-core/src/main/res/values-vi/strings.xml create mode 100644 twitter-core/src/main/res/values-xhdpi/dimens.xml create mode 100644 twitter-core/src/main/res/values-xxhdpi/dimens.xml create mode 100644 twitter-core/src/main/res/values-zh-rCN/strings.xml create mode 100644 twitter-core/src/main/res/values-zh-rTW/strings.xml create mode 100644 twitter-core/src/main/res/values/colors.xml create mode 100644 twitter-core/src/main/res/values/const_strings.xml create mode 100644 twitter-core/src/main/res/values/dimens.xml create mode 100644 twitter-core/src/main/res/values/strings.xml create mode 100644 twitter-core/src/main/res/values/styles.xml create mode 100644 twitter-core/src/main/resources/.fabric/com.twitter.sdk.android.twitter-core.properties create mode 100644 twitter/build.gradle create mode 100644 twitter/gradle.properties create mode 100644 twitter/internal-build.gradle create mode 100644 twitter/src/androidTest/java/com/twitter/sdk/android/TwitterTest.java create mode 100644 twitter/src/main/AndroidManifest.xml create mode 100644 twitter/src/main/java/com/twitter/sdk/android/Twitter.java create mode 100644 twitter/src/main/resources/.fabric/com.twitter.sdk.android.twitter.properties diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..7f23f14a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,97 @@ +# How to Contribute + +We'd love to get patches from you! The core team at Twitter is very passionate about the direction of the product, and thus we are seeking fix contributions over external feature PRs. + +If you have anything you'd like to contribute, we recommend discussing it with the core team before writing it. + +## Workflow + +The workflow that we support: + +1. Fork twitter-kit-android +2. Check out the `develop` branch +3. Make a feature branch +4. Make your cool new feature or bugfix on your branch +5. Write a test for your change +6. From your branch, make a pull request against `twitter/twitter-kit-android/develop` +7. Work with repo maintainers to get your change reviewed +8. Wait for your change to be pulled into `twitter/twitter-kit-android/develop` +9. Merge `twitter/twitter-kit-android/develop` into your origin `develop` +10. Delete your feature branch + +## Testing + +We've use the standard [Android Testing tools](http://developer.android.com/tools/testing/testing_android.html). Most classes are currently using AndroidTestCase, but will slowly be migrated to JUnit 4. + +``` +Running ./gradlew connectedCheck will perform the needed tests +``` + +## Styleguide + +* We follow the android coding guidelines, followed by the java coding convention. + +* checkstyle and lint will be used to help enforce code style. + +### Android Style Guide +https://source.android.com/source/code-style.html + +#### errata: + +* the style guide is unclear on the naming of private static final fields, they should be SCREAMING_SNAKE_CASE + +* AOSP uses Hungarian notation, however this is discouraged in modern open source libaries and applications. Instance variables should be named with CamelCase and without prefixes. + +### Java Style Guide +http://google-styleguide.googlecode.com/svn/trunk/javaguide.html (MikeFu suggestion) + +* Limit the use of horizontal alignment. While it may aid readaiblity, it creates problems for future maintainers. More [here](http://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.6.3-horizontal-alignment) +* For testing purposes, we allow static imports, as well, as wildcard imports. This exclusion is added to our checkstyle config. + +### Javadoc Style Guide +http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html + +See style guide, in particular, when documenting methods: + +* Use 3rd person (descriptive) not 2nd person (prescriptive). +* Method descriptions begin with a verb phrase. +* Add description beyond the API name. +* Avoid descriptions that say nothing beyond what you know from reading the method name. + +### Groovy / Gradle Style Guide +… + +### Git Commit Message Style Guide +http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html + +http://who-t.blogspot.de/2009/12/on-commit-messages.html + +* Commit message should describe why the change is being made with a high level overview of significant changes made. + +* The first line of commit message should be no more than 65 characters long. This should be a short summary of your commit. Wrap subsequent lines to 80 columns. + +* Write commit message in the imperative: "Fix bug" and not "Fixed bug" +or "Fixes bug." This convention matches up with commit messages generated +by commands like git merge and git revert. + +## Code Review + +The twitter-kit-android repository on GitHub is kept in sync with an internal repository at +Twitter. For the most part this process should be transparent to twitter-kit-android users, +but it does have some implications for how pull requests are merged into the +codebase. + +When you submit a pull request on GitHub, it will be reviewed by the +twitter-kit-android community (both inside and outside of Twitter), and once the changes are +approved, your commits will be brought into the internal system for additional +testing. Once the changes are merged internally, they will be pushed back to +GitHub with the next release. + +This process means that the pull request will not be merged in the usual way. +Instead a member of the twitter-kit-android team will post a message in the pull request +thread when your changes have made their way back to GitHub, and the pull +request will be closed. The changes +in the pull request will be collapsed into a single commit, but the authorship +metadata will be preserved. + +Please let us know if you have any questions about this process! \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..2bb9ad24 --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..4ead0910 --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# Twitter Kit for Android + +Twitter Kit is a multi-module gradle project containing several Twitter SDKs including TweetComposer, TwitterCore, TweetUi, and Digits. It is built on the Fabric platform and uses many shared components. + +Using TwitterKit from source in production applications is not officially supported by Fabric. Please utilize the available binaries. + +## Download + + +Define via Gradle: +```groovy + +buildscript { + repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } + } + dependencies { + classpath 'io.fabric.tools:gradle:1.+' + } +} + +apply plugin: 'io.fabric' + +repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } +} + +dependencies { + compile('com.twitter.sdk.android:twitter:1.5.1@aar') { + transitive = true + } +} + +``` + +Check out [more details and other build tool integrations](https://fabric.io/downloads/build-tools) + +## Getting Started + +* Sign up for a [Fabric account](https://fabric.io) and follow onboarding instructions to get your Fabric API Key and build secret, found under the organization settings of the Fabric web dashboard. +* Either create your Twitter app by through (this portal)[https://apps.twitter.com/] or by using the Fabric IDE plugin. +* Rename /samples/app/fabric.properties.sample to /samples/app/fabric.properties and populate information. +* Run Sample app to verify build. +* For extensive documentation, please see the [official documentation](http://docs.fabric.io/android/twitter/index.html). + +## Code of Conduct + +This, and all github.com/twitter projects, are under the [Twitter Open Source Code of Conduct](https://engineering.twitter.com/opensource/code-of-conduct). Additionally, see the [Typelevel Code of Conduct](http://typelevel.org/conduct) for specific examples of harassing behavior that are not tolerated. + +## Building + +Please use the provided gradle wrapper to build the project. + +``` +./gradlew assemble +``` + +Run all automated tests on device to verify. + +``` +./gradlew connectedCheck +``` + +To run the sample app + +``` +./gradlew :samples:app:installDebug +``` + + +Contributing + +The master branch of this repository contains the latest stable release of Twitter Kit. See [CONTRIBUTING.md](https://github.com/twitter/twitter-kit-android/blob/master/CONTRIBUTING.md) for more details about how to contribute. + +## Contact + +For usage questions post on [Twitter Community](https://twittercommunity.com/c/fabric/twitter) or email + +Please report any bugs as [issues](https://github.com/twitter/twitter-kit-android/issues). + +Follow [@Fabric](http://twitter.com/fabric) on Twitter for updates. + +## Authors + +* [Andre Pinter](https://twitter.com/endform) +* [Dalton Hubble](https://twitter.com/dghubble) +* [Lien Mamitsuka](https://twitter.com/lienm) +* [Ty Smith](https://twitter.com/tsmith) + +Thanks for assistance and contributions: + +* [Eric Frohnhoefer](https://twitter.com/ericfrohnhoefer) +* [Israel Camacho](https://twitter.com/rallat) +* [Justin Starry](https://twitter.com/sirstarry) +* [Yohan Hartanto](https://twitter.com/yohan) + +## License + +Copyright 2015 Twitter, Inc. + +Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..039a2654 --- /dev/null +++ b/build.gradle @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0' + classpath 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1' + } +} + +subprojects { + repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '2.3' +} + +ext { + compileSdkVersion = 22 + targetSdkVersion = 22 + buildToolsVersion = '22.0.1' + + buildNumber = 'dev' + + fabric = 'io.fabric.sdk.android:fabric:1.3.+@aar' + fabricTest = 'io.fabric.sdk.android:fabric-test:0.0.+@aar' + + androidTestingSupport = 'com.android.support.test:testing-support-lib:0.1' + junit = 'junit:junit:4.10' + junitAddons = 'junit-addons:junit-addons:1.4' + robolectric = 'org.robolectric:robolectric:2.3' + fest = 'com.squareup:fest-android:1.0.8' + appCompat = 'com.android.support:appcompat-v7:21.0.2' + picasso = 'com.squareup.picasso:picasso:2.5.2' + supportV4 = 'com.android.support:support-v4:21.0.0' + retrofit = 'com.squareup.retrofit:retrofit:1.6.1' + retrofitMock = 'com.squareup.retrofit:retrofit-mock:1.6.1' + gson = 'com.google.code.gson:gson:2.2.4' + okHttp = 'com.squareup.okhttp:okhttp:2.0.0' + okHttpUrlConnection = 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' + + mockito = 'org.mockito:mockito-core:1.9.5' + dexmakerMockito = 'com.google.dexmaker:dexmaker-mockito:1.2' + digits = 'com.digits.sdk.android:digits:1.5.0@aar' +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..085a1cdc27db1185342f15a00441734e74fe3735 GIT binary patch literal 52141 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
)Mf(9O=$zt#xQMm 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..aec99730 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/app/build.gradle b/samples/app/build.gradle new file mode 100644 index 00000000..d89376f2 --- /dev/null +++ b/samples/app/build.gradle @@ -0,0 +1,68 @@ +buildscript { + repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } + } + + dependencies { + classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'io.fabric.tools:gradle:1.19.0' + } +} + +//Load API Key information in from property file +Properties props = new Properties() +try { + props.load(file('fabric.properties').newDataInputStream()) +} catch (Exception ex) { + throw new GradleException("Missing fabric.properties, check the fabric.properties.sample file."); +} + +apply plugin: 'com.android.application' +apply plugin: 'io.fabric' + + +repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } +} + +android { + compileSdkVersion rootProject.compileSdkVersion + buildToolsVersion rootProject.buildToolsVersion + + defaultConfig { + applicationId "com.example.app" + versionCode 1 + versionName "1.0" + minSdkVersion 9 + targetSdkVersion rootProject.targetSdkVersion + } + + buildTypes { + debug { + buildConfigField "String", "CONSUMER_KEY", "\"${props.getProperty("twitterConsumerKey")}\"" + buildConfigField "String", "CONSUMER_SECRET", "\"${props.getProperty("twitterConsumerSecret")}\"" + } + release { + buildConfigField "String", "CONSUMER_KEY", "\"${props.getProperty("twitterConsumerKey")}\"" + buildConfigField "String", "CONSUMER_SECRET", "\"${props.getProperty("twitterConsumerSecret")}\"" + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt') + } + } + + lintOptions { + warningsAsErrors true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } +} + +dependencies { + compile project(':twitter') + compile 'com.android.support:appcompat-v7:21.0.3' +} diff --git a/samples/app/fabric.properties.sample b/samples/app/fabric.properties.sample new file mode 100644 index 00000000..c8f49227 --- /dev/null +++ b/samples/app/fabric.properties.sample @@ -0,0 +1,7 @@ +#These keys are provisioned on the plugin. Copy the keys on the plugin here. +twitterConsumerKey=EDIT_THIS +twitterConsumerSecret=EDIT_THIS + +#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. +apiKey=EDIT_THIS +apiSecret=EDIT_THIS \ No newline at end of file diff --git a/samples/app/lint.xml b/samples/app/lint.xml new file mode 100644 index 00000000..a35c9c68 --- /dev/null +++ b/samples/app/lint.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/samples/app/src/main/AndroidManifest.xml b/samples/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..e35af533 --- /dev/null +++ b/samples/app/src/main/AndroidManifest.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/app/src/main/ic_launcher-web.png b/samples/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..5c63bc5e8c8c0cf90e8398e5de9aee577e987f6b GIT binary patch literal 47072 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 activityRef = new WeakReference(TimelineActivity.this); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.tweetui_swipe_timeline); + + final SwipeRefreshLayout swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_layout); + final ListView listView = (ListView) findViewById(android.R.id.list); + + final SearchTimeline timeline = new SearchTimeline.Builder().query("#twitter").build(); + final TweetTimelineListAdapter adapter = new TweetTimelineListAdapter(this, timeline); + setListAdapter(adapter); + + swipeLayout.setColorSchemeResources(R.color.twitter_blue, R.color.twitter_dark); + + // set custom scroll listener to enable swipe refresh layout only when at list top + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + boolean enableRefresh = false; + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) {} + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, + int totalItemCount) { + if (listView != null && listView.getChildCount() > 0) { + // check that the first item is visible and that its top matches the parent + enableRefresh = listView.getFirstVisiblePosition() == 0 && + listView.getChildAt(0).getTop() >= 0; + } else { + enableRefresh = false; + } + swipeLayout.setEnabled(enableRefresh); + } + }); + + // specify action to take on swipe refresh + swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + swipeLayout.setRefreshing(true); + adapter.refresh(new Callback>() { + @Override + public void success(Result> result) { + swipeLayout.setRefreshing(false); + } + + @Override + public void failure(TwitterException exception) { + swipeLayout.setRefreshing(false); + final Activity activity = activityRef.get(); + if (activity != null && !activity.isFinishing()) { + Toast.makeText(activity, exception.getMessage(), + Toast.LENGTH_SHORT).show(); + } + } + }); + } + }); + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TimelinesActivity.java b/samples/app/src/main/java/com/example/app/tweetui/TimelinesActivity.java new file mode 100644 index 00000000..f312cccd --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TimelinesActivity.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.content.res.Resources; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; + +import com.example.app.R; + +/** + * TimelinesActivity pages between different timeline Fragments. + */ +public class TimelinesActivity extends FragmentActivity { + private static final int PAGE_SEARCH = 0; + private static final int PAGE_USER = 1; + private static final int PAGE_COLLECTION = 2; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pager); + + final FragmentManager fm = getSupportFragmentManager(); + final FragmentPagerAdapter pagerAdapter = new TimelinePagerAdapter(fm, getResources()); + final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); + viewPager.setAdapter(pagerAdapter); + } + + public static class TimelinePagerAdapter extends FragmentPagerAdapter { + // titles for timeline fragments, in order + private static final int[] PAGE_TITLE_RES_IDS = { + R.string.search_timeline_title, + R.string.user_timeline_title, + R.string.collection_timeline_title, + }; + private Resources resources; + + public TimelinePagerAdapter(FragmentManager fm, Resources resources) { + super(fm); + this.resources = resources; + } + + @Override + public Fragment getItem(int position) { + switch (position) { + case PAGE_SEARCH: + return SearchTimelineFragment.newInstance(); + case PAGE_USER: + return UserTimelineFragment.newInstance(); + case PAGE_COLLECTION: + return CollectionTimelineFragment.newInstance(); + default: + throw new IllegalStateException("Unexpected Fragment page item requested."); + } + } + + @Override + public int getCount() { + return PAGE_TITLE_RES_IDS.length; + } + + @Override + public CharSequence getPageTitle(int position) { + switch (position) { + case PAGE_SEARCH: + return resources.getString(PAGE_TITLE_RES_IDS[PAGE_SEARCH]); + case PAGE_USER: + return resources.getString(PAGE_TITLE_RES_IDS[PAGE_USER]); + case PAGE_COLLECTION: + return resources.getString(PAGE_TITLE_RES_IDS[PAGE_COLLECTION]); + default: + throw new IllegalStateException("Unexpected Fragment page title requested."); + } + } + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TweetActivity.java b/samples/app/src/main/java/com/example/app/tweetui/TweetActivity.java new file mode 100644 index 00000000..86e25f6a --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TweetActivity.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.app.R; +import com.twitter.sdk.android.core.TwitterException; +import com.twitter.sdk.android.core.models.Tweet; +import com.twitter.sdk.android.tweetui.CompactTweetView; +import com.twitter.sdk.android.tweetui.LoadCallback; +import com.twitter.sdk.android.tweetui.TweetUtils; +import com.twitter.sdk.android.tweetui.TweetView; + +import java.util.Arrays; +import java.util.List; + +public class TweetActivity extends TweetUiActivity { + private static final String TAG = "TweetActivity"; + + @Override + int getLayout() { + return R.layout.activity_frame; + } + + @Override + Fragment createFragment() { + return TweetsFragment.newInstance(); + } + + public static class TweetsFragment extends Fragment { + + public static TweetsFragment newInstance() { + return new TweetsFragment(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View v = inflater.inflate(R.layout.tweetui_fragment_tweet, container, false); + + final ViewGroup tweetRegion = (ViewGroup) v.findViewById(R.id.tweet_region); + + // load single Tweets and construct TweetViews + loadTweet(20L, tweetRegion, R.id.jack_regular_tweet); + loadTweet(510908133917487104L, tweetRegion, R.id.bike_regular_tweet); + + // load multiple Tweets and construct CompactTweetViews + final List tweetIds = Arrays.asList(20L, 510908133917487104L); + final List viewIds = Arrays.asList(R.id.jack_compact_tweet, + R.id.bike_compact_tweet); + loadTweets(tweetIds, tweetRegion, viewIds); + + return v; + } + + /** + * loadTweet wraps TweetUtils.loadTweet with a callback that ensures the view is given a + * known id to simplify UI automation testing. + */ + private void loadTweet(long tweetId, final ViewGroup container, final int viewId) { + final LoadCallback singleTweetCallback = new LoadCallback() { + @Override + public void success(Tweet tweet) { + final Context context = getActivity(); + if (context == null) return; + final View view = new TweetView(context, tweet); + view.setId(viewId); + container.addView(view); + } + + @Override + public void failure(TwitterException exception) { + Log.e(TAG, "loadTweet failure", exception); + } + }; + TweetUtils.loadTweet(tweetId, singleTweetCallback); + } + + /** + * loadTweets wraps TweetUtils.loadTweets to use a callback that ensures each view is given + * a known id to simplify UI automation testing. + */ + private void loadTweets(final List tweetIds, final ViewGroup container, + final List viewIds) { + TweetUtils.loadTweets(tweetIds, new LoadCallback>() { + @Override + public void success(List tweets) { + final Context context = getActivity(); + if (context == null) return; + for (int i = 0; i < tweets.size(); i++) { + final View view = new CompactTweetView(context, tweets.get(i)); + view.setId(viewIds.get(i)); + container.addView(view); + } + } + + @Override + public void failure(TwitterException exception) { + Log.e(TAG, "loadTweets failure " + tweetIds, exception); + } + }); + } + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TweetListActivity.java b/samples/app/src/main/java/com/example/app/tweetui/TweetListActivity.java new file mode 100644 index 00000000..a3d84a14 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TweetListActivity.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.support.v4.app.Fragment; + +import com.example.app.R; + +public class TweetListActivity extends TweetUiActivity { + + + @Override + int getLayout() { + return R.layout.activity_frame; + } + + @Override + Fragment createFragment() { + return TweetListFragment.newInstance(); + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TweetListFragment.java b/samples/app/src/main/java/com/example/app/tweetui/TweetListFragment.java new file mode 100644 index 00000000..95d64a15 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TweetListFragment.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.ListFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import com.twitter.sdk.android.core.TwitterException; +import com.twitter.sdk.android.core.models.Tweet; +import com.twitter.sdk.android.tweetui.CompactTweetView; +import com.twitter.sdk.android.tweetui.LoadCallback; +import com.twitter.sdk.android.tweetui.TweetViewFetchAdapter; + +import com.example.app.R; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import io.fabric.sdk.android.services.common.SafeToast; + +/** + * Displays a layout with a ListView widget bound to a TweetViewAdapter data source. + */ +public class TweetListFragment extends ListFragment { + + final List tweetIds = new ArrayList<>(); + + public static TweetListFragment newInstance() { + return new TweetListFragment(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + tweetIds.addAll(Arrays.asList(574000939800993792L, 503435417459249153L, 510908133917487104L, + 473514864153870337L, 477788140900347904L, 20L, 484816434313195520L, + 466041861774114819L, 448250020773380096L)); + final TweetViewFetchAdapter adapter = new TweetViewFetchAdapter( + getActivity()) { + @Override + public CompactTweetView getTweetView(Context context, Tweet tweet) { + return new CompactTweetView(context, tweet, R.style.tw__TweetLightStyle); + } + }; + setListAdapter(adapter); + adapter.setTweetIds(tweetIds, new LoadCallback>() { + @Override + public void success(List tweets) {} + + @Override + public void failure(TwitterException exception) { + SafeToast.makeText(getActivity(), R.string.multi_tweet_view_error, + Toast.LENGTH_SHORT).show(); + } + }); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View view = inflater.inflate(R.layout.tweetui_timeline, container, false); + return view; + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TweetPreviewActivity.java b/samples/app/src/main/java/com/example/app/tweetui/TweetPreviewActivity.java new file mode 100644 index 00000000..614b9a74 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TweetPreviewActivity.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Toast; + +import com.example.app.R; +import com.twitter.sdk.android.core.TwitterException; +import com.twitter.sdk.android.core.models.Tweet; +import com.twitter.sdk.android.tweetui.CompactTweetView; +import com.twitter.sdk.android.tweetui.LoadCallback; +import com.twitter.sdk.android.tweetui.TweetUtils; +import com.twitter.sdk.android.tweetui.TweetView; + + +public class TweetPreviewActivity extends TweetUiActivity { + private static final String TAG = "TweetPreviewActivity"; + + @Override + int getLayout() { + return R.layout.activity_frame; + } + + @Override + Fragment createFragment() { + return TweetPreviewFragment.newInstance(); + } + + /** + * Fragment showing a Tweet id input field, light/dark buttons, and a scrollable region which + * renders light/dark previews of the requested Tweet for quick manual validation. + */ + public static class TweetPreviewFragment extends Fragment { + + public static TweetPreviewFragment newInstance() { + return new TweetPreviewFragment(); + } + + @Override + public View onCreateView(LayoutInflater inflater, final ViewGroup container, + Bundle savedInstanceState) { + final View v = inflater.inflate(R.layout.tweetui_fragment_tweet_preview, container, + false); + + final ViewGroup tweetRegion = (ViewGroup) v.findViewById(R.id.tweet_region); + final EditText selectorInput = (EditText) v.findViewById(R.id.selector_input_tweet_id); + final Button lightButton = (Button) v.findViewById(R.id.button_show_light); + final Button darkButton = (Button) v.findViewById(R.id.button_show_dark); + + lightButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final long tweetId = Long.parseLong(selectorInput.getText().toString()); + tweetRegion.removeAllViews(); + loadTweet(tweetId, tweetRegion, R.style.tw__TweetLightStyle); + } + }); + + darkButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final long tweetId = Long.parseLong(selectorInput.getText().toString()); + tweetRegion.removeAllViews(); + loadTweet(tweetId, tweetRegion, R.style.tw__TweetDarkStyle); + } + }); + + return v; + } + + /** + * loadTweet wraps TweetUtils.loadTweet with a callback that ensures a compact and default + * view with the correct style and spacing are inserted. + */ + private void loadTweet(long tweetId, final ViewGroup container, final int style) { + + final LoadCallback singleTweetCallback = new LoadCallback() { + @Override + public void success(Tweet tweet) { + final Context context = getActivity(); + if (context == null) return; + + final CompactTweetView cv = new CompactTweetView(context, tweet, style); + container.addView(cv); + + final View spacer = new View(context); + final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, + (int) context.getResources().getDimension(R.dimen.demo_tweet_space)); + spacer.setLayoutParams(params); + container.addView(spacer); + + final TweetView tv = new TweetView(context, tweet, style); + container.addView(tv); + } + + @Override + public void failure(TwitterException exception) { + final Context context = getActivity(); + if (context == null) return; + Toast.makeText(context, R.string.tweet_load_error, Toast.LENGTH_SHORT).show(); + Log.e(TAG, "loadTweet failure", exception); + } + }; + TweetUtils.loadTweet(tweetId, singleTweetCallback); + } + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TweetUiActivity.java b/samples/app/src/main/java/com/example/app/tweetui/TweetUiActivity.java new file mode 100644 index 00000000..92897816 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TweetUiActivity.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; + +import com.example.app.R; + +public abstract class TweetUiActivity extends FragmentActivity { + + abstract int getLayout(); + + // Builder to create the Fragment added to the Activity's container + abstract Fragment createFragment(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .add(R.id.container, createFragment()) + .commit(); + } + + setContentView(getLayout()); + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/TweetUiMainActivity.java b/samples/app/src/main/java/com/example/app/tweetui/TweetUiMainActivity.java new file mode 100644 index 00000000..4a4b5a60 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/TweetUiMainActivity.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.view.View; +import android.widget.Button; + +import com.example.app.R; + +public class TweetUiMainActivity extends FragmentActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.tweetui_activity_main); + + final Button xmlTweetButton = (Button) findViewById(R.id.button_xml_tweet_activity); + xmlTweetButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(TweetUiMainActivity.this, XmlTweetActivity.class)); + } + }); + + final Button tweetActivityButton = (Button) findViewById(R.id.button_tweet_activity); + tweetActivityButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(TweetUiMainActivity.this, TweetActivity.class)); + } + }); + + final Button unqiueTweetButton = (Button) findViewById(R.id.button_unique_tweet_activity); + unqiueTweetButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(TweetUiMainActivity.this, UniqueTweetActivity.class)); + } + }); + + final Button tweetListButton = (Button) findViewById(R.id.button_tweet_list_activity); + tweetListButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(TweetUiMainActivity.this, TweetListActivity.class)); + } + }); + + final Button timelineButton = (Button) findViewById(R.id.button_timeline_activity); + timelineButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(TweetUiMainActivity.this, TimelineActivity.class)); + } + }); + + final Button timelinesButton = (Button) findViewById(R.id.button_timelines_activity); + timelinesButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startActivity(new Intent(TweetUiMainActivity.this, TimelinesActivity.class)); + } + }); + + final Button tweetSelectorButton = (Button) findViewById( + R.id.button_tweet_preview_activity); + tweetSelectorButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(TweetUiMainActivity.this, TweetPreviewActivity.class)); + } + }); + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/UniqueTweetActivity.java b/samples/app/src/main/java/com/example/app/tweetui/UniqueTweetActivity.java new file mode 100644 index 00000000..d78e9809 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/UniqueTweetActivity.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import com.twitter.sdk.android.core.models.Tweet; +import com.twitter.sdk.android.core.models.TweetBuilder; +import com.twitter.sdk.android.core.models.User; +import com.twitter.sdk.android.core.models.UserBuilder; +import com.twitter.sdk.android.tweetui.TweetView; + +import com.example.app.R; + +public class UniqueTweetActivity extends TweetUiActivity { + private static final String TAG = "UniqueTweetActivity"; + + @Override + int getLayout() { + return R.layout.activity_frame; + } + + @Override + Fragment createFragment() { + return UniqueTweetFragment.newInstance(); + } + + /** + * Fragment showing unique Tweet view cases. + */ + public static class UniqueTweetFragment extends Fragment { + + public static UniqueTweetFragment newInstance() { + return new UniqueTweetFragment(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + final View v = inflater.inflate(R.layout.tweetui_fragment_unique_tweet, container, + false); + + final LinearLayout tweetRegion = (LinearLayout) v.findViewById(R.id.tweet_region); + + // Tweet object already present, construct a TweetView + final Tweet knownTweet = new TweetBuilder() + .setId(3L) + .setUser(new UserBuilder() + .setId(User.INVALID_ID) + .setName("name") + .setScreenName("namename") + .setVerified(false) + .build() + ) + .setText("Preloaded text of a Tweet that couldn't be loaded.") + .setCreatedAt("Wed Jun 06 20:07:10 +0000 2012") + .build(); + final TweetView knownTweetView = new TweetView(getActivity(), knownTweet); + tweetRegion.addView(knownTweetView); + + return v; + } + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/UserTimelineFragment.java b/samples/app/src/main/java/com/example/app/tweetui/UserTimelineFragment.java new file mode 100644 index 00000000..b8174823 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/UserTimelineFragment.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.tweetui; + +import android.os.Bundle; +import android.support.v4.app.ListFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.app.R; +import com.twitter.sdk.android.tweetui.TweetTimelineListAdapter; +import com.twitter.sdk.android.tweetui.UserTimeline; + +/** + * UserTimelineFragment demonstrates a TimelineListAdapter with a UserTimeline. + */ +public class UserTimelineFragment extends ListFragment { + + public static UserTimelineFragment newInstance() { + return new UserTimelineFragment(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + final UserTimeline userTimeline = new UserTimeline.Builder().screenName("fabric").build(); + final TweetTimelineListAdapter adapter = new TweetTimelineListAdapter(getActivity(), + userTimeline); + setListAdapter(adapter); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.tweetui_timeline, container, false); + } +} diff --git a/samples/app/src/main/java/com/example/app/tweetui/XmlTweetActivity.java b/samples/app/src/main/java/com/example/app/tweetui/XmlTweetActivity.java new file mode 100644 index 00000000..77515f20 --- /dev/null +++ b/samples/app/src/main/java/com/example/app/tweetui/XmlTweetActivity.java @@ -0,0 +1,39 @@ +package com.example.app.tweetui; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.app.R; + +public class XmlTweetActivity extends TweetUiActivity { + private static final String TAG = "XmlTweetActivity"; + + @Override + int getLayout() { + return R.layout.activity_frame; + } + + @Override + Fragment createFragment() { + return XmlTweetFragment.newInstance(); + } + + /** + * UI fragment showing XML Tweet views for automated ui testing + */ + public static class XmlTweetFragment extends Fragment { + + public static XmlTweetFragment newInstance() { + return new XmlTweetFragment(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.tweetui_fragment_xml_tweet, container, false); + } + } +} diff --git a/samples/app/src/main/java/com/example/app/twittercore/TwitterCoreMainActivity.java b/samples/app/src/main/java/com/example/app/twittercore/TwitterCoreMainActivity.java new file mode 100644 index 00000000..607a5c3f --- /dev/null +++ b/samples/app/src/main/java/com/example/app/twittercore/TwitterCoreMainActivity.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2015 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.example.app.twittercore; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +import com.twitter.sdk.android.core.Callback; +import com.twitter.sdk.android.core.Result; +import com.twitter.sdk.android.core.TwitterException; +import com.twitter.sdk.android.core.TwitterSession; +import com.twitter.sdk.android.core.identity.TwitterAuthClient; +import com.twitter.sdk.android.core.identity.TwitterLoginButton; + +import com.example.app.R; + +public class TwitterCoreMainActivity extends Activity { + + private TwitterLoginButton loginButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.twittercore_activity_main); + + // Set up the login button by setting callback to invoke when authorization request + // completes + loginButton = (TwitterLoginButton) findViewById(R.id.login_button); + loginButton.setCallback(new Callback() { + @Override + public void success(Result result) { + requestEmailAddress(result.data); + } + + @Override + public void failure(TwitterException exception) { + // Upon error, show a toast message indicating that authorization request failed. + Toast.makeText(TwitterCoreMainActivity.this, exception.getMessage(), + Toast.LENGTH_SHORT).show(); + } + }); + } + + private void requestEmailAddress(TwitterSession session) { + new TwitterAuthClient().requestEmail(session, new Callback() { + @Override + public void success(Result result) { + Toast.makeText(TwitterCoreMainActivity.this, result.data, + Toast.LENGTH_SHORT).show(); + } + + @Override + public void failure(TwitterException exception) { + Toast.makeText(TwitterCoreMainActivity.this, exception.getMessage(), + Toast.LENGTH_SHORT).show(); + } + }); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + // Pass the activity result to the saveSession button. + loginButton.onActivityResult(requestCode, resultCode, data); + } +} diff --git a/samples/app/src/main/res/drawable-hdpi/ic_launcher.png b/samples/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3403ab70c85bf310da629c97c8e02b5b43ce715b GIT binary patch literal 3476 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 literal 0 HcmV?d00001 diff --git a/samples/app/src/main/res/drawable-mdpi/ic_launcher.png b/samples/app/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b53e976e6672aad6c8497ecf3a0dfaf158b14938 GIT binary patch literal 2534 zcmaJ@dpwhUA08`3^*BDtdA5*;9UN!NoOZygp*0MtX1g)$U>jydBH@ukbU+7EL?=TO zDn&@1QV5kA(Lp4oLOt`q_|CWF8&}W4Vd> zz!tG5l_8E`V3<%x2Z+50D-&P?LOMjmj^qfiA{_L)E>?D5bR(gV?+{@G4*E}0G_p4Y z&*cLU8-y*KfwHiMpfLyw8(TC6Z4R-N*+`Tf(h>znVX!ttUE^_q;nX6I{^ok=^$7vCKhdrazT@9NoWg#vxNoG+S$^@n&3jPAfhmK zXp}Q%iA&%zqS*jPxWr}th44$gA6(`y zbFn4(Awt89&z_;K+8KFI(=C6gNHyq(F5iI8#NBCj!R3 z@?td-!dUfnPJxg_)qKx=eAV|!c=ezdf#4{o#qJfgH$Fh~va<2lOS93_$^&bEKa-Jx zwIS7zw~~6VU|PqWsJB)H6E}E^k;@xi`E4t%B*IG}6$*)LyEh$ z?YyJt^2!@A+dSebQ1y3P&h6{(Gce;<5-)7zx!Uc{^3#QO9=m!+qx+s~;dIWfXBTt2 zjVbI3s62n(zl;KDhCc_V=~u38|DzD}XKFfep{wcP0Xvl7-txh-25zzi41f8LGXSfaJrKL%R%n!zmE z&Z;~0rdlyX;iHSZ%EoUoSqf$$wWd>yVIqU0aNw{glp&Tc(v(RZH-ccO|)FFG#vgeJQ8*KG~rRD+m3#X6ycxvpu(g zo_En9x(zIn*X}U8;^DIM2J|i31{w2GpCM7%O zg3DfLbG&!`C8>^5JN}uUS(B}MGUDX^+1H>~DeIzc>Ev?dZX25QD~bF56<0G zEs%WJFUmbBS7=wdADop7&dN>#lk^fHMf*J0s-;PFLUg=ykE?7jDo=jA73Pt?eqI_1 z8%oG9&{7)J$sF|6^ox9?IdN}ytu;8MBC0$hdUzCP_Sa~#*44_~5B*LhfrLGwRi8`d z6hjb(S{(m_Sz}{Sa?u~b$(rCgWO<(NG?Sxs+<~eT;aZlVBeFhHJ@*7%!%HLj#!LTH zn0#i8z`__eESyP4JA0P}{d*RMCzFU5Qa;+}e00e!N~q{!SYyFK8J(uIQ* zjA^)a{?lQyq4U@62siw;wyEFxYV9N$Z)(n+QSLlrG@M+bVG!fk<+&bIEfov44T%8$UjJRv%qPcY9p)7&v0q8o{7fy*_3DrRV~&TrwjNCzKz zL8iDk6Kl}T)5N{^wY%fxaa#k++ndJ<>3Xff_8#yN!_|jgg)_(coURWTy(gMVqmH`u zzAYG1pG}LKPpJCslbTw=V7we}_OxP~!>)R;$!)`QLTzmd_8_@uwn38IOI61fZ0tIP zgw=JG9DY>RrR`GE_C}L>c%8Sk&%N&0Cqc|W^?(U|job%jr7@J#l&1tQqZ7tc3I}fA z5vs7m^!0qI^WO;@qE6nG`+e18gFVZ#sqSZHTucP>@?8e$f3q8$AkPzw{e4e&Bh82M zm>;ST`gM=OssmQqkL32*hAC7NGoZA<~L)R>$Lqop>=Lyl~6zi}1=Uel0s z`}vDtZM2;wM)Rd&G_8HSxw25R(QC-3x>HOn9850@MQ2>?=uYMZ(!3zW{iR7hk~9Og zxVDG`QD66wXcG1?ZDIjAXN(7(Sov8BlP^yn0)-PmffiFO>26lT)4nOQ9ZCxuMtt-P j$3_qAf~#L&Fu4H&litF?Ek!Ade_rlHPr^l)9ZCNN5pXR2 literal 0 HcmV?d00001 diff --git a/samples/app/src/main/res/drawable-xhdpi/ic_launcher.png b/samples/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b4d2ff44269a4bda1c9f65bc065dda736850a8 GIT binary patch literal 4260 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 literal 0 HcmV?d00001 diff --git a/samples/app/src/main/res/drawable-xxxhdpi/ic_launcher.png b/samples/app/src/main/res/drawable-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b8bca1e38fd289052bcc688e66230d3e87760b GIT binary patch literal 7784 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 literal 0 HcmV?d00001 diff --git a/samples/app/src/main/res/layout/activity_frame.xml b/samples/app/src/main/res/layout/activity_frame.xml new file mode 100644 index 00000000..c6844783 --- /dev/null +++ b/samples/app/src/main/res/layout/activity_frame.xml @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/samples/app/src/main/res/layout/activity_main.xml b/samples/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..bb8f39eb --- /dev/null +++ b/samples/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,55 @@ + + + + + + + +