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