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