Skip to content

Commit 38eb158

Browse files
committed
git init
0 parents  commit 38eb158

39 files changed

Lines changed: 1125 additions & 0 deletions

File tree

android-tweet-embed/build.gradle

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apply plugin: 'com.android.library'
2+
apply plugin: 'kotlin-android'
3+
apply plugin: 'kotlin-android-extensions'
4+
5+
android {
6+
compileSdkVersion 30
7+
buildToolsVersion "30.0.2"
8+
9+
defaultConfig {
10+
minSdkVersion 21
11+
targetSdkVersion 30
12+
versionCode 1
13+
versionName "1.0"
14+
15+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
16+
consumerProguardFiles "consumer-rules.pro"
17+
}
18+
19+
compileOptions {
20+
sourceCompatibility JavaVersion.VERSION_1_8
21+
targetCompatibility JavaVersion.VERSION_1_8
22+
}
23+
24+
kotlinOptions {
25+
jvmTarget = "1.8"
26+
}
27+
28+
buildTypes {
29+
release {
30+
minifyEnabled false
31+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
32+
}
33+
}
34+
}
35+
36+
dependencies {
37+
implementation fileTree(dir: "libs", include: ["*.jar"])
38+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
39+
implementation 'androidx.core:core-ktx:1.3.2'
40+
implementation 'androidx.appcompat:appcompat:1.2.0'
41+
testImplementation 'junit:junit:4.12'
42+
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
43+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
44+
45+
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
46+
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
47+
48+
}

android-tweet-embed/consumer-rules.pro

Whitespace-only changes.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.github.yashx.android_tweet_embed
2+
3+
import androidx.test.platform.app.InstrumentationRegistry
4+
import androidx.test.ext.junit.runners.AndroidJUnit4
5+
6+
import org.junit.Test
7+
import org.junit.runner.RunWith
8+
9+
import org.junit.Assert.*
10+
11+
/**
12+
* Instrumented test, which will execute on an Android device.
13+
*
14+
* See [testing documentation](http://d.android.com/tools/testing).
15+
*/
16+
@RunWith(AndroidJUnit4::class)
17+
class ExampleInstrumentedTest {
18+
@Test
19+
fun useAppContext() {
20+
// Context of the app under test.
21+
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22+
assertEquals("com.github.yashx.android_tweet_embed.test", appContext.packageName)
23+
}
24+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="com.github.yashx.android_tweet_embed">
3+
4+
<uses-permission android:name="android.permission.INTERNET" />
5+
</manifest>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.github.yashx.android_tweet_embed
2+
3+
import android.content.Context
4+
import android.os.Build
5+
import android.util.AttributeSet
6+
import android.webkit.WebChromeClient
7+
import android.webkit.WebSettings
8+
import android.webkit.WebView
9+
10+
class AndroidTweetEmbed : WebView {
11+
constructor(context: Context) : super(context)
12+
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
13+
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
14+
context,
15+
attrs,
16+
defStyleAttr
17+
)
18+
19+
constructor(
20+
context: Context,
21+
attrs: AttributeSet?,
22+
defStyleAttr: Int,
23+
defStyleRes: Int
24+
) : super(context, attrs, defStyleAttr, defStyleRes)
25+
26+
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, privateBrowsing: Boolean) : super(
27+
context,
28+
attrs,
29+
defStyleAttr,
30+
privateBrowsing
31+
)
32+
33+
34+
init {
35+
36+
webChromeClient = WebChromeClient()
37+
settings.apply {
38+
javaScriptEnabled = true
39+
domStorageEnabled = true
40+
loadsImagesAutomatically = true
41+
defaultTextEncodingName = "UTF-8"
42+
layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL
43+
useWideViewPort = false
44+
}
45+
isHorizontalScrollBarEnabled = false
46+
isVerticalScrollBarEnabled = false
47+
isScrollContainer = false
48+
}
49+
50+
fun loadTweetUrl(
51+
url: String,
52+
hideMedia: Boolean? = null,
53+
hideThread: Boolean? = null,
54+
theme: TweetTheme? = null,
55+
doNotTrack: Boolean? = null,
56+
) {
57+
58+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
59+
settings.forceDark = if (theme == TweetTheme.DARK) WebSettings.FORCE_DARK_ON else WebSettings.FORCE_DARK_OFF
60+
}
61+
62+
TwitterOembedHelper.getOembedResponseForUrl(
63+
url,
64+
hideMedia,
65+
hideThread,
66+
theme,
67+
doNotTrack
68+
) { _, response ->
69+
response.body()?.html?.showTweet()
70+
}
71+
72+
}
73+
74+
fun loadTweetId(
75+
id: String,
76+
hideMedia: Boolean? = null,
77+
hideThread: Boolean? = null,
78+
theme: TweetTheme? = null,
79+
doNotTrack: Boolean? = null,
80+
) {
81+
82+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
83+
settings.forceDark = if (theme == TweetTheme.DARK) WebSettings.FORCE_DARK_ON else WebSettings.FORCE_DARK_OFF
84+
}
85+
86+
TwitterOembedHelper.getOembedResponseForId(
87+
id,
88+
hideMedia,
89+
hideThread,
90+
theme,
91+
doNotTrack
92+
) { _, response ->
93+
response.body()?.html?.showTweet()
94+
}
95+
96+
}
97+
98+
private fun String.showTweet() {
99+
loadDataWithBaseURL("https://twitter.com", this, "text/html", "utf-8", null)
100+
}
101+
102+
103+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.github.yashx.android_tweet_embed
2+
3+
import com.google.gson.annotations.SerializedName
4+
import retrofit2.Call
5+
import retrofit2.Callback
6+
import retrofit2.Response
7+
import retrofit2.Retrofit
8+
import retrofit2.converter.gson.GsonConverterFactory
9+
import retrofit2.http.GET
10+
import retrofit2.http.Query
11+
12+
interface TwitterOembedInterface {
13+
14+
@GET("oembed")
15+
fun fetchResponse(
16+
@Query("url") url: String,
17+
@Query("hide_media") hideMedia: Boolean? = null,
18+
@Query("hide_thread") hideThread: Boolean? = null,
19+
@Query("theme") theme: String? = null,
20+
@Query("dnt") doNotTrack: Boolean? = null
21+
): Call<TwitterOembedResponse>
22+
}
23+
24+
data class TwitterOembedResponse(
25+
26+
@SerializedName("url") val url: String,
27+
@SerializedName("author_name") val author_name: String,
28+
@SerializedName("author_url") val author_url: String,
29+
@SerializedName("html") val html: String,
30+
@SerializedName("width") val width: Int,
31+
@SerializedName("height") val height: Int,
32+
@SerializedName("type") val type: String,
33+
@SerializedName("cache_age") val cache_age: String,
34+
@SerializedName("provider_name") val provider_name: String,
35+
@SerializedName("provider_url") val provider_url: String,
36+
@SerializedName("version") val version: String
37+
)
38+
39+
enum class TweetTheme(val value: String) {
40+
LIGHT("light"), DARK("dark")
41+
}
42+
43+
object TwitterOembedHelper {
44+
45+
private val twitterOembedInterface = Retrofit.Builder()
46+
.addConverterFactory(GsonConverterFactory.create())
47+
.baseUrl("https://publish.twitter.com/").build()
48+
.create(TwitterOembedInterface::class.java)
49+
50+
fun getOembedResponseForUrl(
51+
url: String,
52+
hideMedia: Boolean? = null,
53+
hideThread: Boolean? = null,
54+
theme: TweetTheme? = null,
55+
doNotTrack: Boolean? = null,
56+
onSuccess: (Call<TwitterOembedResponse>, Response<TwitterOembedResponse>) -> Unit
57+
) {
58+
twitterOembedInterface.fetchResponse(url, hideMedia, hideThread, theme?.value, doNotTrack)
59+
.enqueue(object : Callback<TwitterOembedResponse> {
60+
override fun onResponse(call: Call<TwitterOembedResponse>, response: Response<TwitterOembedResponse>) {
61+
onSuccess.invoke(call, response)
62+
}
63+
64+
override fun onFailure(call: Call<TwitterOembedResponse>, t: Throwable) {
65+
}
66+
})
67+
}
68+
69+
fun getOembedResponseForId(
70+
id: String,
71+
hideMedia: Boolean? = null,
72+
hideThread: Boolean? = null,
73+
theme: TweetTheme? = null,
74+
doNotTrack: Boolean? = null,
75+
onSuccess: (Call<TwitterOembedResponse>, Response<TwitterOembedResponse>) -> Unit
76+
) {
77+
getOembedResponseForUrl(
78+
"https://twitter.com/twitter/status/$id",
79+
hideMedia,
80+
hideThread,
81+
theme,
82+
doNotTrack,
83+
onSuccess
84+
)
85+
}
86+
87+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.yashx.android_tweet_embed
2+
3+
import org.junit.Test
4+
5+
import org.junit.Assert.*
6+
7+
/**
8+
* Example local unit test, which will execute on the development machine (host).
9+
*
10+
* See [testing documentation](http://d.android.com/tools/testing).
11+
*/
12+
class ExampleUnitTest {
13+
@Test
14+
fun addition_isCorrect() {
15+
assertEquals(4, 2 + 2)
16+
}
17+
}

app/build.gradle

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
apply plugin: 'com.android.application'
2+
apply plugin: 'kotlin-android'
3+
apply plugin: 'kotlin-android-extensions'
4+
5+
android {
6+
compileSdkVersion 30
7+
buildToolsVersion "30.0.2"
8+
9+
defaultConfig {
10+
applicationId "com.github.yashx.android_tweet_embed_demo"
11+
minSdkVersion 21
12+
targetSdkVersion 30
13+
versionCode 1
14+
versionName "1.0"
15+
16+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
17+
}
18+
19+
compileOptions {
20+
sourceCompatibility JavaVersion.VERSION_1_8
21+
targetCompatibility JavaVersion.VERSION_1_8
22+
}
23+
24+
kotlinOptions {
25+
jvmTarget = "1.8"
26+
}
27+
28+
buildTypes {
29+
release {
30+
minifyEnabled false
31+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
32+
}
33+
}
34+
}
35+
36+
dependencies {
37+
implementation fileTree(dir: "libs", include: ["*.jar"])
38+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
39+
implementation 'androidx.core:core-ktx:1.3.2'
40+
implementation 'androidx.appcompat:appcompat:1.2.0'
41+
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
42+
implementation project(path: ':android-tweet-embed')
43+
testImplementation 'junit:junit:4.12'
44+
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
45+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
46+
47+
}

app/proguard-rules.pro

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile

0 commit comments

Comments
 (0)