1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.shareactionprovider;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import com.example.android.shareactionprovider.content.ContentItem;
20*90c8c64dSAndroid Build Coastguard Worker 
21*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent;
22*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
23*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.view.MenuItemCompat;
24*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.view.PagerAdapter;
25*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.view.ViewPager;
26*90c8c64dSAndroid Build Coastguard Worker import android.support.v7.app.AppCompatActivity;
27*90c8c64dSAndroid Build Coastguard Worker import android.support.v7.widget.ShareActionProvider;
28*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater;
29*90c8c64dSAndroid Build Coastguard Worker import android.view.Menu;
30*90c8c64dSAndroid Build Coastguard Worker import android.view.MenuItem;
31*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
32*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup;
33*90c8c64dSAndroid Build Coastguard Worker import android.widget.ImageView;
34*90c8c64dSAndroid Build Coastguard Worker import android.widget.TextView;
35*90c8c64dSAndroid Build Coastguard Worker 
36*90c8c64dSAndroid Build Coastguard Worker import java.util.ArrayList;
37*90c8c64dSAndroid Build Coastguard Worker 
38*90c8c64dSAndroid Build Coastguard Worker /**
39*90c8c64dSAndroid Build Coastguard Worker  * This sample shows you how a provide a {@link ShareActionProvider} with ActionBarCompat,
40*90c8c64dSAndroid Build Coastguard Worker  * backwards compatible to API v7.
41*90c8c64dSAndroid Build Coastguard Worker  * <p>
42*90c8c64dSAndroid Build Coastguard Worker  * The sample contains a {@link ViewPager} which displays content of differing types: image and
43*90c8c64dSAndroid Build Coastguard Worker  * text. When a new item is selected in the ViewPager, the ShareActionProvider is updated with
44*90c8c64dSAndroid Build Coastguard Worker  * a share intent specific to that content.
45*90c8c64dSAndroid Build Coastguard Worker  * <p>
46*90c8c64dSAndroid Build Coastguard Worker  */
47*90c8c64dSAndroid Build Coastguard Worker public class MainActivity extends AppCompatActivity {
48*90c8c64dSAndroid Build Coastguard Worker 
49*90c8c64dSAndroid Build Coastguard Worker     // The items to be displayed in the ViewPager
50*90c8c64dSAndroid Build Coastguard Worker     private final ArrayList<ContentItem> mItems = getSampleContent();
51*90c8c64dSAndroid Build Coastguard Worker 
52*90c8c64dSAndroid Build Coastguard Worker     // Keep reference to the ShareActionProvider from the menu
53*90c8c64dSAndroid Build Coastguard Worker     private ShareActionProvider mShareActionProvider;
54*90c8c64dSAndroid Build Coastguard Worker 
55*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate(Bundle savedInstanceState)56*90c8c64dSAndroid Build Coastguard Worker     protected void onCreate(Bundle savedInstanceState) {
57*90c8c64dSAndroid Build Coastguard Worker         super.onCreate(savedInstanceState);
58*90c8c64dSAndroid Build Coastguard Worker 
59*90c8c64dSAndroid Build Coastguard Worker         // Set content view (which contains a CheeseListFragment)
60*90c8c64dSAndroid Build Coastguard Worker         setContentView(R.layout.sample_main);
61*90c8c64dSAndroid Build Coastguard Worker 
62*90c8c64dSAndroid Build Coastguard Worker         // Retrieve the ViewPager from the content view
63*90c8c64dSAndroid Build Coastguard Worker         ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
64*90c8c64dSAndroid Build Coastguard Worker 
65*90c8c64dSAndroid Build Coastguard Worker         // Set an OnPageChangeListener so we are notified when a new item is selected
66*90c8c64dSAndroid Build Coastguard Worker         vp.addOnPageChangeListener(mOnPageChangeListener);
67*90c8c64dSAndroid Build Coastguard Worker 
68*90c8c64dSAndroid Build Coastguard Worker         // Finally set the adapter so the ViewPager can display items
69*90c8c64dSAndroid Build Coastguard Worker         vp.setAdapter(mPagerAdapter);
70*90c8c64dSAndroid Build Coastguard Worker     }
71*90c8c64dSAndroid Build Coastguard Worker 
72*90c8c64dSAndroid Build Coastguard Worker     // BEGIN_INCLUDE(get_sap)
73*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateOptionsMenu(Menu menu)74*90c8c64dSAndroid Build Coastguard Worker     public boolean onCreateOptionsMenu(Menu menu) {
75*90c8c64dSAndroid Build Coastguard Worker         // Inflate the menu resource
76*90c8c64dSAndroid Build Coastguard Worker         getMenuInflater().inflate(R.menu.main_menu, menu);
77*90c8c64dSAndroid Build Coastguard Worker 
78*90c8c64dSAndroid Build Coastguard Worker         // Retrieve the share menu item
79*90c8c64dSAndroid Build Coastguard Worker         MenuItem shareItem = menu.findItem(R.id.menu_share);
80*90c8c64dSAndroid Build Coastguard Worker 
81*90c8c64dSAndroid Build Coastguard Worker         // Now get the ShareActionProvider from the item
82*90c8c64dSAndroid Build Coastguard Worker         mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
83*90c8c64dSAndroid Build Coastguard Worker 
84*90c8c64dSAndroid Build Coastguard Worker         // Get the ViewPager's current item position and set its ShareIntent.
85*90c8c64dSAndroid Build Coastguard Worker         int currentViewPagerItem = ((ViewPager) findViewById(R.id.viewpager)).getCurrentItem();
86*90c8c64dSAndroid Build Coastguard Worker         setShareIntent(currentViewPagerItem);
87*90c8c64dSAndroid Build Coastguard Worker 
88*90c8c64dSAndroid Build Coastguard Worker         return super.onCreateOptionsMenu(menu);
89*90c8c64dSAndroid Build Coastguard Worker     }
90*90c8c64dSAndroid Build Coastguard Worker     // END_INCLUDE(get_sap)
91*90c8c64dSAndroid Build Coastguard Worker 
92*90c8c64dSAndroid Build Coastguard Worker     /**
93*90c8c64dSAndroid Build Coastguard Worker      * A PagerAdapter which instantiates views based on the ContentItem's content type.
94*90c8c64dSAndroid Build Coastguard Worker      */
95*90c8c64dSAndroid Build Coastguard Worker     private final PagerAdapter mPagerAdapter = new PagerAdapter() {
96*90c8c64dSAndroid Build Coastguard Worker         LayoutInflater mInflater;
97*90c8c64dSAndroid Build Coastguard Worker 
98*90c8c64dSAndroid Build Coastguard Worker         @Override
99*90c8c64dSAndroid Build Coastguard Worker         public int getCount() {
100*90c8c64dSAndroid Build Coastguard Worker             return mItems.size();
101*90c8c64dSAndroid Build Coastguard Worker         }
102*90c8c64dSAndroid Build Coastguard Worker 
103*90c8c64dSAndroid Build Coastguard Worker         @Override
104*90c8c64dSAndroid Build Coastguard Worker         public boolean isViewFromObject(View view, Object o) {
105*90c8c64dSAndroid Build Coastguard Worker             return view == o;
106*90c8c64dSAndroid Build Coastguard Worker         }
107*90c8c64dSAndroid Build Coastguard Worker 
108*90c8c64dSAndroid Build Coastguard Worker         @Override
109*90c8c64dSAndroid Build Coastguard Worker         public void destroyItem(ViewGroup container, int position, Object object) {
110*90c8c64dSAndroid Build Coastguard Worker             // Just remove the view from the ViewPager
111*90c8c64dSAndroid Build Coastguard Worker             container.removeView((View) object);
112*90c8c64dSAndroid Build Coastguard Worker         }
113*90c8c64dSAndroid Build Coastguard Worker 
114*90c8c64dSAndroid Build Coastguard Worker         @Override
115*90c8c64dSAndroid Build Coastguard Worker         public Object instantiateItem(ViewGroup container, int position) {
116*90c8c64dSAndroid Build Coastguard Worker             // Ensure that the LayoutInflater is instantiated
117*90c8c64dSAndroid Build Coastguard Worker             if (mInflater == null) {
118*90c8c64dSAndroid Build Coastguard Worker                 mInflater = LayoutInflater.from(MainActivity.this);
119*90c8c64dSAndroid Build Coastguard Worker             }
120*90c8c64dSAndroid Build Coastguard Worker 
121*90c8c64dSAndroid Build Coastguard Worker             // Get the item for the requested position
122*90c8c64dSAndroid Build Coastguard Worker             final ContentItem item = mItems.get(position);
123*90c8c64dSAndroid Build Coastguard Worker 
124*90c8c64dSAndroid Build Coastguard Worker             // The view we need to inflate changes based on the type of content
125*90c8c64dSAndroid Build Coastguard Worker             switch (item.contentType) {
126*90c8c64dSAndroid Build Coastguard Worker                 case ContentItem.CONTENT_TYPE_TEXT: {
127*90c8c64dSAndroid Build Coastguard Worker                     // Inflate item layout for text
128*90c8c64dSAndroid Build Coastguard Worker                     TextView tv = (TextView) mInflater
129*90c8c64dSAndroid Build Coastguard Worker                             .inflate(R.layout.item_text, container, false);
130*90c8c64dSAndroid Build Coastguard Worker 
131*90c8c64dSAndroid Build Coastguard Worker                     // Set text content using it's resource id
132*90c8c64dSAndroid Build Coastguard Worker                     tv.setText(item.contentResourceId);
133*90c8c64dSAndroid Build Coastguard Worker 
134*90c8c64dSAndroid Build Coastguard Worker                     // Add the view to the ViewPager
135*90c8c64dSAndroid Build Coastguard Worker                     container.addView(tv);
136*90c8c64dSAndroid Build Coastguard Worker                     return tv;
137*90c8c64dSAndroid Build Coastguard Worker                 }
138*90c8c64dSAndroid Build Coastguard Worker                 case ContentItem.CONTENT_TYPE_IMAGE: {
139*90c8c64dSAndroid Build Coastguard Worker                     // Inflate item layout for images
140*90c8c64dSAndroid Build Coastguard Worker                     ImageView iv = (ImageView) mInflater
141*90c8c64dSAndroid Build Coastguard Worker                             .inflate(R.layout.item_image, container, false);
142*90c8c64dSAndroid Build Coastguard Worker 
143*90c8c64dSAndroid Build Coastguard Worker                     // Load the image from it's content URI
144*90c8c64dSAndroid Build Coastguard Worker                     iv.setImageURI(item.getContentUri());
145*90c8c64dSAndroid Build Coastguard Worker 
146*90c8c64dSAndroid Build Coastguard Worker                     // Add the view to the ViewPager
147*90c8c64dSAndroid Build Coastguard Worker                     container.addView(iv);
148*90c8c64dSAndroid Build Coastguard Worker                     return iv;
149*90c8c64dSAndroid Build Coastguard Worker                 }
150*90c8c64dSAndroid Build Coastguard Worker             }
151*90c8c64dSAndroid Build Coastguard Worker 
152*90c8c64dSAndroid Build Coastguard Worker             return null;
153*90c8c64dSAndroid Build Coastguard Worker         }
154*90c8c64dSAndroid Build Coastguard Worker     };
155*90c8c64dSAndroid Build Coastguard Worker 
setShareIntent(int position)156*90c8c64dSAndroid Build Coastguard Worker     private void setShareIntent(int position) {
157*90c8c64dSAndroid Build Coastguard Worker         // BEGIN_INCLUDE(update_sap)
158*90c8c64dSAndroid Build Coastguard Worker         if (mShareActionProvider != null) {
159*90c8c64dSAndroid Build Coastguard Worker             // Get the currently selected item, and retrieve it's share intent
160*90c8c64dSAndroid Build Coastguard Worker             ContentItem item = mItems.get(position);
161*90c8c64dSAndroid Build Coastguard Worker             Intent shareIntent = item.getShareIntent(MainActivity.this);
162*90c8c64dSAndroid Build Coastguard Worker 
163*90c8c64dSAndroid Build Coastguard Worker             // Now update the ShareActionProvider with the new share intent
164*90c8c64dSAndroid Build Coastguard Worker             mShareActionProvider.setShareIntent(shareIntent);
165*90c8c64dSAndroid Build Coastguard Worker         }
166*90c8c64dSAndroid Build Coastguard Worker         // END_INCLUDE(update_sap)
167*90c8c64dSAndroid Build Coastguard Worker     }
168*90c8c64dSAndroid Build Coastguard Worker 
169*90c8c64dSAndroid Build Coastguard Worker     /**
170*90c8c64dSAndroid Build Coastguard Worker      * A OnPageChangeListener used to update the ShareActionProvider's share intent when a new item
171*90c8c64dSAndroid Build Coastguard Worker      * is selected in the ViewPager.
172*90c8c64dSAndroid Build Coastguard Worker      */
173*90c8c64dSAndroid Build Coastguard Worker     private final ViewPager.OnPageChangeListener mOnPageChangeListener
174*90c8c64dSAndroid Build Coastguard Worker             = new ViewPager.OnPageChangeListener() {
175*90c8c64dSAndroid Build Coastguard Worker 
176*90c8c64dSAndroid Build Coastguard Worker         @Override
177*90c8c64dSAndroid Build Coastguard Worker         public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
178*90c8c64dSAndroid Build Coastguard Worker             // NO-OP
179*90c8c64dSAndroid Build Coastguard Worker         }
180*90c8c64dSAndroid Build Coastguard Worker 
181*90c8c64dSAndroid Build Coastguard Worker         @Override
182*90c8c64dSAndroid Build Coastguard Worker         public void onPageSelected(int position) {
183*90c8c64dSAndroid Build Coastguard Worker             setShareIntent(position);
184*90c8c64dSAndroid Build Coastguard Worker         }
185*90c8c64dSAndroid Build Coastguard Worker 
186*90c8c64dSAndroid Build Coastguard Worker         @Override
187*90c8c64dSAndroid Build Coastguard Worker         public void onPageScrollStateChanged(int state) {
188*90c8c64dSAndroid Build Coastguard Worker             // NO-OP
189*90c8c64dSAndroid Build Coastguard Worker         }
190*90c8c64dSAndroid Build Coastguard Worker     };
191*90c8c64dSAndroid Build Coastguard Worker 
192*90c8c64dSAndroid Build Coastguard Worker     /**
193*90c8c64dSAndroid Build Coastguard Worker      * @return An ArrayList of ContentItem's to be displayed in this sample
194*90c8c64dSAndroid Build Coastguard Worker      */
getSampleContent()195*90c8c64dSAndroid Build Coastguard Worker     static ArrayList<ContentItem> getSampleContent() {
196*90c8c64dSAndroid Build Coastguard Worker         ArrayList<ContentItem> items = new ArrayList<ContentItem>();
197*90c8c64dSAndroid Build Coastguard Worker 
198*90c8c64dSAndroid Build Coastguard Worker         items.add(new ContentItem(ContentItem.CONTENT_TYPE_IMAGE, "photo_1.jpg"));
199*90c8c64dSAndroid Build Coastguard Worker         items.add(new ContentItem(ContentItem.CONTENT_TYPE_TEXT, R.string.quote_1));
200*90c8c64dSAndroid Build Coastguard Worker         items.add(new ContentItem(ContentItem.CONTENT_TYPE_TEXT, R.string.quote_2));
201*90c8c64dSAndroid Build Coastguard Worker         items.add(new ContentItem(ContentItem.CONTENT_TYPE_IMAGE, "photo_2.jpg"));
202*90c8c64dSAndroid Build Coastguard Worker         items.add(new ContentItem(ContentItem.CONTENT_TYPE_TEXT, R.string.quote_3));
203*90c8c64dSAndroid Build Coastguard Worker         items.add(new ContentItem(ContentItem.CONTENT_TYPE_IMAGE, "photo_3.jpg"));
204*90c8c64dSAndroid Build Coastguard Worker 
205*90c8c64dSAndroid Build Coastguard Worker         return items;
206*90c8c64dSAndroid Build Coastguard Worker     }
207*90c8c64dSAndroid Build Coastguard Worker 
208*90c8c64dSAndroid Build Coastguard Worker }