/*
* Copyright (C) 2015 Can Elmas
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.canelmas.let.sample;
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.canelmas.let.AskPermission;
import com.canelmas.let.DeniedPermission;
import com.canelmas.let.Let;
import com.canelmas.let.RuntimePermissionListener;
import com.canelmas.let.RuntimePermissionRequest;
import java.util.List;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import static android.Manifest.permission.CALL_PHONE;
public class SampleActivity extends AppCompatActivity implements RuntimePermissionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
// Contacts
findViewById(R.id.btn_contacts).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showContacts();
}
});
// Location
findViewById(R.id.btn_location).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
accessLocationAndDoSomething();
}
});
// Native fragment
findViewById(R.id.btn_fragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SampleActivity.this, SampleFragmentActivity.class));
}
});
// v4 fragment
findViewById(R.id.btn_v4_fragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SampleActivity.this, SampleV4FragmentActivity.class));
}
});
}
@AskPermission(ACCESS_FINE_LOCATION)
private void accessLocationAndDoSomething() {
Toast.makeText(SampleActivity.this, "just accessed location and will make use of it!", Toast.LENGTH_SHORT).show();
}
@AskPermission({
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS
})
private void showContacts() {
startActivity(new Intent(this, ContactsActivity.class));
}
@AskPermission(CALL_PHONE)
private void call(){
final Intent intent = new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:00123124234234"));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Let.handle(this, requestCode, permissions, grantResults);
}
@Override
public void onShowPermissionRationale(List<String> permissions, final RuntimePermissionRequest request) {
// tell user why you need these permissions
final StringBuilder sb = new StringBuilder();
for (String permission : permissions) {
sb.append(getRationale(permission));
sb.append("\n");
}
new AlertDialog.Builder(this).setTitle("Permission Required!")
.setMessage(sb.toString())
.setCancelable(true)
.setNegativeButton("No Thanks", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton("Try Again", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.retry();
}
})
.show();
}
@Override
public void onPermissionDenied(List<DeniedPermission> results) {
/**
* Let's just do nothing if permission is denied without
* 'Never ask Again' checked.
*
* If it's the case show more informative message and prompt user
* to the app settings screen.
*/
final StringBuilder sb = new StringBuilder();
for (DeniedPermission result : results) {
if (result.isNeverAskAgainChecked()) {
sb.append("onNeverShowAgain for " + result.getPermission());
sb.append("\n");
}
}
if (sb.length() != 0) {
new AlertDialog.Builder(this).setTitle("Go Settings and Grant Permission")
.setMessage(sb.toString())
.setCancelable(true)
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 1);
dialog.dismiss();
}
}).show();
}
}
private String getRationale(String permission) {
if (permission.equals(Manifest.permission.READ_CONTACTS) || permission.equals(Manifest.permission.WRITE_CONTACTS)) {
return getString(R.string.rationale_contacts);
} else if (permission.equals(Manifest.permission.ACCESS_FINE_LOCATION)) {
return getString(R.string.rationale_location);
} else {
return getString(R.string.rationale_storage_general);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_sample, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}