Home | History | Annotate | Download | only in permission
      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