提交 567d00ec 编写于 作者: J jessyan

add PermissionUtil

上级 375e31fa
<component name="libraryTable">
<library name="rxpermissions-0.7.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/arms/build/intermediates/exploded-aar/com.tbruyelle.rxpermissions/rxpermissions/0.7.0/jars/classes.jar!/" />
<root url="file://$PROJECT_DIR$/arms/build/intermediates/exploded-aar/com.tbruyelle.rxpermissions/rxpermissions/0.7.0/res" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.tbruyelle.rxpermissions/rxpermissions/0.7.0/79f6c683535a4ac4fabd9a32b1caa0dbbde82953/rxpermissions-0.7.0-sources.jar!/" />
</SOURCES>
</library>
</component>
\ No newline at end of file
......@@ -7,6 +7,7 @@ import com.jess.arms.di.module.AppModule;
import com.jess.arms.di.module.ClientModule;
import com.jess.arms.di.module.ImageModule;
import com.jess.arms.widget.imageloader.ImageLoader;
import com.tbruyelle.rxpermissions.RxPermissions;
import javax.inject.Singleton;
......@@ -35,6 +36,9 @@ public interface AppComponent {
//Rxjava错误处理管理类
RxErrorHandler rxErrorHandler();
//用于请求权限,适配6.0的权限管理
RxPermissions rxPermissions();
OkHttpClient okHttpClient();
//图片管理器,用于加载图片的管理类,默认使用glide,使用策略模式,可替换框架
......
......@@ -4,6 +4,8 @@ import com.jess.arms.base.BaseActivity;
import com.jess.arms.base.DefaultAdapter;
import com.jess.arms.di.scope.ActivityScope;
import com.jess.arms.mvp.BasePresenter;
import com.jess.arms.utils.PermissionUtil;
import com.tbruyelle.rxpermissions.RxPermissions;
import java.util.ArrayList;
import java.util.List;
......@@ -27,25 +29,38 @@ import rx.schedulers.Schedulers;
@ActivityScope
public class UserPresenter extends BasePresenter<UserContract.Model, UserContract.View> {
private RxErrorHandler mErrorHandler;
private RxPermissions mRxPermissions;
private List<User> mUsers = new ArrayList<>();
private DefaultAdapter mAdapter;
private int lastUserId = 1;
@Inject
public UserPresenter(UserContract.Model model, UserContract.View rootView, RxErrorHandler handler) {
public UserPresenter(UserContract.Model model, UserContract.View rootView, RxErrorHandler handler
, RxPermissions rxPermissions) {
super(model, rootView);
this.mErrorHandler = handler;
this.mRxPermissions = rxPermissions;
mAdapter = new UserAdapter(mUsers);
mRootView.setAdapter(mAdapter);//设置Adapter
}
public void requestUsers(final boolean pullToRefresh) {
//请求外部存储权限用于适配android6.0的权限管理机制
PermissionUtil.externalStorage(new PermissionUtil.RequestPermission() {
@Override
public void onRequestPermissionSuccess() {
//request permission success, do something.
}
}, mRxPermissions, mRootView, mErrorHandler);
if (pullToRefresh) lastUserId = 1;
mModel.getUsers(lastUserId, pullToRefresh)
.subscribeOn(Schedulers.io())
.retryWhen(new RetryWithDelay(3,2))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.retryWhen(new RetryWithDelay(3, 2))//遇到错误时重试,第一个参数为重试几次,第二个参数为重试的间隔
.doOnSubscribe(new Action0() {
@Override
public void call() {
......@@ -65,17 +80,17 @@ public class UserPresenter extends BasePresenter<UserContract.Model, UserContrac
mRootView.endLoadMore();
}
})
.compose(((BaseActivity)mRootView).<List<User>>bindToLifecycle())//使用RXlifecycle,使subscription和activity一起销毁
.compose(((BaseActivity) mRootView).<List<User>>bindToLifecycle())//使用RXlifecycle,使subscription和activity一起销毁
.subscribe(new ErrorHandleSubscriber<List<User>>(mErrorHandler) {
@Override
public void onNext(List<User> users) {
lastUserId = users.get(users.size() - 1).getId();//记录最后一个id,用于下一次请求
if (pullToRefresh) mUsers.clear();//如果是上拉刷新则晴空列表
for (User user : users) {
mUsers.add(user);
}
mAdapter.notifyDataSetChanged();//通知更新数据
}
});
@Override
public void onNext(List<User> users) {
lastUserId = users.get(users.size() - 1).getId();//记录最后一个id,用于下一次请求
if (pullToRefresh) mUsers.clear();//如果是上拉刷新则晴空列表
for (User user : users) {
mUsers.add(user);
}
mAdapter.notifyDataSetChanged();//通知更新数据
}
});
}
}
......@@ -49,6 +49,7 @@ dependencies {
provided rootProject.ext.dependencies["rxbinding-recyclerview-v7"]
compile rootProject.ext.dependencies["rxcache"]
compile rootProject.ext.dependencies["rxcache-jolyglot-gson"]
compile rootProject.ext.dependencies["rxpermissions"]
compile rootProject.ext.dependencies["retrofit"]
compile rootProject.ext.dependencies["retrofit-converter-gson"]
compile rootProject.ext.dependencies["retrofit-adapter-rxjava"]
......
......@@ -5,6 +5,7 @@ import android.app.Application;
import com.jess.arms.http.GlobeHttpHandler;
import com.jess.arms.http.RequestIntercept;
import com.jess.arms.utils.DataHelper;
import com.tbruyelle.rxpermissions.RxPermissions;
import java.io.File;
import java.util.concurrent.TimeUnit;
......@@ -130,7 +131,7 @@ public class ClientModule {
/**
* 提供处理Rxjava处理的管理器
* 提供处理Rxjava错误的管理器
*
* @return
*/
......@@ -144,6 +145,18 @@ public class ClientModule {
.build();
}
/**
* 提供权限管理类,用于请求权限,适配6.0的权限管理
* @param application
* @return
*/
@Singleton
@Provides
RxPermissions provideRxPermissions(Application application) {
return RxPermissions.getInstance(application);
}
/**
* @param builder
* @param client
......
package com.jess.arms.utils;
import android.Manifest;
import com.jess.arms.base.BaseActivity;
import com.jess.arms.base.BaseFragment;
import com.jess.arms.mvp.BaseView;
import com.tbruyelle.rxpermissions.RxPermissions;
import com.trello.rxlifecycle.LifecycleTransformer;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import timber.log.Timber;
/**
* Created by jess on 17/10/2016 10:09
* Contact with jess.yan.effort@gmail.com
*/
public class PermissionUtil {
public static final String TAG = "Permission";
public interface RequestPermission {
void onRequestPermissionSuccess();
}
public static <T> LifecycleTransformer<T> bindToLifecycle(BaseView view) {
if (view instanceof BaseActivity) {
return ((BaseActivity) view).<T>bindToLifecycle();
} else if (view instanceof BaseFragment) {
return ((BaseFragment) view).<T>bindToLifecycle();
} else {
throw new IllegalArgumentException("view isn't activity or fragment");
}
}
/**
* 请求摄像头权限
*/
public static void launchCamera(final RequestPermission requestPermission, RxPermissions rxPermissions, final BaseView view, RxErrorHandler errorHandler) {
//先确保是否已经申请过摄像头,和写入外部存储的权限
boolean isPermissionsGranted =
rxPermissions
.isGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE) &&
rxPermissions
.isGranted(Manifest.permission.CAMERA);
if (isPermissionsGranted) {//已经申请过,直接执行操作
requestPermission.onRequestPermissionSuccess();
} else {//没有申请过,则申请
rxPermissions
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE
, Manifest.permission.CAMERA)
.compose(PermissionUtil.<Boolean>bindToLifecycle(view))//使用RXlifecycle,使subscription和activity一起销毁
.subscribe(new ErrorHandleSubscriber<Boolean>(errorHandler) {
@Override
public void onNext(Boolean granted) {
if (granted) {
Timber.tag(TAG).d("request WRITE_EXTERNAL_STORAGE and CAMERA success");
requestPermission.onRequestPermissionSuccess();
} else {
view.showMessage("request permissons failure");
}
}
});
}
}
/**
* 请求外部存储的权限
*/
public static void externalStorage(final RequestPermission requestPermission, RxPermissions rxPermissions, final BaseView view, RxErrorHandler errorHandler) {
//先确保是否已经申请过摄像头,和写入外部存储的权限
boolean isPermissionsGranted =
rxPermissions
.isGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (isPermissionsGranted) {//已经申请过,直接执行操作
requestPermission.onRequestPermissionSuccess();
} else {//没有申请过,则申请
rxPermissions
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.compose(PermissionUtil.<Boolean>bindToLifecycle(view))//使用RXlifecycle,使subscription和activity一起销毁
.subscribe(new ErrorHandleSubscriber<Boolean>(errorHandler) {
@Override
public void onNext(Boolean granted) {
if (granted) {
Timber.tag(TAG).d("request WRITE_EXTERNAL_STORAGE and CAMERA success");
requestPermission.onRequestPermissionSuccess();
} else {
view.showMessage("request permissons failure");
}
}
});
}
}
/**
* 请求发送短信权限
*/
public static void sendSms(final RequestPermission requestPermission, RxPermissions rxPermissions, final BaseView view, RxErrorHandler errorHandler) {
//先确保是否已经申请过权限
boolean isPermissionsGranted =
rxPermissions
.isGranted(Manifest.permission.SEND_SMS);
if (isPermissionsGranted) {//已经申请过,直接执行操作
requestPermission.onRequestPermissionSuccess();
} else {//没有申请过,则申请
rxPermissions
.request(Manifest.permission.SEND_SMS)
.compose(PermissionUtil.<Boolean>bindToLifecycle(view))//使用RXlifecycle,使subscription和activity一起销毁
.subscribe(new ErrorHandleSubscriber<Boolean>(errorHandler) {
@Override
public void onNext(Boolean granted) {
if (granted) {
Timber.tag(TAG).d("request SEND_SMS success");
requestPermission.onRequestPermissionSuccess();
} else {
view.showMessage("request permissons failure");
}
}
});
}
}
/**
* 请求打电话权限
*/
public static void callPhone(final RequestPermission requestPermission, RxPermissions rxPermissions, final BaseView view, RxErrorHandler errorHandler) {
//先确保是否已经申请过权限
boolean isPermissionsGranted =
rxPermissions
.isGranted(Manifest.permission.CALL_PHONE);
if (isPermissionsGranted) {//已经申请过,直接执行操作
requestPermission.onRequestPermissionSuccess();
} else {//没有申请过,则申请
rxPermissions
.request(Manifest.permission.CALL_PHONE)
.compose(PermissionUtil.<Boolean>bindToLifecycle(view))//使用RXlifecycle,使subscription和activity一起销毁
.subscribe(new ErrorHandleSubscriber<Boolean>(errorHandler) {
@Override
public void onNext(Boolean granted) {
if (granted) {
Timber.tag(TAG).d("request SEND_SMS success");
requestPermission.onRequestPermissionSuccess();
} else {
view.showMessage("request permissons failure");
}
}
});
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册