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