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