Skip to content
This repository was archived by the owner on Nov 29, 2020. It is now read-only.

[FEATURE] add onboarding screen with hardcoded text and images #136

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
<activity
android:name=".OnboardingActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />

<receiver android:name=".net.NetworkChangeReceiver">
<intent-filter>
Expand Down
135 changes: 135 additions & 0 deletions app/src/main/java/ro/code4/monitorizarevot/OnboardingActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package ro.code4.monitorizarevot;

import android.arch.lifecycle.ViewModelProviders;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

import ro.code4.monitorizarevot.adapter.OnboardingAdapter;
import ro.code4.monitorizarevot.db.Preferences;
import ro.code4.monitorizarevot.net.model.OnboardingItem;
import ro.code4.monitorizarevot.observable.ObservableListener;
import ro.code4.monitorizarevot.viewmodel.OnboardingViewModel;

import ro.code4.monitorizarevot.R;

public class OnboardingActivity extends BaseActivity<OnboardingViewModel> {
private Button buttonPrevious, buttonNext;

private List<OnboardingItem> items;

private ViewPager onboardingViewPager;
private int currentPosition;

// TODO get onboarding items dynamically
private List<OnboardingItem> getOnboardingItems() {
List<OnboardingItem> items = new ArrayList<>();

OnboardingItem item1 = new OnboardingItem(1, getString(R.string.onboarding_title_1), getString(R.string.onboarding_description_1), R.drawable.ic_onboarding_building);
items.add(item1);

OnboardingItem item2 = new OnboardingItem(2, getString(R.string.onboarding_title_2), getString(R.string.onboarding_description_2), R.drawable.ic_onboarding_form);
items.add(item2);

OnboardingItem item3 = new OnboardingItem(3, getString(R.string.onboarding_title_3), getString(R.string.onboarding_description_3), R.drawable.ic_onboarding_note);
items.add(item3);

return items;
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_onboarding);

items = getOnboardingItems();

onboardingViewPager = findViewById(R.id.onboarding_viewpager);
buttonNext = findViewById(R.id.btn_next);
buttonPrevious = findViewById(R.id.btn_previous);

OnboardingAdapter onboardingAdapter = new OnboardingAdapter(this, items);
onboardingViewPager.setAdapter(onboardingAdapter);
onboardingViewPager.addOnPageChangeListener(onPageChangeListener);

buttonPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onboardingViewPager.setCurrentItem(currentPosition - 1);
}
});

buttonNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentPosition == items.size() - 1) {
goToLogin();
} else {
onboardingViewPager.setCurrentItem(currentPosition + 1);
}
}
});

Preferences.hasSeenOnboarding().startRequest(new PreferencesSubscriber());
}

@Override
protected void setupViewModel() {
viewModel = ViewModelProviders.of(this, factory).get(OnboardingViewModel.class);
}

private class PreferencesSubscriber extends ObservableListener<Boolean> {

@Override
public void onNext(Boolean hasSeenOnboarding) {
super.onNext(hasSeenOnboarding);
if (hasSeenOnboarding) {
goToLogin();
}
}

@Override
public void onSuccess() {

}
}

ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {
currentPosition = position;

if (position == 0) {
buttonPrevious.setVisibility(View.INVISIBLE);
} else if (position == items.size() - 1) {
buttonNext.setText(getString(R.string.onboarding_continue));
} else {
buttonPrevious.setVisibility(View.VISIBLE);

buttonNext.setText(getString(R.string.onboarding_next));
}
}

@Override
public void onPageScrollStateChanged(int state) {

}
};

private void goToLogin() {
Preferences.saveSeenOnboarding(true);
startActivity(new Intent(OnboardingActivity.this, LoginActivity.class));
finish();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private class PreferencesSubscriber extends ObservableListener<Boolean> {
public void onNext(Boolean hasCredentials) {
super.onNext(hasCredentials);
startActivity(new Intent(StartActivity.this,
hasCredentials ? ToolbarActivity.class : LoginActivity.class));
hasCredentials ? ToolbarActivity.class : OnboardingActivity.class));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package ro.code4.monitorizarevot.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;
import ro.code4.monitorizarevot.net.model.OnboardingItem;

import ro.code4.monitorizarevot.R;

public class OnboardingAdapter extends PagerAdapter {
private Context context;
private List<OnboardingItem> items;

public OnboardingAdapter(Context context, List<OnboardingItem> items) {
this.context = context;
this.items = items;
}

@Override
public int getCount() {
return items.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
.inflate(R.layout.item_onboarding_page, container, false);

OnboardingItem item = items.get(position);

TextView onboardingTitle = view.findViewById(R.id.onboarding_title);
ImageView onboardingIcon = view.findViewById(R.id.onboarding_icon);
TextView onboardingDescription = view.findViewById(R.id.onboarding_description);

onboardingTitle.setText(item.getTitle());
onboardingIcon.setImageResource(item.getImageResource());
onboardingDescription.setText(item.getDescription());

container.addView(view);

return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((ConstraintLayout) object);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
import dagger.Module;
import dagger.android.ContributesAndroidInjector;
import ro.code4.monitorizarevot.LoginActivity;
import ro.code4.monitorizarevot.OnboardingActivity;
import ro.code4.monitorizarevot.StartActivity;
import ro.code4.monitorizarevot.ToolbarActivity;

@Module(includes = {ViewModelModule.class})
public abstract class ActivityBindingModule {

@ContributesAndroidInjector
abstract OnboardingActivity activityOnboarding();

@ContributesAndroidInjector
abstract StartActivity activityStart();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);

@Binds
@IntoMap
@ViewModelKey(OnboardingViewModel.class)
abstract ViewModel bindOnboardingViewModel(OnboardingViewModel viewModel);

@Binds
@IntoMap
@ViewModelKey(StartViewModel.class)
Expand Down
15 changes: 15 additions & 0 deletions app/src/main/java/ro/code4/monitorizarevot/db/Preferences.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class Preferences {
private static final String PREFS_BRANCH_NUMBER = "PREFS_BRANCH_NUMBER";
private static final String PREFS_USERNAME = "PREFS_USERNAME";
private static final String PREFS_TOKEN = "PREFS_TOKEN";
private static final String PREFS_ONBOARDING = "PREFS_ONBOARDING";

public static void clear() {
Prefs.clear();
Expand Down Expand Up @@ -55,6 +56,10 @@ public static boolean hasBranch() {
return getCountyCode() != null && getBranchNumber() != -1;
}

public static void saveSeenOnboarding(boolean hasSeenOnboarding) {
Prefs.putBoolean(PREFS_ONBOARDING, hasSeenOnboarding);
}

public static ObservableRequest<Boolean> isAlreadyLoggedIn() {
return new ObservableRequest<>(new ObservableRequest.OnRequested<Boolean>() {
@Override
Expand All @@ -64,4 +69,14 @@ public void onRequest(Subscriber<? super Boolean> subscriber) {
}
});
}

public static ObservableRequest<Boolean> hasSeenOnboarding() {
return new ObservableRequest<>(new ObservableRequest.OnRequested<Boolean>() {
@Override
public void onRequest(Subscriber<? super Boolean> subscriber) {
subscriber.onNext(Prefs.getBoolean(PREFS_ONBOARDING, false));
subscriber.onCompleted();
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ro.code4.monitorizarevot.net.model;

public class OnboardingItem {
private Integer id;
private String title;
private String description;
private int imageResource;

public OnboardingItem(Integer id, String title, String description, int imageResource) {
this.id = id;
this.title = title;
this.description = description;
this.imageResource = imageResource;
}

public Integer getId() {
return id;
}

public String getTitle() {
return title;
}

public String getDescription() {
return description;
}

public int getImageResource() {
return imageResource;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ro.code4.monitorizarevot.viewmodel;

import javax.inject.Inject;

import ro.code4.monitorizarevot.domain.usecase.UseCaseFactory;
import ro.code4.monitorizarevot.presentation.LoadingMessageFactory;
import ro.code4.monitorizarevot.presentation.MessageFactory;

public class OnboardingViewModel extends BaseViewModel {

@Inject
public OnboardingViewModel(UseCaseFactory useCaseFactory, LoadingMessageFactory loadingMessageFactory,
MessageFactory messageFactory) {
super(useCaseFactory, loadingMessageFactory, messageFactory);
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 changes: 43 additions & 0 deletions app/src/main/res/layout/activity_onboarding.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/ic_login_bkg">

<android.support.v4.view.ViewPager
android:id="@+id/onboarding_viewpager"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>

<Button
android:id="@+id/btn_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:text="@string/onboarding_previous"
android:textColor="@color/textPrimary"
android:layout_margin="@dimen/activity_horizontal_margin"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:visibility="invisible"
/>

<Button
android:id="@+id/btn_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:text="@string/onboarding_next"
android:textColor="@color/textPrimary"
android:layout_margin="@dimen/activity_horizontal_margin"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>

</android.support.constraint.ConstraintLayout>
Loading