Home | History | Annotate | Download | only in emergency
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.emergency;
     17 
     18 import android.app.Activity;
     19 import android.app.Fragment;
     20 import android.app.FragmentManager;
     21 import android.content.res.Configuration;
     22 import android.support.annotation.LayoutRes;
     23 import android.support.design.widget.TabLayout;
     24 import android.support.design.widget.TabLayout.TabLayoutOnPageChangeListener;
     25 import android.support.design.widget.TabLayout.ViewPagerOnTabSelectedListener;
     26 import android.support.v13.app.FragmentStatePagerAdapter;
     27 import android.support.v4.view.ViewPager;
     28 import android.util.Pair;
     29 import android.view.MenuItem;
     30 import android.widget.Toolbar;
     31 
     32 import com.android.internal.annotations.VisibleForTesting;
     33 
     34 import java.util.ArrayList;
     35 /**
     36  * An activity uses a tab layout to separate personal and medical information
     37  * from emergency contacts.
     38  */
     39 public abstract class EmergencyTabActivity extends Activity {
     40     private ViewPagerAdapter mTabsAdapter;
     41     private TabLayout mTabLayout;
     42 
     43     private ArrayList<Pair<String, Fragment>> mFragments;
     44 
     45     @Override
     46     protected void onResume() {
     47         super.onResume();
     48         int display_mode = getResources().getConfiguration().orientation;
     49 
     50         if (display_mode == Configuration.ORIENTATION_PORTRAIT) {
     51             mTabLayout.setTabMode(TabLayout.MODE_FIXED);
     52             mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
     53         }
     54     }
     55 
     56     @Override
     57     public boolean onOptionsItemSelected(MenuItem item) {
     58         switch (item.getItemId()) {
     59             // Respond to the action bar's Up/Home button.
     60             case android.R.id.home:
     61                 onBackPressed();
     62                 return true;
     63         }
     64         return super.onOptionsItemSelected(item);
     65     }
     66 
     67     /** Returns the index of the currently selected tab. */
     68     @VisibleForTesting
     69     public int getSelectedTabPosition() {
     70         return mTabLayout.getSelectedTabPosition();
     71     }
     72 
     73     @Override
     74     public void setContentView(@LayoutRes int layoutResID) {
     75         super.setContentView(layoutResID);
     76         setupTabs();
     77         Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar);
     78         setActionBar(toolbar);
     79         getActionBar().setDisplayHomeAsUpEnabled(true);
     80     }
     81 
     82     /** Selects the tab at index {@code selectedTabIndex}. */
     83     public void selectTab(int selectedTabIndex) {
     84         if (mTabLayout != null && selectedTabIndex >= 0 &&
     85                 selectedTabIndex < mTabLayout.getTabCount()) {
     86             mTabLayout.getTabAt(selectedTabIndex).select();
     87         }
     88     }
     89 
     90     protected void setupTabs() {
     91         mFragments = setUpFragments();
     92         mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
     93         if (mTabsAdapter == null) {
     94             // The viewpager that will host the section contents.
     95             ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
     96             mTabsAdapter = new ViewPagerAdapter(getFragmentManager());
     97             viewPager.setAdapter(mTabsAdapter);
     98             mTabLayout.setTabsFromPagerAdapter(mTabsAdapter);
     99 
    100             // Set a listener via setOnTabSelectedListener(OnTabSelectedListener) to be notified
    101             // when any tab's selection state has been changed.
    102             mTabLayout.setOnTabSelectedListener(
    103                     new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
    104 
    105             // Use a TabLayout.TabLayoutOnPageChangeListener to forward the scroll and selection
    106             // changes to this layout
    107             viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(mTabLayout));
    108         } else {
    109             mTabsAdapter.notifyDataSetChanged();
    110             mTabLayout.setTabsFromPagerAdapter(mTabsAdapter);
    111         }
    112     }
    113 
    114     public TabLayout getTabLayout() {
    115         return mTabLayout;
    116     }
    117 
    118     /** Return the fragments. */
    119     public ArrayList<Pair<String, Fragment>> getFragments() {
    120         return mFragments;
    121     }
    122 
    123     /** Return number of fragments to show in the tabs. */
    124     public int getNumberFragments() {
    125         return mFragments.size();
    126     }
    127 
    128     /** Returns the fragments to show in the tabs. */
    129     protected abstract ArrayList<Pair<String, Fragment>> setUpFragments();
    130 
    131     /** The adapter used to handle the two fragments. */
    132     private class ViewPagerAdapter extends FragmentStatePagerAdapter {
    133         public ViewPagerAdapter(FragmentManager fm) {
    134             super(fm);
    135         }
    136 
    137         @Override
    138         public Fragment getItem(int position) {
    139             return mFragments.get(position).second;
    140         }
    141 
    142         @Override
    143         public int getCount() {
    144             return mFragments.size();
    145         }
    146 
    147         @Override
    148         public CharSequence getPageTitle(int position) {
    149             return mFragments.get(position).first;
    150         }
    151 
    152         @Override
    153         public int getItemPosition(Object object) {
    154             // The default implementation assumes that items will never change position and always
    155             // returns POSITION_UNCHANGED. This is how you can specify that the positions can change
    156             return FragmentStatePagerAdapter.POSITION_NONE;
    157         }
    158     }
    159 }
    160