1e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov/* 2e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * Copyright (C) 2015 The Android Open Source Project 3e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * 4e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 5e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * you may not use this file except in compliance with the License. 6e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * You may obtain a copy of the License at 7e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * 8e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * http://www.apache.org/licenses/LICENSE-2.0 9e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * 10e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * Unless required by applicable law or agreed to in writing, software 11e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * distributed under the License is distributed on an "AS IS" BASIS, 12e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * See the License for the specific language governing permissions and 14e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * limitations under the License. 15e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov */ 16e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 17e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovpackage foo.bar.permission2; 18e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 19e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.Manifest; 20e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.app.Activity; 21e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.app.LoaderManager; 22e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.content.CursorLoader; 23e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.content.Loader; 24e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.content.pm.PackageManager; 25e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.database.Cursor; 26e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.os.Bundle; 27e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.provider.CalendarContract; 28e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.provider.ContactsContract; 2952a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslavimport android.support.v4.app.ActivityCompat; 3052a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslavimport android.support.v4.content.ContextCompat; 31826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslavimport android.view.Menu; 32826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslavimport android.view.MenuItem; 33e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.view.View; 34e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.widget.CursorAdapter; 35e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.widget.ListView; 36e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganovimport android.widget.SimpleCursorAdapter; 3752a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslavimport android.widget.Toast; 38e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 39e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov/** 40e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov * Simple sample of how to use the runtime permissions APIs. 41e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov */ 4252a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslavpublic class PermissionActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor>, 4352a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav ActivityCompat.OnRequestPermissionsResultCallback { 44e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 45e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov public static final String LOG_TAG = "PermissionActivity"; 46e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 47e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final int CONTACTS_LOADER = 1; 48e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 49e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final int EVENTS_LOADER = 2; 50e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 51e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 1; 52e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 53e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final int PERMISSIONS_REQUEST_READ_CALENDAR = 2; 54e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 55e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final int PERMISSIONS_REQUEST_ALL_PERMISSIONS = 3; 56e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 57e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private final static String[] CONTACTS_COLUMNS = { 58e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov ContactsContract.Contacts.DISPLAY_NAME_PRIMARY 59e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov }; 60e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 61e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private final static String[] CALENDAR_COLUMNS = { 62e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov CalendarContract.Events.TITLE 63e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov }; 64e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 65e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final String[] CONTACTS_PROJECTION = { 66e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov ContactsContract.Contacts._ID, 67e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov ContactsContract.Contacts.DISPLAY_NAME_PRIMARY 68e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov }; 69e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 70e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private static final String[] EVENTS_PROJECTION = { 71e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov CalendarContract.Events._ID, 72e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov CalendarContract.Events.TITLE 73e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov }; 74e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 75e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private final static int[] TO_IDS = { 76e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov android.R.id.text1 77e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov }; 78e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 79e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private ListView mListView; 80e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 81e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private CursorAdapter mContactsAdapter; 82e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private CursorAdapter mEventsAdapter; 83e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 84e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov @Override 85e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov protected void onCreate(Bundle savedInstanceState) { 86e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov super.onCreate(savedInstanceState); 87e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov bindUi(); 88e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 89e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 90826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav 91826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav @Override 92826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav public boolean onCreateOptionsMenu(Menu menu) { 93826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav getMenuInflater().inflate(R.menu.actions, menu); 94826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return true; 95826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav } 96826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav 97e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov @Override 98826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav public boolean onOptionsItemSelected(MenuItem item) { 99826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav switch (item.getItemId()) { 100826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav case R.id.show_contacts: { 101826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav showContacts(); 102826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return true; 103826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav } 104826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav 105826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav case R.id.show_events: { 106826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav showEvents(); 107826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return true; 108826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav } 109826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav 110826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav case R.id.request_all_perms: { 111826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav requestPermissions(); 112826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return true; 113826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav } 114e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 115826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav 116826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return false; 117e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 118e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 119e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov @Override 120e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) { 121e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov switch (loaderId) { 122e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case CONTACTS_LOADER: { 123826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return new CursorLoader(this, 124e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov ContactsContract.Contacts.CONTENT_URI, 125e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov CONTACTS_PROJECTION, null, null, null); 126e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 127e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 128e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case EVENTS_LOADER: { 129826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav return new CursorLoader(this, 130e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov CalendarContract.Events.CONTENT_URI, 131e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov EVENTS_PROJECTION, null, null, null); 132e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 133e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 134e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov default: { 135e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov return null; 136e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 137e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 138e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 139e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 140e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov @Override 141e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 142e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov switch (loader.getId()) { 143e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case CONTACTS_LOADER: { 144e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mContactsAdapter.swapCursor(cursor); 145e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } break; 146e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 147e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case EVENTS_LOADER: { 148e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mEventsAdapter.swapCursor(cursor); 149e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } break; 150e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 151e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 152e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 153e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov @Override 154e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov public void onLoaderReset(Loader<Cursor> loader) { 155e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov switch (loader.getId()) { 156e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case CONTACTS_LOADER: { 157e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mContactsAdapter.swapCursor(null); 158e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } break; 159e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 160e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case EVENTS_LOADER: { 161e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mEventsAdapter.swapCursor(null); 162e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } break; 163e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 164e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 165e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 166e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov @Override 167e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov public void onRequestPermissionsResult(int requestCode, String permissions[], 168e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov int[] grantResults) { 169e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov switch (requestCode) { 170e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case PERMISSIONS_REQUEST_READ_CONTACTS: { 171e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 172e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov showContacts(); 173e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 174e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } break; 175e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 176e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov case PERMISSIONS_REQUEST_READ_CALENDAR: { 177e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 178e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov showEvents(); 179e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 180e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } break; 181e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 182e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 183e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 184e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private void bindUi() { 185e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov setContentView(R.layout.permission_activity); 186e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 187e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mListView = (ListView) findViewById(R.id.list); 188826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav View emptyView = findViewById(R.id.empty_state); 189826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav mListView.setEmptyView(emptyView); 190e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 191e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mContactsAdapter = new SimpleCursorAdapter(this, 192e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov android.R.layout.simple_list_item_1, 193e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov null, CONTACTS_COLUMNS, TO_IDS, 0); 194e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 195e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mEventsAdapter = new SimpleCursorAdapter(this, 196e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov android.R.layout.simple_list_item_1, 197e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov null, CALENDAR_COLUMNS, TO_IDS, 0); 198e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 199e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 200e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private void showContacts() { 20152a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 202e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov != PackageManager.PERMISSION_GRANTED) { 20352a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav if (ActivityCompat.shouldShowRequestPermissionRationale(this, 20452a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav Manifest.permission.READ_CONTACTS)) { 20552a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav Toast.makeText(this, "I really need it, dude!", Toast.LENGTH_SHORT).show(); 20652a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav } 20752a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav ActivityCompat.requestPermissions(this, new String[]{ 20852a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav Manifest.permission.READ_CONTACTS}, 209e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov PERMISSIONS_REQUEST_READ_CONTACTS); 210e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov return; 211e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 212e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 213e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov if (getLoaderManager().getLoader(CONTACTS_LOADER) == null) { 214e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov getLoaderManager().initLoader(CONTACTS_LOADER, null, this); 215e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 216e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mListView.setAdapter(mContactsAdapter); 217e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 218e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 219e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private void showEvents() { 22052a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) 221e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov != PackageManager.PERMISSION_GRANTED) { 22252a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav if (ActivityCompat.shouldShowRequestPermissionRationale(this, 22352a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav Manifest.permission.READ_CALENDAR)) { 22452a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav Toast.makeText(this, "I really need it, dude!", Toast.LENGTH_SHORT).show(); 22552a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav } 22652a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav ActivityCompat.requestPermissions(this, new String[]{ 22752a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav Manifest.permission.READ_CALENDAR}, 228e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov PERMISSIONS_REQUEST_READ_CALENDAR); 229e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov return; 230e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 231e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 232e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov if (getLoaderManager().getLoader(EVENTS_LOADER) == null) { 233e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov getLoaderManager().initLoader(EVENTS_LOADER, null, this); 234e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 235e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov mListView.setAdapter(mEventsAdapter); 236e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 237e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov 238e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov private void requestPermissions() { 23952a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) 240e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov != PackageManager.PERMISSION_GRANTED 24152a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 242e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov != PackageManager.PERMISSION_GRANTED) { 243826aa7f01d059b6764002fa0fba236d7aeafee39Svetoslav String[] permissions = new String[]{ 244e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov Manifest.permission.READ_CONTACTS, 245e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov Manifest.permission.READ_CALENDAR 246e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov }; 24752a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav ActivityCompat.requestPermissions(this, permissions, 24852a06e5a4e493c1028a9620d92bfd1e03a6ee85aSvetoslav PERMISSIONS_REQUEST_ALL_PERMISSIONS); 249e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 250e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov } 251e4a7362e628701bc71289888f6241cc94c9a4fbcSvet Ganov} 252