Created
September 17, 2020 11:21
-
-
Save luck-alex13/4a6a362dcf42707a050affa71fd08a13 to your computer and use it in GitHub Desktop.
Примеры кода
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class AuthActivityVM(application: Application) : BaseAndroidViewModel(application), LifecycleObserver { | |
var authClient = DokiMainClient.create(UserConfig.getServerUrl()) | |
fun changePass(oldPass: String, newPass: String) { | |
vmState.postValue(ViewModelState.ProgressState(true)) | |
compositeDisposable.add( | |
makeAsync(authClient.changePassword(oldPass, newPass)) | |
.subscribe({ | |
vmState.postValue(ViewModelState.SuccessChangePass()) | |
}, { | |
vmState.postValue( | |
ViewModelState.ErrorState( | |
handleRequestError(it) | |
) | |
) | |
}) | |
) | |
} | |
fun getUserLinks() { | |
compositeDisposable.add( | |
makeAsync(authClient.getUserLinks()) | |
.subscribe({ | |
vmState.postValue(ViewModelState.SuccessState(it)) | |
}, { | |
vmState.postValue( | |
ViewModelState.ErrorState( | |
handleRequestError(it) | |
) | |
) | |
}) | |
) | |
} | |
fun bindVk(token: String) { | |
vmState.postValue(ViewModelState.ProgressState(true)) | |
compositeDisposable.add( | |
makeAsync( | |
authClient.bindVk(token) | |
).subscribe({ | |
toast(getContext(), getContext().getString(R.string.social_account_bind_success)) | |
getUserLinks() | |
}, { | |
vmState.postValue( | |
ViewModelState.ErrorState( | |
handleRequestError(it) | |
) | |
) | |
}) | |
) | |
} | |
fun unbindVk() { | |
vmState.postValue(ViewModelState.ProgressState(true)) | |
compositeDisposable.add( | |
makeAsync(authClient.unbindVk()) | |
.subscribe({ | |
toast(getContext(), getContext().getString(R.string.social_account_unbind_success)) | |
getUserLinks() | |
}, { | |
vmState.postValue( | |
ViewModelState.ErrorState( | |
handleRequestError(it) | |
) | |
) | |
}) | |
) | |
} | |
fun bindFb(token: String) { | |
vmState.postValue(ViewModelState.ProgressState(true)) | |
compositeDisposable.add( | |
makeAsync( | |
authClient.bindFb(token) | |
).subscribe({ | |
toast(getContext(), getContext().getString(R.string.social_account_bind_success)) | |
getUserLinks() | |
}, { | |
vmState.postValue( | |
ViewModelState.ErrorState( | |
handleRequestError(it) | |
) | |
) | |
}) | |
) | |
} | |
fun unbindFb() { | |
vmState.postValue(ViewModelState.ProgressState(true)) | |
compositeDisposable.add( | |
makeAsync(authClient.unbindFb()) | |
.subscribe({ | |
toast(getContext(), getContext().getString(R.string.social_account_unbind_success)) | |
getUserLinks() | |
}, { | |
vmState.postValue( | |
ViewModelState.ErrorState( | |
handleRequestError(it) | |
) | |
) | |
}) | |
) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open class BaseAndroidViewModel(application: Application) : AndroidViewModel(application), LifecycleObserver { | |
var progressState = MutableLiveData<Boolean>() | |
var vmState = SingleLiveEvent<ViewModelState>() | |
protected var dp: Disposable? = null | |
protected val compositeDisposable = CompositeDisposable() | |
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) | |
open fun clearDisposables() { | |
compositeDisposable.clear() | |
} | |
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) | |
open fun disposeDisposables() { | |
compositeDisposable.dispose() | |
dp?.dispose() | |
} | |
fun <T> makeAsync(func: Observable<T>): Observable<T> { | |
return func.subscribeOn(Schedulers.io()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
} | |
fun makeAsync(func: Completable): Completable { | |
return func.subscribeOn(Schedulers.io()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
} | |
} | |
sealed class ViewModelState { | |
class SuccessState<T>(val result: T): ViewModelState() | |
class SuccessState1() : ViewModelState() | |
class SuccessChangePass() : ViewModelState() | |
class SuccessChangePhone() : ViewModelState() | |
class SuccessAuth() : ViewModelState() | |
class SuccessBindSocial() : ViewModelState() | |
class SuccessUnbindSocial() : ViewModelState() | |
class SuccessRegistrationRequest() : ViewModelState() | |
class SuccessAuthDemo<T>(val result: T) : ViewModelState() | |
class SuccessAuthByGoogle<T>(val result: T) : ViewModelState() | |
class ErrorState(val errorText: CharSequence) : ViewModelState() | |
class SmallImageError : ViewModelState() | |
class BanState(val errorText: CharSequence) : ViewModelState() | |
class ProgressState(val inProgress: Boolean): ViewModelState() | |
class SubscriptionConfirmed<T>(val result: T): ViewModelState() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class EditPhoneDialog(context: Context) : Dialog(context, R.style.CustomDialogTheme) { | |
init { | |
ownerActivity = context as Activity | |
} | |
private var saveCallback: Callback<String>? = null | |
override fun onCreate(savedInstanceState: Bundle?) { | |
super.onCreate(savedInstanceState) | |
setContentView(R.layout.dialog_edit_phone) | |
closeButton.setOnClickListener { | |
newPhoneEditText.hideKeyboard() | |
dismiss() | |
} | |
changeBtn.setOnClickListener { | |
validateFields() | |
} | |
setupPhoneEditText() | |
newPhoneEditText.showKeyboard() | |
} | |
private fun setupPhoneEditText() { | |
val mask = MaskImpl.createTerminated(PredefinedSlots.RUS_PHONE_NUMBER) | |
val watcher = MaskFormatWatcher(mask) | |
watcher.installOn(newPhoneEditText) | |
newPhoneEditText.onFocusChangeListener = View.OnFocusChangeListener { view, hasFocus -> | |
if (hasFocus && newPhoneEditText.text!!.isBlank()) { | |
// хак чтобы показать маску до ввода символа | |
newPhoneEditText.setText("l") | |
} | |
} | |
} | |
private fun validateFields() { | |
val newPhone = newPhoneEditText.text?.toString() | |
if (newPhone.isNullOrBlank()) { | |
newPhoneEditText.setError(context.getString(R.string.field_cant_be_empty)) | |
return | |
} | |
dismiss() | |
saveCallback?.call(newPhone) | |
} | |
fun setSaveCallback(callback: Callback<String>): EditPhoneDialog { | |
saveCallback = callback | |
return this | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// RecyclerView c разными типами и использованием Databinding | |
public class FriendsRVAdapter extends RecyclerView.Adapter<BaseViewHolder> { | |
private List<FriendListItem> listItems; | |
private OnItemClickListener<Friend> onItemClickListener; | |
private BindingListener bindingListener; | |
public FriendsRVAdapter() { | |
listItems = new ArrayList<>(); | |
} | |
public void setListItems(List<FriendListItem> listItems) { | |
this.listItems = listItems; | |
notifyDataSetChanged(); | |
} | |
@Override | |
public int getItemViewType(int position) { | |
return listItems.get(position).getType(); | |
} | |
@Override | |
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |
int layoutRes = 0; | |
switch (viewType) { | |
case FriendListItem.ITEM_HEADER: { | |
layoutRes = R.layout.first_friend_item; | |
break; | |
} | |
case FriendListItem.ITEM_CONFIRMED_FRIEND: { | |
layoutRes = R.layout.friend_list_item; | |
break; | |
} | |
case FriendListItem.ITEM_PROGRESS: { | |
layoutRes = R.layout.progress_list_item; | |
break; | |
} | |
case FriendListItem.ITEM_INCOMING_FRIEND: { | |
layoutRes = R.layout.new_friend_item; | |
break; | |
} | |
} | |
View view = LayoutInflater.from(parent.getContext()) | |
.inflate(layoutRes, parent, false); | |
return new BaseViewHolder(DataBindingUtil.bind(view)); | |
} | |
@Override | |
public void onBindViewHolder(BaseViewHolder holder, int position) { | |
Friend friend = listItems.get(position).getFriend(); | |
if (friend != null && friend.isValid()) { | |
holder.bindView(BR.friend, friend); | |
if (onItemClickListener != null) { | |
holder.getBinding().getRoot().setOnClickListener(v -> { | |
if (onItemClickListener != null) | |
onItemClickListener.onItemClick(v, position, listItems.get(position).getFriend()); | |
}); | |
} | |
int itemType = listItems.get(position).getType(); | |
if (bindingListener != null && (itemType == FriendListItem.ITEM_HEADER || itemType == FriendListItem.ITEM_INCOMING_FRIEND)) { | |
bindingListener.onBindItem(holder.getBinding(), position, listItems.get(position).getFriend()); | |
} | |
} | |
} | |
@Override | |
public int getItemCount() { | |
return listItems == null ? 0 : listItems.size(); | |
} | |
public void setOnItemClickListener(OnItemClickListener<Friend> onItemClickListener) { | |
this.onItemClickListener = onItemClickListener; | |
} | |
public void setBindingListener(BindingListener bindingListener) { | |
this.bindingListener = bindingListener; | |
} | |
public interface BindingListener { | |
void onBindItem(ViewDataBinding binding, int position, Friend item); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MainClient { | |
companion object Factory { | |
fun create(serverUrl: String): DokiMainApi { | |
val retrofit = Retrofit.Builder() | |
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) | |
.addConverterFactory(GsonConverterFactory.create()) | |
.addConverterFactory(ScalarsConverterFactory.create()) | |
.baseUrl(serverUrl + Const.Links.API) | |
.client(AuthOkHttpClient.create()) | |
.build() | |
return retrofit.create(DokiMainApi::class.java); | |
} | |
} | |
} | |
class AuthOkHttpClient { | |
companion object { | |
val defaultTimeOut: Long = 1 | |
fun create(): OkHttpClient { | |
return OkHttpClient.Builder() | |
.readTimeout(defaultTimeOut, TimeUnit.MINUTES) | |
.connectTimeout(defaultTimeOut, TimeUnit.MINUTES) | |
.writeTimeout(defaultTimeOut, TimeUnit.MINUTES) | |
.apply { | |
this.addNetworkInterceptor(authInterceptor()) | |
if (BuildConfig.DEBUG) { | |
val logging = HttpLoggingInterceptor() | |
logging.level = HttpLoggingInterceptor.Level.BODY | |
this.addNetworkInterceptor(logging) | |
} | |
} | |
.build() | |
} | |
fun authInterceptor(): Interceptor { | |
return TokenInterceptor() | |
} | |
} | |
class TokenInterceptor() : Interceptor { | |
private val HEADER_AUTH = "Authorization" | |
private val BEARER = "Bearer" | |
@Throws(IOException::class) | |
override fun intercept(chain: Interceptor.Chain): Response { | |
val originalRequest = chain.request() | |
val builder: Request.Builder | |
builder = originalRequest.newBuilder() | |
.header(HEADER_AUTH, "$BEARER ${UserConfig.getAuthToken()}") | |
return chain.proceed(builder.build()) | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SlideFragment : Fragment() { | |
var layoutRes: Int = R.layout.fragment_slide | |
var imageId: Int = -1 | |
var textId: Int = -1 | |
companion object { | |
@JvmStatic | |
fun newInstance(imageId: Int, textId: Int): SlideFragment = | |
SlideFragment().apply { | |
arguments = Bundle().apply { | |
putInt(Const.Extras.KEY_IMAGE, imageId) | |
putInt(Const.Extras.KEY_TEXT, textId) | |
} | |
} | |
} | |
override fun onCreate(savedInstanceState: Bundle?) { | |
super.onCreate(savedInstanceState) | |
arguments?.let { | |
imageId = it.getInt(Const.Extras.KEY_IMAGE) | |
textId = it.getInt(Const.Extras.KEY_TEXT) | |
} | |
} | |
override fun onCreateView( | |
inflater: LayoutInflater, container: ViewGroup?, | |
savedInstanceState: Bundle? | |
): View? { | |
// Inflate the layout for this fragment | |
return inflater.inflate(layoutRes, container, false) | |
} | |
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | |
super.onViewCreated(view, savedInstanceState) | |
if (imageId > 0) { | |
slideImage.setImageResource(imageId) | |
} | |
if (textId > 0) { | |
slideText.setText(textId) | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// туториал с табами | |
class TutorialActivity : AppCompatActivity(), ViewPager.OnPageChangeListener { | |
private lateinit var slidesFragmentAdapter: SlidesFragmentAdapter | |
override fun onCreate(savedInstanceState: Bundle?) { | |
super.onCreate(savedInstanceState) | |
this.setContentView(R.layout.tutotial_activity) | |
val pagesList = mutableListOf<Fragment>( | |
SlideFragment.newInstance(R.drawable.photo_slide, R.string.tutorial_first_slide), | |
SlideFragment.newInstance(R.drawable.search_slide, R.string.tutorial_second_slide), | |
SlideFragment.newInstance(R.drawable.packet_slide, R.string.tutorial_third_slide), | |
SlideFragment.newInstance(R.drawable.tools_slide, R.string.tutorial_fourth_slide) | |
) | |
slidesFragmentAdapter = SlidesFragmentAdapter(pagesList, supportFragmentManager) | |
slidesViewPager.adapter = slidesFragmentAdapter | |
slidesViewPager.addOnPageChangeListener(this) | |
indicator.attachToPager(slidesViewPager); | |
skipBtn.setOnClickListener { | |
openNextActivity() | |
} | |
nextBtn.setOnClickListener { | |
if (slidesViewPager.currentItem < slidesFragmentAdapter.count - 1) { | |
slidesViewPager.setCurrentItem(slidesViewPager.currentItem + 1, true) | |
} else { | |
openNextActivity() | |
} | |
} | |
} | |
fun openNextActivity() { | |
UserConfig.setTutorialShown(true) | |
val intent = Intent(this, LoginActivity::class.java).apply { | |
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) | |
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) | |
} | |
startActivity(intent) | |
} | |
override fun onPageScrollStateChanged(state: Int) { | |
} | |
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { | |
} | |
override fun onPageSelected(position: Int) { | |
when (position) { | |
0 -> { | |
} | |
1 -> { | |
} | |
2 -> { | |
nextBtn.setText(R.string.next) | |
} | |
3 -> { | |
nextBtn.setText(R.string.begin_action) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment