package com.ittianyu.mobileguard.activity.base;
import android.content.Intent;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.fastaccess.permission.base.PermissionHelper;
import com.fastaccess.permission.base.callback.OnPermissionCallback;
import com.ittianyu.mobileguard.R;
import com.ittianyu.mobileguard.constant.Constant;
import com.ittianyu.mobileguard.domain.ContactBean;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* BaseContactsActivity
* show a ListView which content is Name and phone
*/
public abstract class BaseContactsActivity extends BaseActivityUpEnable implements OnPermissionCallback {
// view
private ListView lvContacts;
// data
private List<ContactBean> contacts = new ArrayList<ContactBean>();
private AlertDialog dialog;
private ContactAdapter adapter = new ContactAdapter();
private PermissionHelper permissionHelper;
protected String[] permissions;
public BaseContactsActivity() {
super(R.string.contacts_activity_title);
}
/**
* 1
*/
@Override
protected void initView() {
setContentView(R.layout.activity_contacts);
// bind ListView
lvContacts = (ListView) findViewById(R.id.lv_contacts);
// set adapter
lvContacts.setAdapter(adapter);
}
/**
* 2
*/
@Override
protected void initData() {
permissions = getPermissions();
if(null == permissions || permissions.length == 0) {
return;
}
// I found PermissionHelper.getInstance() just create a new object.
// so it was not a single class, you have no need to worry about memory leak.
permissionHelper = PermissionHelper.getInstance(this);
// request permission
permissionHelper.request(permissions);
}
/**
* You need override this method to return permissions
* @return permissions that need grant
*/
protected abstract String[] getPermissions();
/**
* loading data in child thread
*/
private void loadingData() {
// loding data in child thread
new Thread() {
@Override
public void run() {
// show a loading dialog
showLoadingDialog();
// enhance the user feeling
SystemClock.sleep(200);
// get contacts
List<ContactBean> tempList = getContactDatas();
// get success, change data
changeDataAndRefreshUi(tempList);
}
}.start();
}
/**
* add the data to list and notify adapter
* @param tempList
*/
private void changeDataAndRefreshUi(final List<ContactBean> tempList) {
// the ui operation need run on ui thread
runOnUiThread(new Runnable() {
@Override
public void run() {
contacts.addAll(tempList);
// it might be null if user touch Back Button
if (null != dialog) {
dialog.cancel();
dialog = null;
}
// notify update list view
adapter.notifyDataSetChanged();
}
});
}
/**
* show loading dialog
*/
private void showLoadingDialog() {
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog = new AlertDialog.Builder(BaseContactsActivity.this)
.setTitle(R.string.tips)
.setMessage(R.string.loding_tips)
.create();
dialog.show();
}
});
}
/**
* get contact, subclass need to override to implement get data from different way
* @return
*/
protected abstract List<ContactBean> getContactDatas();
/**
* 3
*/
@Override
protected void initEvent() {
// set on touch item listener
lvContacts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// set selected phone as result
ContactBean contact = contacts.get(position);
Intent intent = new Intent();
intent.putExtra(Constant.KEY_CONTACT_PHONE, contact.getPhone());
setResult(RESULT_OK, intent);
finish();
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
// permission callback start
@Override
public void onPermissionGranted(@NonNull String[] permissionName) {
System.out.println("onPermissionGranted:" + Arrays.toString(permissionName));
loadingData();
}
@Override
public void onPermissionDeclined(@NonNull String[] permissionName) {
Toast.makeText(this, R.string.no_permission, Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionPreGranted(@NonNull String permissionsName) {
System.out.println("onPermissionPreGranted:" + permissionsName);
onPermissionGranted(new String[]{permissionsName});
}
@Override
public void onPermissionNeedExplanation(@NonNull String permissionName) {
System.out.println("onPermissionNeedExplanation:" + permissionName);
}
@Override
public void onPermissionReallyDeclined(@NonNull String permissionName) {
System.out.println("onPermissionReallyDeclined:" + permissionName);
}
@Override
public void onNoPermissionNeeded() {
onPermissionGranted(null);
}
// permission callback end
private class ContactAdapter extends BaseAdapter {
@Override
public int getCount() {
return contacts.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// get view
View view;
if (null == convertView) {
view = View.inflate(BaseContactsActivity.this, R.layout.item_contacts_lv, null);
} else {
view = convertView;
}
// set value to TextView
TextView tvName = (TextView) view.findViewById(R.id.tv_name);
TextView tvPhone = (TextView) view.findViewById(R.id.tv_phone);
ContactBean contact = contacts.get(position);
tvName.setText(contact.getName());
tvPhone.setText(contact.getPhone());
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}