diff --git a/app/build.gradle b/app/build.gradle index 5ee160ad8..07c6a8a9e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,13 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0' androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0' androidTestImplementation 'br.com.concretesolutions:kappuccino:1.2.1' + + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.squareup.okhttp3:mockwebserver:4.2.2' + implementation "com.github.bumptech.glide:glide:4.8.0" + implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.1.0' + implementation 'com.google.android.flexbox:flexbox:3.0.0' } tasks.withType(Test) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 28a40e935..5bafc5c51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,21 +2,34 @@ - + + + android:theme="@style/AppTheme" + android:usesCleartextTraffic="true"> + android:name="com.iterable.androidsdk.inboxCustomization.MainActivity" + android:exported="true"> + + + + + + + + \ No newline at end of file diff --git a/sample-apps/inbox-customization/app/src/main/assets/black-coffee.png b/app/src/main/assets/black-coffee.png similarity index 100% rename from sample-apps/inbox-customization/app/src/main/assets/black-coffee.png rename to app/src/main/assets/black-coffee.png diff --git a/sample-apps/inbox-customization/app/src/main/assets/cappuccino.png b/app/src/main/assets/cappuccino.png similarity index 100% rename from sample-apps/inbox-customization/app/src/main/assets/cappuccino.png rename to app/src/main/assets/cappuccino.png diff --git a/sample-apps/inbox-customization/app/src/main/assets/latte.png b/app/src/main/assets/latte.png similarity index 100% rename from sample-apps/inbox-customization/app/src/main/assets/latte.png rename to app/src/main/assets/latte.png diff --git a/sample-apps/inbox-customization/app/src/main/assets/mocha.png b/app/src/main/assets/mocha.png similarity index 100% rename from sample-apps/inbox-customization/app/src/main/assets/mocha.png rename to app/src/main/assets/mocha.png diff --git a/app/src/main/assets/simple-embedded-messages.json b/app/src/main/assets/simple-embedded-messages.json new file mode 100644 index 000000000..210ef2a74 --- /dev/null +++ b/app/src/main/assets/simple-embedded-messages.json @@ -0,0 +1,266 @@ +{ + "placements": [ + { + "placementId": 0, + "embeddedMessages": [ + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI5MzAvMTA4NDUxNzAvdHJ1ZQ==", + "placementId": 0, + "campaignId": 8162930, + "isProof": true + }, + "elements": { + "title": "Join our partner gyms at 40% off", + "body": "Choose from one of our partners and subscribe for 1 year at 40% off", + "mediaUrl": "https://images.pexels.com/photos/1954524/pexels-photo-1954524.jpeg?auto=compress&cs=tinysrgb&w=800", + "buttons": [ + { + "id": "gym1", + "title": "Gold's Gym", + "action": { + "type": "openUrl", + "data": "https://goldsgym.in/" + } + }, + { + "id": "gym2", + "title": "23 Fitness", + "action": { + "type": "openUrl", + "data": "https://www.23fitnessguam.com/" + } + } + ] + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI4NDMvMTA4NDUwNjAvdHJ1ZQ==", + "placementId": 0, + "campaignId": 8162843, + "isProof": true + }, + "elements": { + "title": "Last chance to grab the deal", + "body": "Visit out website to get the festive deals", + "mediaUrl": "https://athflex.com/cdn/shop/files/pc-banner-for-bag-4_1_1905x.jpg?v=1698474351", + "defaultAction": { + "type": "openUrl", + "data": "https://athflex.com/" + } + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI4NjMvMTA4NDUwOTMvdHJ1ZQ==", + "placementId": 0, + "campaignId": 8162863, + "isProof": true + }, + "elements": { + "title": "Buy fitness products at huge discounts", + "body": "Visit our website to buy the products", + "mediaUrl": "https://m.media-amazon.com/images/I/71AyxR0yeeL.jpg", + "buttons": [ + { + "id": "", + "title": "70% off", + "action": { + "type": "openUrl", + "data": "https://www.vivafitness.net/product_category/commercial-equipment/water-rowers/" + } + } + ], + "defaultAction": { + "type": "openUrl", + "data": "https://www.vivafitness.net/product_category/commercial-equipment/commercial-treadmills/" + } + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI3NzEvMTA4NDQ5NjIvdHJ1ZQ==", + "placementId": 0, + "campaignId": 8162771, + "isProof": true + }, + "elements": { + "title": "Spring Collection", + "body": "Check out our new athleisure collection at 30% off this month!", + "mediaUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSHVMF2KkRm5eWS6LhjQGvxe4KFqzkRbUdAEsAEKvBSy_uU23tRxXH0Ws6HuBjfzf_EsSU&usqp=CAU", + "buttons": [ + { + "id": "button1", + "title": "Clearance Sale", + "action": { + "type": "openUrl", + "data": "https://athflex.com/collections/last-chance" + } + } + ], + "defaultAction": { + "type": "openUrl", + "data": "https://athflex.com/" + } + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjc4OTAvMTA4NTEyMzEvdHJ1ZQ==", + "placementId": 0, + "campaignId": 8167890, + "isProof": true + }, + "elements": { + "title": "Let's hit the target by running 10kms", + "mediaUrl": "https://media.istockphoto.com/id/1125038961/photo/young-man-running-outdoors-in-morning.jpg?s=612x612&w=0&k=20&c=LVAlQIforg7ZRAF-bOvdvoD_k3ejEeimrWbGq2IA5ak=" + } + } + ] + }, + { + "placementId": 1, + "embeddedMessages": [ + { + "metadata": { + "messageId": "ZGEzNmMyZTQtN1234560YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI5MzAvMTA4NDUxNzAvdHJ1ZQ==", + "placementId": 1, + "campaignId": 8162930, + "isProof": true + }, + "elements": { + "title": "Join our partner gyms at 40% off", + "body": "Choose from one of our partners and subscribe for 1 year at 40% off", + "mediaUrl": "https://images.pexels.com/photos/1954524/pexels-photo-1954524.jpeg?auto=compress&cs=tinysrgb&w=800", + "buttons": [ + { + "id": "gym1", + "title": "Gold's Gym", + "action": { + "type": "openUrl", + "data": "https://goldsgym.in/" + } + }, + { + "id": "gym2", + "title": "23 Fitness", + "action": { + "type": "openUrl", + "data": "https://www.23fitnessguam.com/" + } + } + ] + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzI43TY3LzgxNjI4NDMvMTA4NDUwNjAvdHJ1ZQ==", + "placementId": 1, + "campaignId": 8162843, + "isProof": true + }, + "elements": { + "title": "Last chance to grab the deal", + "body": "Visit out website to get the festive deals", + "mediaUrl": "https://athflex.com/cdn/shop/files/pc-banner-for-bag-4_1_1905x.jpg?v=1698474351", + "defaultAction": { + "type": "openUrl", + "data": "https://athflex.com/" + } + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy11YzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI4NjMvMTA4NDUwOTMvdHJ1ZQ==", + "placementId": 1, + "campaignId": 8162863, + "isProof": true + }, + "elements": { + "title": "Buy fitness products at huge discounts", + "body": "Visit our website to buy the products", + "mediaUrl": "https://m.media-amazon.com/images/I/71AyxR0yeeL.jpg", + "buttons": [ + { + "id": "", + "title": "70% off", + "action": { + "type": "openUrl", + "data": "https://www.vivafitness.net/product_category/commercial-equipment/water-rowers/" + } + } + ], + "defaultAction": { + "type": "openUrl", + "data": "https://www.vivafitness.net/product_category/commercial-equipment/commercial-treadmills/" + } + } + }, + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMy00YzUyLWFmZjktZDhhhDZlYjg3ZjA4LzIwNTY3LzgxNjI3NzEvMHA4NDQ5NjIvdHJ1ZQ==", + "placementId": 1, + "campaignId": 8162771, + "isProof": true + }, + "elements": { + "title": "Spring Collection", + "body": "Check out our new athleisure collection at 30% off this month!", + "mediaUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSHVMF2KkRm5eWS6LhjQGvxe4KFqzkRbUdAEsAEKvBSy_uU23tRxXH0Ws6HuBjfzf_EsSU&usqp=CAU", + "buttons": [ + { + "id": "button1", + "title": "Clearance Sale", + "action": { + "type": "openUrl", + "data": "https://athflex.com/collections/last-chance" + } + } + ], + "defaultAction": { + "type": "openUrl", + "data": "https://athflex.com/" + } + } + } + ] + }, + { + "placementId": 2, + "embeddedMessages": [ + { + "metadata": { + "messageId": "ZGEzNmMyZTQtNWFiMynkyzUyLWFmZjktZDhhMDZlYjg3ZjA4LzIwNTY3LzgxNjI5MzAvMTA4NDUxNzAvdHJ1ZQ==", + "placementId": 2, + "campaignId": 8162930, + "isProof": true + }, + "elements": { + "title": "Join our partner gyms at 40% off", + "body": "Choose from one of our partners and subscribe for 1 year at 40% off", + "mediaUrl": "https://images.pexels.com/photos/1954524/pexels-photo-1954524.jpeg?auto=compress&cs=tinysrgb&w=800", + "buttons": [ + { + "id": "gym1", + "title": "Gold's Gym", + "action": { + "type": "openUrl", + "data": "https://goldsgym.in/" + } + }, + { + "id": "gym2", + "title": "23 Fitness", + "action": { + "type": "openUrl", + "data": "https://www.23fitnessguam.com/" + } + } + ] + } + } + ] + } + ] +} diff --git a/app/src/main/java/com/iterable/androidsdk/MainActivity.java b/app/src/main/java/com/iterable/androidsdk/MainActivity.java deleted file mode 100644 index c5f0725b8..000000000 --- a/app/src/main/java/com/iterable/androidsdk/MainActivity.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.iterable.androidsdk; - -import android.os.Bundle; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.snackbar.Snackbar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import android.view.View; -import android.view.Menu; -import android.view.MenuItem; - -import com.iterable.iterableapi.testapp.R; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - } - }); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - - return super.onOptionsItemSelected(item); - } -} diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedActivity.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedActivity.kt new file mode 100644 index 000000000..41c35395e --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedActivity.kt @@ -0,0 +1,25 @@ +package com.iterable.androidsdk.embeddedMessaging + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.Navigation +import androidx.navigation.ui.setupActionBarWithNavController +import androidx.navigation.ui.setupWithNavController +import com.iterable.iterableapi.testapp.R + +import kotlinx.android.synthetic.main.activity_main.bottomNavigationView + +class EmbeddedActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_embedded) + setupNavigation() + } + + private fun setupNavigation() { + val navController = Navigation.findNavController(this, R.id.embeddedNavigationFragment) + setupActionBarWithNavController(navController) + bottomNavigationView.setupWithNavController(navController) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageAllViewFragment.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageAllViewFragment.kt new file mode 100644 index 000000000..3eab7a0e1 --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageAllViewFragment.kt @@ -0,0 +1,80 @@ +package com.iterable.androidsdk.embeddedMessaging + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction +import com.iterable.iterableapi.IterableApi +import com.iterable.iterableapi.IterableEmbeddedMessage +import com.iterable.iterableapi.testapp.R +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedView +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedViewConfig +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedViewType + +class EmbeddedMessageAllViewFragment : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val view: View = inflater.inflate(R.layout.fragment_message_all_view, container, false) + + val messages = IterableApi.getInstance().embeddedManager.getMessages(1) + val message: IterableEmbeddedMessage? = messages?.get(0) + var messageFragment: Fragment + var ft: FragmentTransaction = childFragmentManager.beginTransaction() + + if (message != null) { + messageFragment = + IterableEmbeddedView(IterableEmbeddedViewType.BANNER, message, null) + ft.replace(R.id.embedded_message_banner, messageFragment) + ft.commit() + } + + if (message != null) { + val cardConfig = IterableEmbeddedViewConfig( + resources.getColor(R.color.mustard), + resources.getColor(R.color.red), + 1, + 100f, + resources.getColor(R.color.colorAccent), + resources.getColor(R.color.not_black), + resources.getColor(R.color.green), + resources.getColor(R.color.colorPrimaryDark), + resources.getColor(R.color.title_color), + resources.getColor(R.color.body_color), + ) + messageFragment = + IterableEmbeddedView(IterableEmbeddedViewType.CARD, message, cardConfig) + ft = childFragmentManager.beginTransaction() + ft.replace(R.id.embedded_message_card, messageFragment) + ft.commit() + } + + if (message != null) { + val notificationConfig = IterableEmbeddedViewConfig( + resources.getColor(R.color.lavender), + resources.getColor(R.color.salmon), + 1, + 5f, + resources.getColor(R.color.mustard), + resources.getColor(R.color.not_black), + resources.getColor(R.color.purple), + resources.getColor(R.color.colorAccent), + resources.getColor(R.color.colorPrimaryDark), + resources.getColor(R.color.green), + ) + messageFragment = IterableEmbeddedView( + IterableEmbeddedViewType.NOTIFICATION, + message, + notificationConfig + ) + ft = childFragmentManager.beginTransaction() + ft.replace(R.id.embedded_message_notification, messageFragment) + ft.commit() + } + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageCarouselFragment.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageCarouselFragment.kt new file mode 100644 index 000000000..0f3ef41e7 --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageCarouselFragment.kt @@ -0,0 +1,27 @@ +package com.iterable.androidsdk.embeddedMessaging + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction +import com.iterable.androidsdk.embeddedMessaging.embedded.CarouselViewFragment +import com.iterable.iterableapi.testapp.R + +class EmbeddedMessageCarouselFragment: Fragment() { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val view: View = inflater.inflate(R.layout.fragment_carousel, container, false) + + val flexViewFragment: Fragment = CarouselViewFragment() + + val ft: FragmentTransaction = childFragmentManager.beginTransaction() + ft.replace(R.id.embedded_message_carousel, flexViewFragment) + ft.commit() + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageFragment.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageFragment.kt new file mode 100644 index 000000000..768a9d5e5 --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageFragment.kt @@ -0,0 +1,34 @@ +package com.iterable.androidsdk.embeddedMessaging + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction +import com.iterable.iterableapi.IterableApi +import com.iterable.iterableapi.IterableEmbeddedMessage +import com.iterable.iterableapi.testapp.R +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedView +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedViewType + +class EmbeddedMessageFragment: Fragment() { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val view: View = inflater.inflate(R.layout.fragment_message, container, false) + + val messages = IterableApi.getInstance().embeddedManager.getMessages(2) + val message: IterableEmbeddedMessage? = messages?.get(0) + + if (message != null) { + val messageFragment: Fragment = IterableEmbeddedView(IterableEmbeddedViewType.BANNER, message, null) + val ft: FragmentTransaction = childFragmentManager.beginTransaction() + ft.replace(R.id.embedded_message, messageFragment) + ft.commit() + } + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageSettingsFragment.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageSettingsFragment.kt new file mode 100644 index 000000000..4038f013c --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/EmbeddedMessageSettingsFragment.kt @@ -0,0 +1,17 @@ +package com.iterable.androidsdk.embeddedMessaging + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.iterable.iterableapi.testapp.R + +class EmbeddedMessageSettingsFragment: Fragment() { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + return inflater.inflate(R.layout.fragment_settings, container, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/embedded/CarouselAdapter.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/embedded/CarouselAdapter.kt new file mode 100644 index 000000000..b654ccb79 --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/embedded/CarouselAdapter.kt @@ -0,0 +1,28 @@ +package com.iterable.androidsdk.embeddedMessaging.embedded + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter +import com.iterable.iterableapi.IterableEmbeddedMessage +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedView +import com.iterable.iterableapi.ui.embedded.IterableEmbeddedViewType + +class CarouselAdapter(fm:FragmentManager, private val messages: List) : FragmentPagerAdapter(fm) { + + override fun getCount(): Int { + return messages.size + } + + override fun getItem(position: Int): Fragment { + return IterableEmbeddedView( + IterableEmbeddedViewType.CARD, + messages[position], + null + ) + } + + override fun getPageTitle(position: Int): CharSequence? { + return super.getPageTitle(position) + } + +} diff --git a/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/embedded/CarouselViewFragment.kt b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/embedded/CarouselViewFragment.kt new file mode 100644 index 000000000..068857290 --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/embeddedMessaging/embedded/CarouselViewFragment.kt @@ -0,0 +1,46 @@ +package com.iterable.androidsdk.embeddedMessaging.embedded + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager +import com.iterable.iterableapi.IterableApi +import com.iterable.iterableapi.IterableEmbeddedManager +import com.iterable.iterableapi.testapp.R + +class CarouselViewFragment : Fragment() { + + private lateinit var embeddedManager: IterableEmbeddedManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + embeddedManager = IterableApi.getInstance().embeddedManager + } + + override fun onResume() { + super.onResume() + IterableApi.getInstance().embeddedManager.syncMessages() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater.inflate(R.layout.embedded_view_fragment, container, false) + val placeholder: ViewGroup = rootView.findViewById(R.id.placeholder) + placeholder.removeAllViews() + val carouselView = inflater.inflate(R.layout.carousel_view, container, false) + val viewPager = carouselView.findViewById(R.id.viewPager) + + val messages = embeddedManager.getMessages(1) + if (messages != null) { + viewPager.adapter = CarouselAdapter(parentFragmentManager, messages) + } + + placeholder.addView(carouselView) + return rootView + } +} \ No newline at end of file diff --git a/sample-apps/inbox-customization/app/src/main/java/com/iterable/inbox_customization/MainActivity.kt b/app/src/main/java/com/iterable/androidsdk/inboxCustomization/MainActivity.kt similarity index 94% rename from sample-apps/inbox-customization/app/src/main/java/com/iterable/inbox_customization/MainActivity.kt rename to app/src/main/java/com/iterable/androidsdk/inboxCustomization/MainActivity.kt index 8df082fa6..50ca61a6c 100644 --- a/sample-apps/inbox-customization/app/src/main/java/com/iterable/inbox_customization/MainActivity.kt +++ b/app/src/main/java/com/iterable/androidsdk/inboxCustomization/MainActivity.kt @@ -1,12 +1,13 @@ -package com.iterable.inbox_customization +package com.iterable.androidsdk.inboxCustomization -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import androidx.navigation.Navigation import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import com.iterable.iterableapi.IterableApi import com.iterable.iterableapi.IterableInAppManager +import com.iterable.iterableapi.testapp.R import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity(), IterableInAppManager.Listener { diff --git a/app/src/main/java/com/iterable/androidsdk/inboxCustomization/MainFragment.kt b/app/src/main/java/com/iterable/androidsdk/inboxCustomization/MainFragment.kt new file mode 100644 index 000000000..0ee2e85b0 --- /dev/null +++ b/app/src/main/java/com/iterable/androidsdk/inboxCustomization/MainFragment.kt @@ -0,0 +1,47 @@ +package com.iterable.androidsdk.inboxCustomization + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.fragment.app.Fragment +import com.iterable.androidsdk.embeddedMessaging.EmbeddedActivity +import com.iterable.androidsdk.inboxCustomization.customizations.* +import com.iterable.androidsdk.inboxCustomization.tabs.onSimpleInboxClicked +import com.iterable.iterableapi.testapp.R + +class MainFragment : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.fragment_main, container, false) + + view.findViewById