• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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 
17 package foo.bar.permission;
18 
19 import android.Manifest;
20 import android.app.Activity;
21 import android.app.LoaderManager;
22 import android.bluetooth.BluetoothDevice;
23 import android.companion.AssociationRequest;
24 import android.companion.BluetoothDeviceFilter;
25 import android.companion.BluetoothLEDeviceFilter;
26 import android.companion.CompanionDeviceManager;
27 import android.content.CursorLoader;
28 import android.content.Intent;
29 import android.content.IntentSender;
30 import android.content.Loader;
31 import android.content.pm.PackageManager;
32 import android.database.Cursor;
33 import android.os.Bundle;
34 import android.provider.CalendarContract;
35 import android.provider.ContactsContract;
36 import android.view.Menu;
37 import android.view.MenuItem;
38 import android.view.View;
39 import android.widget.CursorAdapter;
40 import android.widget.ListView;
41 import android.widget.SimpleCursorAdapter;
42 import android.widget.Toast;
43 
44 import java.util.ArrayList;
45 import java.util.List;
46 
47 /**
48  * Simple sample of how to use the runtime permissions APIs.
49  */
50 public class PermissionActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
51 
52     public static final String LOG_TAG = "PermissionActivity";
53 
54     private static final int CHOOSE_DEVICE_REQUEST = 1;
55 
56     private static final int CONTACTS_LOADER = 1;
57 
58     private static final int EVENTS_LOADER = 2;
59 
60     private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 1;
61 
62     private static final int PERMISSIONS_REQUEST_READ_CALENDAR = 2;
63 
64     private static final int PERMISSIONS_REQUEST_ALL_PERMISSIONS = 3;
65 
66     private final static String[] CONTACTS_COLUMNS = {
67             ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
68     };
69 
70     private final static String[] CALENDAR_COLUMNS = {
71             CalendarContract.Events.TITLE
72     };
73 
74     private static final String[] CONTACTS_PROJECTION = {
75             ContactsContract.Contacts._ID,
76             ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
77     };
78 
79     private static final String[] EVENTS_PROJECTION = {
80             CalendarContract.Events._ID,
81             CalendarContract.Events.TITLE
82     };
83 
84     private final static int[] TO_IDS = {
85             android.R.id.text1
86     };
87 
88     private ListView mListView;
89 
90     private CursorAdapter mContactsAdapter;
91     private CursorAdapter mEventsAdapter;
92 
93     @Override
onCreate(Bundle savedInstanceState)94     protected void onCreate(Bundle savedInstanceState) {
95         super.onCreate(savedInstanceState);
96         bindUi();
97     }
98 
99 
100     @Override
onCreateOptionsMenu(Menu menu)101     public boolean onCreateOptionsMenu(Menu menu) {
102         getMenuInflater().inflate(R.menu.actions, menu);
103         return true;
104     }
105 
106     @Override
onOptionsItemSelected(MenuItem item)107     public boolean onOptionsItemSelected(MenuItem item) {
108         switch (item.getItemId()) {
109             case R.id.show_contacts: {
110                 showContacts();
111                 return true;
112             }
113 
114             case R.id.show_events: {
115                 showEvents();
116                 return true;
117             }
118 
119             case R.id.request_all_perms: {
120                 requestPermissions();
121                 return true;
122             }
123         }
124 
125         return false;
126     }
127 
128     @Override
onCreateLoader(int loaderId, Bundle args)129     public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
130         switch (loaderId) {
131             case CONTACTS_LOADER: {
132                 return new CursorLoader(this,
133                         ContactsContract.Contacts.CONTENT_URI,
134                         CONTACTS_PROJECTION, null, null, null);
135             }
136 
137             case EVENTS_LOADER: {
138                 return new CursorLoader(this,
139                         CalendarContract.Events.CONTENT_URI,
140                         EVENTS_PROJECTION, null, null, null);
141             }
142 
143             default: {
144                 return null;
145             }
146         }
147     }
148 
149     @Override
onLoadFinished(Loader<Cursor> loader, Cursor cursor)150     public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
151         switch (loader.getId()) {
152             case CONTACTS_LOADER: {
153                 mContactsAdapter.swapCursor(cursor);
154             } break;
155 
156             case EVENTS_LOADER: {
157                 mEventsAdapter.swapCursor(cursor);
158             } break;
159         }
160     }
161 
162     @Override
onLoaderReset(Loader<Cursor> loader)163     public void onLoaderReset(Loader<Cursor> loader) {
164         switch (loader.getId()) {
165             case CONTACTS_LOADER: {
166                 mContactsAdapter.swapCursor(null);
167             } break;
168 
169             case EVENTS_LOADER: {
170                 mEventsAdapter.swapCursor(null);
171             } break;
172         }
173     }
174 
175     @Override
onBackPressed()176     public void onBackPressed() {
177         requestPermissions();
178     }
179 
180     @Override
onActivityResult(int requestCode, int resultCode, Intent data)181     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
182         if (requestCode == CHOOSE_DEVICE_REQUEST) {
183             BluetoothDevice device = data.getParcelableExtra(CompanionDeviceManager.EXTRA_DEVICE);
184         }
185     }
186 
187     @Override
onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)188     public void onRequestPermissionsResult(int requestCode, String permissions[],
189             int[] grantResults) {
190         switch (requestCode) {
191             case PERMISSIONS_REQUEST_READ_CONTACTS: {
192                 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
193                     showContacts();
194                 }
195             } break;
196 
197             case PERMISSIONS_REQUEST_READ_CALENDAR: {
198                 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
199                     showEvents();
200                 }
201             } break;
202 
203             case PERMISSIONS_REQUEST_ALL_PERMISSIONS: {
204                 for (int i = 0; i < permissions.length; i++) {
205                     if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
206                         switch (permissions[i]) {
207                             case Manifest.permission.READ_CALENDAR: {
208                                 Toast.makeText(this, "Granted Calendar!",
209                                         Toast.LENGTH_SHORT).show();
210                             } break;
211 
212                             case Manifest.permission.READ_CONTACTS: {
213                                 showContacts();
214                             } break;
215                         }
216                     }
217                 }
218             } break;
219         }
220     }
221 
bindUi()222     private void bindUi() {
223         setContentView(R.layout.permission_activity);
224 
225         mListView = (ListView) findViewById(R.id.list);
226         View emptyView = findViewById(R.id.empty_state);
227         mListView.setEmptyView(emptyView);
228 
229         mContactsAdapter = new SimpleCursorAdapter(this,
230                 android.R.layout.simple_list_item_1,
231                 null, CONTACTS_COLUMNS, TO_IDS, 0);
232 
233         mEventsAdapter = new SimpleCursorAdapter(this,
234                 android.R.layout.simple_list_item_1,
235                 null, CALENDAR_COLUMNS, TO_IDS, 0);
236     }
237 
showContacts()238     private void showContacts() {
239         getPackageManager().isInstantApp();
240 
241 
242 //        if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
243 //                != PackageManager.PERMISSION_GRANTED) {
244 //            requestPermissions(new String[] {Manifest.permission.READ_CONTACTS},
245 //                    PERMISSIONS_REQUEST_READ_CONTACTS);
246 //            return;
247 //        }
248 //
249 //        if (getLoaderManager().getLoader(CONTACTS_LOADER) == null) {
250 //            getLoaderManager().initLoader(CONTACTS_LOADER, null, this);
251 //        }
252 //        mListView.setAdapter(mContactsAdapter);
253     }
254 
showEvents()255     private void showEvents() {
256         if (checkSelfPermission(Manifest.permission.READ_CALENDAR)
257                 != PackageManager.PERMISSION_GRANTED) {
258             requestPermissions(new String[]{Manifest.permission.READ_CALENDAR},
259                     PERMISSIONS_REQUEST_READ_CALENDAR);
260             return;
261         }
262 
263         if (getLoaderManager().getLoader(EVENTS_LOADER) == null) {
264             getLoaderManager().initLoader(EVENTS_LOADER, null, this);
265         }
266         mListView.setAdapter(mEventsAdapter);
267     }
268 
requestPermissions()269     private void requestPermissions() {
270         List<String> permissions = new ArrayList<>();
271         if (checkSelfPermission(Manifest.permission.READ_CALENDAR)
272                 != PackageManager.PERMISSION_GRANTED) {
273             permissions.add(Manifest.permission.READ_CALENDAR);
274         }
275         if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
276                 != PackageManager.PERMISSION_GRANTED) {
277             permissions.add(Manifest.permission.READ_CONTACTS);
278         }
279         if (!permissions.isEmpty()) {
280             requestPermissions(permissions.toArray(new String[0]),
281                     PERMISSIONS_REQUEST_ALL_PERMISSIONS);
282         }
283     }
284 }
285