Merged PR 214768: Demo: Switched from using DemoActivity + DemoFragments to have an activity per demo

- `DemoActivity` is now abstract and got new `contentId` and `contentNeedsScrollableContainer` properties. Sets its own title and loads its content from demo layout file.
- Demo requires `DemoActivity` as a demo class
- Converted demo fragments to demo activities (subclassing from `DemoActivity`)
- Renamed demo files: *Fragment.kt to *Activity.kt
- Renamed demo files: fragment_*.xml to activity_*.xml
- Some clean up and refactoring

Related work items: #659039
This commit is contained in:
Vlad Filyakov 2018-12-21 23:16:56 +00:00
Родитель d7a30b7acd
Коммит 425d996906
30 изменённых файлов: 295 добавлений и 405 удалений

Просмотреть файл

@ -9,24 +9,27 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name="com.microsoft.officeuifabricdemo.DemoListActivity"
android:label="@string/app_title"
android:theme="@style/AppTheme.NoActionBar">
android:label="@string/app_title">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.microsoft.officeuifabricdemo.DemoActivity"
android:label="@string/title_demo_detail"
android:parentActivityName="com.microsoft.officeuifabricdemo.DemoListActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.microsoft.officeuifabricdemo.DemoListActivity" />
</activity>
<!-- Demo activities -->
<activity android:name="com.microsoft.officeuifabricdemo.demos.AvatarViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.CalendarViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.DateTimePickerDialogActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.PeoplePickerViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.PersonaChipViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.PersonaListViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.PersonaViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.TemplateViewActivity" />
<activity android:name="com.microsoft.officeuifabricdemo.demos.TypographyActivity" />
</application>
</manifest>

Просмотреть файл

@ -1,74 +1,53 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.annotation.LayoutRes
import android.support.v7.app.AppCompatActivity
import android.view.MenuItem
import com.jakewharton.threetenabp.AndroidThreeTen
import com.microsoft.officeuifabric.datetimepicker.OnDateTimePickedListener
import com.microsoft.officeuifabricdemo.demos.DateTimePickerDialogFragment
import kotlinx.android.synthetic.main.activity_demo_detail.*
import org.threeten.bp.ZonedDateTime
import java.util.*
class DemoActivity : AppCompatActivity(), OnDateTimePickedListener {
abstract class DemoActivity : AppCompatActivity() {
companion object {
const val DEMO_ID = "demo_id"
}
protected abstract val contentLayoutId: Int
@LayoutRes get
protected open val contentNeedsScrollableContainer: Boolean
get() = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidThreeTen.init(this)
setContentView(R.layout.activity_demo_detail)
setSupportActionBar(detail_toolbar)
setContentView(R.layout.activity_demo_detail)
setSupportActionBar(detail_toolbar)
// Show the Up button in the action bar.
supportActionBar?.setDisplayHomeAsUpEnabled(true)
// savedInstanceState is non-null when there is fragment state
// saved from previous configurations of this activity
// (e.g. when rotating the screen from portrait to landscape).
// In this case, the fragment will automatically be re-added
// to its container so we don't need to manually add it.
// For more information, see the Fragments API guide at:
//
// http://developer.android.com/guide/components/fragments.html
//
if (savedInstanceState == null) {
// Create the detail fragment and add it to the activity using a fragment transaction.
val demoID = intent.getSerializableExtra(DemoFragment.DEMO_ID) as UUID
val demo = DEMOS.find { it.id == demoID }
if (demo == null)
return
// Set demo title
val demoID = intent.getSerializableExtra(DemoActivity.DEMO_ID) as UUID
val demo = DEMOS.find { it.id == demoID }
title = demo?.title
val fragment = Fragment.instantiate(this, demo.demoClass.java.name).apply {
arguments = Bundle().apply {
putSerializable(DemoFragment.DEMO_ID, demoID)
}
// Load content and place it in the requested container
val container = if (contentNeedsScrollableContainer) demo_detail_scrollable_container else demo_detail_container
layoutInflater.inflate(contentLayoutId, container, true)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
navigateUpTo(Intent(this, DemoListActivity::class.java))
return true
}
val isDemoScrollable = (fragment as? DemoFragment)?.needsScrollableContainer() ?: true
supportFragmentManager.beginTransaction()
.add(if (isDemoScrollable) R.id.demo_detail_scrollable_container else R.id.demo_detail_container, fragment, demo.title)
.commit()
else -> return super.onOptionsItemSelected(item)
}
}
override fun onOptionsItemSelected(item: MenuItem) =
when (item.itemId) {
android.R.id.home -> {
// This ID represents the Home or Up button. In the case of this
// activity, the Up button is shown. For
// more details, see the Navigation pattern on Android Design:
//
// http://developer.android.com/design/patterns/navigation.html#up-vs-back
navigateUpTo(Intent(this, DemoListActivity::class.java))
true
}
else -> super.onOptionsItemSelected(item)
}
override fun onDateTimePicked(dateTime: ZonedDateTime) {
val dateTimePickerDialogFragment = supportFragmentManager.findFragmentByTag(DATE_TIME_PICKER_DIALOG) as? DateTimePickerDialogFragment
dateTimePickerDialogFragment?.setDateTime(dateTime)
}
}

Просмотреть файл

@ -1,27 +0,0 @@
package com.microsoft.officeuifabricdemo
import android.os.Bundle
import android.support.v4.app.Fragment
import kotlinx.android.synthetic.main.activity_demo_detail.*
import java.util.*
open class DemoFragment : Fragment() {
companion object {
const val DEMO_ID = "demo_id"
}
private var demo: Demo? = null
open fun needsScrollableContainer(): Boolean = true
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
arguments?.let {
if (it.containsKey(DEMO_ID)) {
val demoID = it.getSerializable(DEMO_ID) as UUID
demo = DEMOS.find { it.id == demoID }
activity?.title = demo?.title
}
}
}
}

Просмотреть файл

@ -1,62 +1,48 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo
import android.content.Intent
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.jakewharton.threetenabp.AndroidThreeTen
import kotlinx.android.synthetic.main.activity_demo_list.*
import kotlinx.android.synthetic.main.demo_list.*
import kotlinx.android.synthetic.main.demo_list_content.view.*
/**
* An activity representing a list of Demos. This activity
* has different presentations for handset and tablet-size devices. On
* handsets, the activity presents a list of items, which when touched,
* lead to a [DemoActivity] representing
* item details. On tablets, the activity presents the list of items and
* item details side-by-side using two vertical panes.
* This activity presents a list of [Demo]s, which when touched,
* lead to a subclass of [DemoActivity] representing demo details.
*/
class DemoListActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidThreeTen.init(this)
setContentView(R.layout.activity_demo_list)
setSupportActionBar(toolbar)
toolbar.title = title
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
setupRecyclerView(demo_list)
demo_list.adapter = DemoListAdapter()
Initializer.init(application)
}
private fun setupRecyclerView(recyclerView: RecyclerView) {
recyclerView.adapter = DemoRecyclerViewAdapter(this)
}
// DemoRecyclerViewAdapter
private class DemoRecyclerViewAdapter(val parentActivity: DemoListActivity) :
RecyclerView.Adapter<DemoRecyclerViewAdapter.ViewHolder>() {
private val onClickListener: View.OnClickListener
init {
onClickListener = View.OnClickListener { v ->
val demo = v.tag as Demo
val intent = Intent(v.context, DemoActivity::class.java)
intent.putExtra(DemoFragment.DEMO_ID, demo.id)
v.context.startActivity(intent)
}
private class DemoListAdapter : RecyclerView.Adapter<DemoListAdapter.ViewHolder>() {
private val onClickListener = View.OnClickListener { view ->
val demo = view.tag as Demo
val intent = Intent(view.context, demo.demoClass.java)
intent.putExtra(DemoActivity.DEMO_ID, demo.id)
view.context.startActivity(intent)
}
override fun getItemCount() = DEMOS.size
@ -76,9 +62,7 @@ class DemoListActivity : AppCompatActivity() {
}
}
// ViewHolder
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView = view.id_text
}
}

Просмотреть файл

@ -1,32 +1,35 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo
import android.support.v4.app.Fragment
import com.microsoft.officeuifabricdemo.demos.*
import java.util.*
import kotlin.reflect.KClass
const val AVATAR = "Avatar"
const val AVATAR_VIEW = "AvatarView"
const val CALENDAR_VIEW = "CalendarView"
const val DATE_TIME_PICKER_DIALOG = "DateTimePickerDialog"
const val PEOPLE_PICKER = "PeoplePicker"
const val PERSONA = "Persona"
const val PERSONA_CHIP = "PersonaChip"
const val PEOPLE_PICKER_VIEW = "PeoplePickerView"
const val PERSONA_CHIP_VIEW = "PersonaChipView"
const val PERSONA_LIST_VIEW = "PersonaListView"
const val PERSONA_VIEW = "PersonaView"
const val TEMPLATE_VIEW = "TemplateView"
const val TYPOGRAPHY = "Typography"
val DEMOS = arrayListOf(
Demo(AVATAR, AvatarFragment::class),
Demo(CALENDAR_VIEW, CalendarViewFragment::class),
Demo(DATE_TIME_PICKER_DIALOG, DateTimePickerDialogFragment::class),
Demo(PEOPLE_PICKER, PeoplePickerFragment::class),
Demo(PERSONA, PersonaFragment::class),
Demo(PERSONA_CHIP, PersonaChipFragment::class),
Demo(PERSONA_LIST_VIEW, PersonaListViewFragment::class),
Demo(TEMPLATE_VIEW, TemplateViewFragment::class),
Demo(TYPOGRAPHY, TypographyFragment::class)
Demo(AVATAR_VIEW, AvatarViewActivity::class),
Demo(CALENDAR_VIEW, CalendarViewActivity::class),
Demo(DATE_TIME_PICKER_DIALOG, DateTimePickerDialogActivity::class),
Demo(PEOPLE_PICKER_VIEW, PeoplePickerViewActivity::class),
Demo(PERSONA_CHIP_VIEW, PersonaChipViewActivity::class),
Demo(PERSONA_LIST_VIEW, PersonaListViewActivity::class),
Demo(PERSONA_VIEW, PersonaViewActivity::class),
Demo(TEMPLATE_VIEW, TemplateViewActivity::class),
Demo(TYPOGRAPHY, TypographyActivity::class)
)
data class Demo(val title: String, val demoClass: KClass<out Fragment>) {
data class Demo(val title: String, val demoClass: KClass<out DemoActivity>) {
val id: UUID = UUID.randomUUID()
}
}

Просмотреть файл

@ -5,26 +5,23 @@
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import com.bumptech.glide.Glide
import com.microsoft.officeuifabric.persona.AvatarSize
import com.microsoft.officeuifabric.persona.AvatarView
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.fragment_avatar.*
import kotlinx.android.synthetic.main.activity_avatar_view.*
class AvatarFragment : DemoFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_avatar, container, false)
}
class AvatarViewActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_avatar_view
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Avatar drawables with bitmap
loadBitmapFromPicasso(avatar_example_picasso)
@ -52,8 +49,7 @@ class AvatarFragment : DemoFragment() {
}
private fun createNewAvatarFromCode() {
val context = context ?: return
val avatarView = AvatarView(context)
val avatarView = AvatarView(this)
avatarView.avatarSize = AvatarSize.XXLARGE
avatarView.name = getString(R.string.persona_name_mauricio_august)
avatarView.email = getString(R.string.persona_email_mauricio_august)
@ -61,4 +57,4 @@ class AvatarFragment : DemoFragment() {
avatarView.id = R.id.avatar_example_code
avatar_layout.addView(avatarView)
}
}
}

Просмотреть файл

@ -0,0 +1,27 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import com.microsoft.officeuifabric.calendar.OnDateSelectedListener
import com.microsoft.officeuifabric.util.DateStringUtils
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.activity_calendar_view.*
import org.threeten.bp.ZonedDateTime
class CalendarViewActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_calendar_view
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendar_view.onDateSelectedListener = object : OnDateSelectedListener {
override fun onDateSelected(date: ZonedDateTime) {
example_date_title.text = DateStringUtils.formatDateWithWeekDay(this@CalendarViewActivity, date)
}
}
}
}

Просмотреть файл

@ -1,29 +0,0 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.microsoft.officeuifabric.calendar.OnDateSelectedListener
import com.microsoft.officeuifabric.util.DateStringUtils
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.fragment_calendar.view.*
import org.threeten.bp.ZonedDateTime
class CalendarViewFragment : DemoFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_calendar, container, false)
val context = context ?: return view
view.calendar_view.onDateSelectedListener = object : OnDateSelectedListener {
override fun onDateSelected(date: ZonedDateTime) {
view.example_date_title.text = DateStringUtils.formatDateWithWeekDay(context, date)
}
}
return view
}
}

Просмотреть файл

@ -5,19 +5,17 @@
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.microsoft.officeuifabric.datetimepicker.DateTimePickerDialog
import com.microsoft.officeuifabric.datetimepicker.DatePickMode
import com.microsoft.officeuifabric.datetimepicker.DateTimePickerDialog
import com.microsoft.officeuifabric.datetimepicker.OnDateTimePickedListener
import com.microsoft.officeuifabric.util.DateStringUtils
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.fragment_date_time_picker_dialog.*
import kotlinx.android.synthetic.main.activity_date_time_picker_dialog.*
import org.threeten.bp.Duration
import org.threeten.bp.ZonedDateTime
class DateTimePickerDialogFragment : DemoFragment() {
class DateTimePickerDialogActivity : DemoActivity(), OnDateTimePickedListener {
companion object {
private const val TAG_DATE_TIME_PICKER = "dateTimePicker"
private const val TAG_DATE_PICKER = "datePicker"
@ -25,20 +23,14 @@ class DateTimePickerDialogFragment : DemoFragment() {
private const val DIALOG_TAG = "dialogTag"
}
override val contentLayoutId: Int
get() = R.layout.activity_date_time_picker_dialog
private var selectedDateTime: ZonedDateTime? = null
private var dialogTag: String? = null
fun setDateTime(dateTime: ZonedDateTime) {
selectedDateTime = dateTime
updateText()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_date_time_picker_dialog, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
savedInstanceState?.let {
selectedDateTime = it.getSerializable(SELECTED_DATE_TIME) as? ZonedDateTime
@ -53,7 +45,7 @@ class DateTimePickerDialogFragment : DemoFragment() {
DateTimePickerDialog.Mode.DATE,
DatePickMode.SINGLE
)
dialog.show(fragmentManager, dialogTag)
dialog.show(supportFragmentManager, dialogTag)
}
date_time_picker_date_selected_button.setOnClickListener {
@ -64,7 +56,7 @@ class DateTimePickerDialogFragment : DemoFragment() {
DateTimePickerDialog.Mode.DATE_TIME,
DatePickMode.SINGLE
)
dialog.show(fragmentManager, dialogTag)
dialog.show(supportFragmentManager, dialogTag)
}
date_time_picker_time_selected_button.setOnClickListener {
@ -75,7 +67,7 @@ class DateTimePickerDialogFragment : DemoFragment() {
DateTimePickerDialog.Mode.TIME_DATE,
DatePickMode.SINGLE
)
dialog.show(fragmentManager, dialogTag)
dialog.show(supportFragmentManager, dialogTag)
}
updateText()
@ -87,15 +79,19 @@ class DateTimePickerDialogFragment : DemoFragment() {
outState.putString(DIALOG_TAG, dialogTag)
}
override fun onDateTimePicked(dateTime: ZonedDateTime) {
selectedDateTime = dateTime
updateText()
}
private fun getLastDateTime() = selectedDateTime ?: ZonedDateTime.now()
private fun updateText() {
val context = context ?: return
val selectDateTime = selectedDateTime ?: return
val dialogTag = dialogTag ?: return
if (dialogTag == TAG_DATE_PICKER)
date_text_view.text = DateStringUtils.formatDateWithWeekDay(context, selectDateTime)
date_text_view.text = DateStringUtils.formatDateWithWeekDay(this, selectDateTime)
else
date_text_view.text = DateStringUtils.formatFullDateTime(context, selectDateTime)
date_text_view.text = DateStringUtils.formatFullDateTime(this, selectDateTime)
}
}

Просмотреть файл

@ -1,33 +1,33 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.app.AlertDialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.microsoft.officeuifabric.peoplepicker.PeoplePickerPersonaChipClickStyle
import com.microsoft.officeuifabric.peoplepicker.PeoplePickerView
import com.microsoft.officeuifabric.persona.IPersona
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import com.microsoft.officeuifabricdemo.util.createPersonaList
import kotlinx.android.synthetic.main.fragment_people_picker.*
import kotlinx.android.synthetic.main.activity_people_picker_view.*
import java.util.*
import kotlin.collections.ArrayList
class PeoplePickerFragment : DemoFragment() {
class PeoplePickerViewActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_people_picker_view
private lateinit var samplePersonas: ArrayList<IPersona>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
samplePersonas = createPersonaList(context)
return inflater.inflate(R.layout.fragment_people_picker, container, false)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val context = context ?: return
samplePersonas = createPersonaList(this)
// Use attributes to set personaChipClickStyle and label
@ -74,8 +74,7 @@ class PeoplePickerFragment : DemoFragment() {
personaSuggestionsListener: PeoplePickerView.PersonaSuggestionsListener? = null,
pickedPersonasChangeListener: PeoplePickerView.PickedPersonasChangeListener? = null
) {
val context = context ?: return
val peoplePickerView = PeoplePickerView(context)
val peoplePickerView = PeoplePickerView(this)
peoplePickerView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
with(peoplePickerView) {
label = labelText
@ -100,7 +99,7 @@ class PeoplePickerFragment : DemoFragment() {
}
private fun showPickedPersonaDialog(title: String, persona: IPersona) {
val dialog = AlertDialog.Builder(context)
val dialog = AlertDialog.Builder(this)
dialog.setTitle(title)
dialog.setMessage(if (!persona.name.isEmpty()) persona.name else persona.email)
dialog.show()

Просмотреть файл

@ -1,69 +0,0 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.content.Context
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.content.ContextCompat
import android.support.v4.widget.TextViewCompat
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.microsoft.officeuifabric.persona.PersonaChipView
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.fragment_persona_chip.*
class PersonaChipFragment : DemoFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_persona_chip, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val context = context ?: return
createDisabledPersonaChip(context)
persona_chip_example_basic.listener = setOnClickExample(view)
persona_chip_example_no_icon.listener = setOnClickExample(view)
persona_chip_example_error.listener = setOnClickExample(view)
persona_chip_example_error.hasError = true
}
private fun createDisabledPersonaChip(context: Context) {
val textView = TextView(context)
textView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
textView.text = getString(R.string.persona_chip_example_disabled)
TextViewCompat.setTextAppearance(textView, R.style.TextAppearance_UIFabric_Body2)
textView.setTextColor(ContextCompat.getColor(context, R.color.uifabric_black))
persona_chip_layout.addView(textView)
val personaChipView = PersonaChipView(context)
personaChipView.isEnabled = false
personaChipView.name = resources.getString(R.string.persona_name_kat_larsson)
personaChipView.email = resources.getString(R.string.persona_email_kat_larsson)
personaChipView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
persona_chip_layout.addView(personaChipView)
}
private fun setOnClickExample(view: View): PersonaChipView.Listener {
return object : PersonaChipView.Listener {
override fun onSelected(selected: Boolean) {
// no op
}
override fun onClicked() {
val snackbar = Snackbar.make(
view,
getString(R.string.persona_chip_example_click),
Snackbar.LENGTH_SHORT
)
snackbar.show()
}
}
}
}

Просмотреть файл

@ -0,0 +1,56 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.content.ContextCompat
import android.support.v4.widget.TextViewCompat
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.microsoft.officeuifabric.persona.PersonaChipView
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.activity_demo_detail.*
import kotlinx.android.synthetic.main.activity_persona_chip_view.*
class PersonaChipViewActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_persona_chip_view
private val personaChipViewListener = object : PersonaChipView.Listener {
override fun onSelected(selected: Boolean) { }
override fun onClicked() {
Snackbar.make(root_view, getString(R.string.persona_chip_example_click), Snackbar.LENGTH_SHORT).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
createDisabledPersonaChip()
persona_chip_example_basic.listener = personaChipViewListener
persona_chip_example_no_icon.listener = personaChipViewListener
persona_chip_example_error.listener = personaChipViewListener
persona_chip_example_error.hasError = true
}
private fun createDisabledPersonaChip() {
val textView = TextView(this)
textView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
textView.text = getString(R.string.persona_chip_example_disabled)
TextViewCompat.setTextAppearance(textView, R.style.TextAppearance_UIFabric_Body2)
textView.setTextColor(ContextCompat.getColor(this, R.color.uifabric_black))
persona_chip_layout.addView(textView)
val personaChipView = PersonaChipView(this)
personaChipView.isEnabled = false
personaChipView.name = resources.getString(R.string.persona_name_kat_larsson)
personaChipView.email = resources.getString(R.string.persona_email_kat_larsson)
personaChipView.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
persona_chip_layout.addView(personaChipView)
}
}

Просмотреть файл

@ -0,0 +1,36 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.support.design.widget.Snackbar
import com.microsoft.officeuifabric.persona.IPersona
import com.microsoft.officeuifabric.persona.PersonaListAdapter
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import com.microsoft.officeuifabricdemo.util.createPersonaList
import kotlinx.android.synthetic.main.activity_demo_detail.*
import kotlinx.android.synthetic.main.activity_persona_list_view.*
class PersonaListViewActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_persona_list_view
override val contentNeedsScrollableContainer: Boolean
get() = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
persona_list_view_example.personas = createPersonaList(this)
persona_list_view_example.onItemClicked = object : PersonaListAdapter.Callback {
override fun onItemClicked(persona: IPersona) {
Snackbar.make(
root_view,
"You clicked on the cell for ${persona.name}, ${persona.subtitle}",
Snackbar.LENGTH_SHORT
).show()
}
}
}
}

Просмотреть файл

@ -1,40 +0,0 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.microsoft.officeuifabric.persona.IPersona
import com.microsoft.officeuifabric.persona.PersonaListAdapter
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.R
import com.microsoft.officeuifabricdemo.util.createPersonaList
import kotlinx.android.synthetic.main.fragment_persona_list_view.*
class PersonaListViewFragment : DemoFragment() {
override fun needsScrollableContainer(): Boolean = false
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_persona_list_view, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
persona_list_view_example.personas = createPersonaList(context)
persona_list_view_example.onItemClicked = object : PersonaListAdapter.Callback {
override fun onItemClicked(persona: IPersona) {
val snackbar = Snackbar.make(
view,
"You clicked on the cell for ${persona.name}, ${persona.subtitle}",
Snackbar.LENGTH_SHORT
)
snackbar.show()
}
}
}
}

Просмотреть файл

@ -5,31 +5,27 @@
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.microsoft.officeuifabric.persona.AvatarSize
import com.microsoft.officeuifabric.persona.PersonaView
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.fragment_persona.*
import kotlinx.android.synthetic.main.activity_persona_view.*
class PersonaFragment: DemoFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_persona, container, false)
}
class PersonaViewActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_persona_view
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Add Persona programmatically
createNewPersonaFromCode()
}
private fun createNewPersonaFromCode() {
val context = context ?: return
val personaView = PersonaView(context)
val personaView = PersonaView(this)
personaView.avatarSize = AvatarSize.SMALL
personaView.name = resources.getString(R.string.persona_name_mauricio_august)
personaView.email = resources.getString(R.string.persona_email_mauricio_august)

Просмотреть файл

@ -1,6 +1,6 @@
//
// Copyright © 2018 Microsoft Corporation. All rights reserved.
//
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
@ -12,58 +12,55 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import com.microsoft.officeuifabricdemo.demos.views.Cell
import com.microsoft.officeuifabricdemo.demos.views.CellOrientation
import kotlinx.android.synthetic.main.fragment_templateview.*
import kotlinx.android.synthetic.main.activity_template_view.*
import kotlinx.android.synthetic.main.template_cell_vertical.view.*
class TemplateViewFragment : DemoFragment() {
class TemplateViewActivity : DemoActivity() {
companion object {
const val LIST_ITEM_COUNT = 1000
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_templateview, container, false)
}
override val contentLayoutId: Int
get() = R.layout.activity_template_view
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
horizontal_cell.setOnClickListener { onCellClicked(it as Cell) }
vertical_cell.setOnClickListener { onCellClicked(it as Cell) }
template_list_view.adapter = TemplateListViewAdapter()
template_list_view.layoutManager = LinearLayoutManager(context)
template_list_view.layoutManager = LinearLayoutManager(this)
template_list_view.setHasFixedSize(true)
regular_list_view.adapter = RegularListViewAdapter()
regular_list_view.layoutManager = LinearLayoutManager(context)
regular_list_view.layoutManager = LinearLayoutManager(this)
regular_list_view.setHasFixedSize(true)
calculate_cells_button.setOnClickListener {
val context = context ?: return@setOnClickListener
val t = measureAndLayoutViews(createView = {
val cell = Cell(context)
val cell = Cell(this)
cell.orientation = CellOrientation.VERTICAL
return@measureAndLayoutViews cell
})
println("Cell.M&L: $t")
calculate_cells_button.text = context.getString(R.string.calculate_cells) + " = $t ms"
calculate_cells_button.text = getString(R.string.calculate_cells) + " = $t ms"
}
calculate_layouts_button.setOnClickListener {
val context = context ?: return@setOnClickListener
val t = measureAndLayoutViews(createView = {
// Emulation of Cell code without extra ViewGroup (Cell itself)
val cell = LayoutInflater.from(context).inflate(R.layout.template_cell_vertical, null)
val cell = layoutInflater.inflate(R.layout.template_cell_vertical, null)
/*val titleView = */cell.findViewById(R.id.cell_title) as TextView
/*val descriptionView = */cell.findViewById(R.id.cell_description) as TextView
return@measureAndLayoutViews cell
})
println("Layout.M&L: $t")
calculate_layouts_button.text = context.getString(R.string.calculate_layouts) + " = $t ms"
calculate_layouts_button.text = getString(R.string.calculate_layouts) + " = $t ms"
}
}

Просмотреть файл

@ -0,0 +1,21 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.support.v4.widget.TextViewCompat
import com.microsoft.officeuifabricdemo.DemoActivity
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.activity_typography.*
class TypographyActivity : DemoActivity() {
override val contentLayoutId: Int
get() = R.layout.activity_typography
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
TextViewCompat.setTextAppearance(typography_example_body_2, R.style.TextAppearance_UIFabric_Body2)
}
}

Просмотреть файл

@ -1,25 +0,0 @@
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos
import android.os.Bundle
import android.support.v4.widget.TextViewCompat
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.microsoft.officeuifabricdemo.DemoFragment
import com.microsoft.officeuifabricdemo.R
import kotlinx.android.synthetic.main.fragment_typography.*
class TypographyFragment : DemoFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_typography, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
TextViewCompat.setTextAppearance(typography_example_body_2, R.style.TextAppearance_UIFabric_Body2)
}
}

Просмотреть файл

@ -1,6 +1,6 @@
//
// Copyright © 2018 Microsoft Corporation. All rights reserved.
//
/**
* Copyright © 2018 Microsoft Corporation. All rights reserved.
*/
package com.microsoft.officeuifabricdemo.demos.views

Просмотреть файл

@ -31,12 +31,4 @@
<include layout="@layout/demo_list" />
</FrameLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_info" />
</android.support.design.widget.CoordinatorLayout>

Просмотреть файл

@ -1,11 +1,6 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.UIFabric">
<!-- Customize your theme here. -->
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>