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 90 protected void onCreate(Bundle savedInstanceState) { 91 super.onCreate(savedInstanceState); 92 bindUi(); 93 } 94 95 96 @Override 97 public boolean onCreateOptionsMenu(Menu menu) { 98 getMenuInflater().inflate(R.menu.actions, menu); 99 return true; 100 } 101 102 @Override 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 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 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 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 172 public void onBackPressed() { 173 requestPermissions(); 174 } 175 176 @Override 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 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 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 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 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 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