After I start a sample. However, I want to do something.
Such as request runtime permission, or collect all the use time and sort samples dynamically.
But I can't just update my project every time when the time when I want to change something. That why we have this.
//SourceCode:library/com.cz.android.sample.library.function.permission
|-- Permission
|-- PermissionObserver
|-- @SamplePermission
|-- SamplePermissionFunction (This is the implementation of the Function)
|-- SamplePermissoinsFragment
@Function
public class SamplePermissionFunction implements SampleFunction {
/**
* If your function wants to do some initial work. Here we inject the fragment.
* But if we don't we this function, call SamplePermissionsFragment.injectIfNeededIn(context);
* and then try to get fragment from the FragmentManager It just didn't exist
* @param context
*/
@Override
public void init(FragmentActivity context) {
//inject permission fragment
SamplePermissionsFragment.injectIfNeededIn(context);
}
/**
* Check this class and determined this class needs to run this function
* @param clazz
* @return
*/
@Override
public boolean isAvailable(Class<?> clazz) {
SamplePermission samplePermission = clazz.getAnnotation(SamplePermission.class);
return (null!=samplePermission&&
null!=samplePermission.value()&&
0 < samplePermission.value().length);
}
@Override
public void run(FragmentActivity context, final Object object, RegisterItem item) {
[...]
final SamplePermissionsFragment permissionsFragment=SamplePermissionsFragment.get(activity);
PermissionObserver permissionObserverWrapper = new PermissionObserver() {
@Override
public void onAccepted(PermissionResult permission) {
PermissionViewModel viewModel = PermissionViewModelProviders.getViewModel(activity);
PermissionObserver observer = viewModel.getObserver();
if(null!=observer){
observer.onAccepted(permission);
}
}
};
//add permission observer
permissionsFragment.addPermissionObserver(permissions,permissionObserverWrapper);
//Request permission
permissionsFragment.requestPermissions(permissions);
}
}
How we use this function
@SamplePermission(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE)
@RefRegister(title=R.string.function_permission_sample1,desc = R.string.function_permission_sample1_desc,category = R.string.sample_function)
class SamplePermissionActivity : AppCompatActivity(),PermissionObserver{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_function_permission_sample)
PermissionViewModelProviders.getViewModel(this).addObserver { result->
if(result.granted){
val text = getString(R.string.permission_granted, result.name)
Toast.makeText(applicationContext,text, Toast.LENGTH_SHORT).show()
} else {
val text = getString(R.string.permission_denied, result.name)
Toast.makeText(applicationContext,text, Toast.LENGTH_SHORT).show()
}
}
}
}
- Mark class as a function
- Have a class implements from the interface:SampleFunction
//
@Function
public class VisitRecordFunction implements SampleFunction {
private static final String TAG="VisitRecordFunction";
@Override
public void init(FragmentActivity context) {
}
@Override
public boolean isAvailable(Class<?> clazz) {
// when you return false. It won't call run method below.
return true;
}
@Override
public void run(FragmentActivity context, Object object, RegisterItem item) {
// do something...
Log.e(TAG,"Title:"+item.getTitle()+" class:"+object.toString());
}
}
- I do know that my fragment request permission with call the method OnActivityForResult. I will fix this in next version