1ea078ed952308c070012a96218a800939986cf90mariagpuyol/* 2ea078ed952308c070012a96218a800939986cf90mariagpuyol * Copyright (C) 2016 The Android Open Source Project 3ea078ed952308c070012a96218a800939986cf90mariagpuyol * 4ea078ed952308c070012a96218a800939986cf90mariagpuyol * Licensed under the Apache License, Version 2.0 (the "License"); 5ea078ed952308c070012a96218a800939986cf90mariagpuyol * you may not use this file except in compliance with the License. 6ea078ed952308c070012a96218a800939986cf90mariagpuyol * You may obtain a copy of the License at 7ea078ed952308c070012a96218a800939986cf90mariagpuyol * 8ea078ed952308c070012a96218a800939986cf90mariagpuyol * http://www.apache.org/licenses/LICENSE-2.0 9ea078ed952308c070012a96218a800939986cf90mariagpuyol * 10ea078ed952308c070012a96218a800939986cf90mariagpuyol * Unless required by applicable law or agreed to in writing, software 11ea078ed952308c070012a96218a800939986cf90mariagpuyol * distributed under the License is distributed on an "AS IS" BASIS, 12ea078ed952308c070012a96218a800939986cf90mariagpuyol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ea078ed952308c070012a96218a800939986cf90mariagpuyol * See the License for the specific language governing permissions and 14ea078ed952308c070012a96218a800939986cf90mariagpuyol * limitations under the License. 15ea078ed952308c070012a96218a800939986cf90mariagpuyol */ 16ea078ed952308c070012a96218a800939986cf90mariagpuyolpackage com.android.emergency; 17ea078ed952308c070012a96218a800939986cf90mariagpuyol 18910957804641cb28400bc069dc0148c2a2edba27mariagpuyolimport android.app.Activity; 19ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.app.Fragment; 20ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.app.FragmentManager; 21ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.content.res.Configuration; 22ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.support.annotation.LayoutRes; 23ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.support.design.widget.TabLayout; 24ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.support.design.widget.TabLayout.TabLayoutOnPageChangeListener; 25ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.support.design.widget.TabLayout.ViewPagerOnTabSelectedListener; 26ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.support.v13.app.FragmentStatePagerAdapter; 27ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.support.v4.view.ViewPager; 28c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyolimport android.util.Pair; 29ea078ed952308c070012a96218a800939986cf90mariagpuyolimport android.view.MenuItem; 30910957804641cb28400bc069dc0148c2a2edba27mariagpuyolimport android.widget.Toolbar; 31ea078ed952308c070012a96218a800939986cf90mariagpuyol 320ad3900521a6a93df8905d905dfb1a4c952a180cmariagpuyolimport com.android.internal.annotations.VisibleForTesting; 330ad3900521a6a93df8905d905dfb1a4c952a180cmariagpuyol 34c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyolimport java.util.ArrayList; 35ea078ed952308c070012a96218a800939986cf90mariagpuyol/** 369be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol * An activity uses a tab layout to separate personal and medical information 37ea078ed952308c070012a96218a800939986cf90mariagpuyol * from emergency contacts. 38ea078ed952308c070012a96218a800939986cf90mariagpuyol */ 39910957804641cb28400bc069dc0148c2a2edba27mariagpuyolpublic abstract class EmergencyTabActivity extends Activity { 40ea078ed952308c070012a96218a800939986cf90mariagpuyol private ViewPagerAdapter mTabsAdapter; 41ea078ed952308c070012a96218a800939986cf90mariagpuyol private TabLayout mTabLayout; 42ea078ed952308c070012a96218a800939986cf90mariagpuyol 43c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol private ArrayList<Pair<String, Fragment>> mFragments; 44ea078ed952308c070012a96218a800939986cf90mariagpuyol 45ea078ed952308c070012a96218a800939986cf90mariagpuyol @Override 469be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol protected void onResume() { 479be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol super.onResume(); 489be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol int display_mode = getResources().getConfiguration().orientation; 49ea078ed952308c070012a96218a800939986cf90mariagpuyol 509be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol if (display_mode == Configuration.ORIENTATION_PORTRAIT) { 519be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol mTabLayout.setTabMode(TabLayout.MODE_FIXED); 529be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 539be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol } 54ea078ed952308c070012a96218a800939986cf90mariagpuyol } 55ea078ed952308c070012a96218a800939986cf90mariagpuyol 56de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol @Override 57de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol public boolean onOptionsItemSelected(MenuItem item) { 58de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol switch (item.getItemId()) { 59de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol // Respond to the action bar's Up/Home button. 60de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol case android.R.id.home: 61de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol onBackPressed(); 62de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol return true; 63de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol } 64de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol return super.onOptionsItemSelected(item); 65de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol } 66de7a405217ad397057dfcc8c386330c73339b31dmariagpuyol 679be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol /** Returns the index of the currently selected tab. */ 680ad3900521a6a93df8905d905dfb1a4c952a180cmariagpuyol @VisibleForTesting 699be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol public int getSelectedTabPosition() { 709be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol return mTabLayout.getSelectedTabPosition(); 71ea078ed952308c070012a96218a800939986cf90mariagpuyol } 72ea078ed952308c070012a96218a800939986cf90mariagpuyol 73ea078ed952308c070012a96218a800939986cf90mariagpuyol @Override 74ea078ed952308c070012a96218a800939986cf90mariagpuyol public void setContentView(@LayoutRes int layoutResID) { 759be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol super.setContentView(layoutResID); 76232daafc102052b458a3d3847ff9290f73915395mariagpuyol setupTabs(); 779be32659526009cdd4e2cd7c15e89bae5e2ef619mariagpuyol Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar); 78910957804641cb28400bc069dc0148c2a2edba27mariagpuyol setActionBar(toolbar); 79910957804641cb28400bc069dc0148c2a2edba27mariagpuyol getActionBar().setDisplayHomeAsUpEnabled(true); 80ea078ed952308c070012a96218a800939986cf90mariagpuyol } 81ea078ed952308c070012a96218a800939986cf90mariagpuyol 827ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol /** Selects the tab at index {@code selectedTabIndex}. */ 837ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol public void selectTab(int selectedTabIndex) { 847ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol if (mTabLayout != null && selectedTabIndex >= 0 && 857ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol selectedTabIndex < mTabLayout.getTabCount()) { 867ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol mTabLayout.getTabAt(selectedTabIndex).select(); 877ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol } 887ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol } 897ee3df3c714b614ab28cef094a28543fb5e01465mariagpuyol 90c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol protected void setupTabs() { 91c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mFragments = setUpFragments(); 92c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs); 93c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol if (mTabsAdapter == null) { 94c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // The viewpager that will host the section contents. 95c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 96c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mTabsAdapter = new ViewPagerAdapter(getFragmentManager()); 97c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol viewPager.setAdapter(mTabsAdapter); 98c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mTabLayout.setTabsFromPagerAdapter(mTabsAdapter); 99c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 100c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // Set a listener via setOnTabSelectedListener(OnTabSelectedListener) to be notified 101c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // when any tab's selection state has been changed. 102c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mTabLayout.setOnTabSelectedListener( 103c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol new TabLayout.ViewPagerOnTabSelectedListener(viewPager)); 104c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 105c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // Use a TabLayout.TabLayoutOnPageChangeListener to forward the scroll and selection 106c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // changes to this layout 107c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(mTabLayout)); 108c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } else { 109c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mTabsAdapter.notifyDataSetChanged(); 110c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol mTabLayout.setTabsFromPagerAdapter(mTabsAdapter); 111c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } 112c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } 113c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 11450c09e01cc69adcea152f15f537077d14b4311d9mariagpuyol public TabLayout getTabLayout() { 115c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol return mTabLayout; 116c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } 117c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 11888757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol /** Return the fragments. */ 11988757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol public ArrayList<Pair<String, Fragment>> getFragments() { 12088757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol return mFragments; 12188757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol } 12288757784ed5a3f0b1cf386cd05f8a440ebd46e5bmariagpuyol 123c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol /** Return number of fragments to show in the tabs. */ 124c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol public int getNumberFragments() { 125c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol return mFragments.size(); 126c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } 127c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 1289d8f622e4d0ef0f28b5bf7cf64d35d3507a4ea29Naoki Amano /** Return the adapter. */ 1299d8f622e4d0ef0f28b5bf7cf64d35d3507a4ea29Naoki Amano protected ViewPagerAdapter getTabsAdapter() { 1309d8f622e4d0ef0f28b5bf7cf64d35d3507a4ea29Naoki Amano return mTabsAdapter; 1319d8f622e4d0ef0f28b5bf7cf64d35d3507a4ea29Naoki Amano } 1329d8f622e4d0ef0f28b5bf7cf64d35d3507a4ea29Naoki Amano 133c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol /** Returns the fragments to show in the tabs. */ 134c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol protected abstract ArrayList<Pair<String, Fragment>> setUpFragments(); 135c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 136ea078ed952308c070012a96218a800939986cf90mariagpuyol /** The adapter used to handle the two fragments. */ 1379d8f622e4d0ef0f28b5bf7cf64d35d3507a4ea29Naoki Amano protected class ViewPagerAdapter extends FragmentStatePagerAdapter { 138ea078ed952308c070012a96218a800939986cf90mariagpuyol public ViewPagerAdapter(FragmentManager fm) { 139ea078ed952308c070012a96218a800939986cf90mariagpuyol super(fm); 140ea078ed952308c070012a96218a800939986cf90mariagpuyol } 141ea078ed952308c070012a96218a800939986cf90mariagpuyol 142ea078ed952308c070012a96218a800939986cf90mariagpuyol @Override 143ea078ed952308c070012a96218a800939986cf90mariagpuyol public Fragment getItem(int position) { 144c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol return mFragments.get(position).second; 145ea078ed952308c070012a96218a800939986cf90mariagpuyol } 146ea078ed952308c070012a96218a800939986cf90mariagpuyol 147ea078ed952308c070012a96218a800939986cf90mariagpuyol @Override 148ea078ed952308c070012a96218a800939986cf90mariagpuyol public int getCount() { 149c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol return mFragments.size(); 150ea078ed952308c070012a96218a800939986cf90mariagpuyol } 151ea078ed952308c070012a96218a800939986cf90mariagpuyol 152ea078ed952308c070012a96218a800939986cf90mariagpuyol @Override 153ea078ed952308c070012a96218a800939986cf90mariagpuyol public CharSequence getPageTitle(int position) { 154c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol return mFragments.get(position).first; 155c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol } 156c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol 157c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol @Override 158c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol public int getItemPosition(Object object) { 159c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // The default implementation assumes that items will never change position and always 160c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol // returns POSITION_UNCHANGED. This is how you can specify that the positions can change 161c3f3a80735a541f91a09a2e50cf808349f92541bmariagpuyol return FragmentStatePagerAdapter.POSITION_NONE; 162ea078ed952308c070012a96218a800939986cf90mariagpuyol } 163ea078ed952308c070012a96218a800939986cf90mariagpuyol } 164ea078ed952308c070012a96218a800939986cf90mariagpuyol} 165