diff --git a/app/build.gradle b/app/build.gradle index a1184bde9..7892aea58 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -132,7 +132,7 @@ dependencies { //multidex implementation "androidx.multidex:multidex:$rootProject.multiDexVersion" - + //TableView implementation "com.evrencoskun.library:tableview:$rootProject.tableViewVersion" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f796adfa..165f10929 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,8 @@ + + - \ No newline at end of file + diff --git a/app/src/main/java/org/mifos/mobile/ui/activities/IntroductionActivity.java b/app/src/main/java/org/mifos/mobile/ui/activities/IntroductionActivity.java new file mode 100644 index 000000000..a29e3d91c --- /dev/null +++ b/app/src/main/java/org/mifos/mobile/ui/activities/IntroductionActivity.java @@ -0,0 +1,156 @@ +package org.mifos.mobile.ui.activities; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; +import butterknife.BindView; +import butterknife.ButterKnife; + +import android.Manifest; +import android.content.Intent; +import android.os.Bundle; +import android.text.Html; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.mifos.mobile.R; +import org.mifos.mobile.api.local.PreferencesHelper; +import org.mifos.mobile.ui.adapters.IntroductionViewPagerAdapter; +import org.mifos.mobile.utils.CheckSelfPermissionAndRequest; +import org.mifos.mobile.utils.Constants; + +public class IntroductionActivity extends AppCompatActivity { + + @BindView(R.id.view_pager) + public ViewPager viewPager; + + @BindView(R.id.layoutDots) + public LinearLayout dotsLayout; + + @BindView(R.id.btn_skip) + public Button btnSkip; + + @BindView(R.id.btn_next) + public Button btnNext; + + private IntroductionViewPagerAdapter myViewPagerAdapter; + private TextView[] dots; + private int[] layouts; + private PreferencesHelper prefs; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_introduction); + ButterKnife.bind(this); + + prefs = new PreferencesHelper(this); + layouts = new int[]{ + R.layout.intro_screen_1, + R.layout.intro_screen_2, + R.layout.intro_screen_3, + R.layout.intro_screen_4}; + + addBottomDots(0); + myViewPagerAdapter = new IntroductionViewPagerAdapter(layouts, this); + viewPager.setAdapter(myViewPagerAdapter); + viewPager.addOnPageChangeListener(viewPagerPageChangeListener); + + btnSkip.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + launchHomeScreen(); + } + }); + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int current = getItem(+1); + if (current < layouts.length) { + if (current == 2 && !CheckSelfPermissionAndRequest + .checkSelfPermission(getApplicationContext(), + Manifest.permission.READ_PHONE_STATE)) { + requestPermission(); + } + viewPager.setCurrentItem(current); + } else { + launchHomeScreen(); + } + } + }); + } + + + private void addBottomDots(int currentPage) { + int colorInactive = getResources().getColor(R.color.primary); + int colorActive = getResources().getColor(R.color.white); + dots = new TextView[layouts.length]; + + dotsLayout.removeAllViews(); + for (int i = 0; i < dots.length; i++) { + dots[i] = new TextView(this); + dots[i].setText(Html.fromHtml(getString(R.string.dot_string))); + dots[i].setTextSize(35); + dots[i].setTextColor(colorInactive); + dotsLayout.addView(dots[i]); + } + if (dots.length > 0) { + dots[currentPage].setTextColor(colorActive); + } + } + + private int getItem(int i) { + return viewPager.getCurrentItem() + i; + } + + private void launchHomeScreen() { + prefs.putBoolean("check_first_time", false); + startActivity(new Intent(this, LoginActivity.class)); + finish(); + } + + + ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager + .OnPageChangeListener() { + @Override + public void onPageSelected(int position) { + addBottomDots(position); + + if (position == layouts.length - 1) { + btnNext.setText(getString(R.string.start)); + btnSkip.setVisibility(View.GONE); + } else if (position == 2 && !CheckSelfPermissionAndRequest + .checkSelfPermission(getApplicationContext(), + Manifest.permission.READ_PHONE_STATE)) { + requestPermission(); + } else { + btnNext.setText(getString(R.string.next)); + btnSkip.setVisibility(View.VISIBLE); + } + } + + @Override + public void onPageScrolled(int arg0, float arg1, int arg2) { } + + @Override + public void onPageScrollStateChanged(int arg0) { } + }; + + + /** + * Uses {@link CheckSelfPermissionAndRequest} to check for runtime permissions + */ + private void requestPermission() { + CheckSelfPermissionAndRequest.requestPermission( + this, + Manifest.permission.READ_PHONE_STATE, + Constants.PERMISSIONS_REQUEST_READ_PHONE_STATE, + getResources().getString( + R.string.dialog_message_phone_state_permission_denied_prompt), + getResources().getString(R.string. + dialog_message_phone_state_permission_never_ask_again), + Constants.PERMISSIONS_READ_PHONE_STATE_STATUS); + } +} diff --git a/app/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.java b/app/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.java index e469d9482..4bc16e5d3 100644 --- a/app/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.java +++ b/app/src/main/java/org/mifos/mobile/ui/activities/PassCodeActivity.java @@ -1,6 +1,5 @@ package org.mifos.mobile.ui.activities; -import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; @@ -10,8 +9,6 @@ import com.mifos.mobile.passcode.utils.EncryptionUtil; import org.mifos.mobile.R; -import org.mifos.mobile.utils.CheckSelfPermissionAndRequest; -import org.mifos.mobile.utils.Constants; import org.mifos.mobile.utils.MaterialDialog; import org.mifos.mobile.utils.Toaster; @@ -20,26 +17,8 @@ public class PassCodeActivity extends MifosPassCodeActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!CheckSelfPermissionAndRequest.checkSelfPermission(this, - Manifest.permission.READ_PHONE_STATE)) { - requestPermission(); - } } - /** - * Uses {@link CheckSelfPermissionAndRequest} to check for runtime permissions - */ - private void requestPermission() { - CheckSelfPermissionAndRequest.requestPermission( - this, - Manifest.permission.READ_PHONE_STATE, - Constants.PERMISSIONS_REQUEST_READ_PHONE_STATE, - getResources().getString( - R.string.dialog_message_phone_state_permission_denied_prompt), - getResources().getString(R.string. - dialog_message_phone_state_permission_never_ask_again), - Constants.PERMISSIONS_READ_PHONE_STATE_STATUS); - } @Override public int getLogo() { diff --git a/app/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.java b/app/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.java index 2bdfd0606..93978c0f1 100644 --- a/app/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.java +++ b/app/src/main/java/org/mifos/mobile/ui/activities/SplashActivity.java @@ -9,12 +9,14 @@ import com.mifos.mobile.passcode.utils.PasscodePreferencesHelper; +import org.mifos.mobile.api.local.PreferencesHelper; import org.mifos.mobile.ui.activities.base.BaseActivity; import org.mifos.mobile.utils.Constants; public class SplashActivity extends BaseActivity { PasscodePreferencesHelper passcodePreferencesHelper; + PreferencesHelper prefs; Intent intent; @Override @@ -23,9 +25,13 @@ protected void onCreate(Bundle savedInstanceState) { getActivityComponent().inject(this); passcodePreferencesHelper = new PasscodePreferencesHelper(this); + prefs = new PreferencesHelper(this); if (!passcodePreferencesHelper.getPassCode().isEmpty()) { intent = new Intent(this, PassCodeActivity.class); intent.putExtra(Constants.INTIAL_LOGIN, true); + } else if (passcodePreferencesHelper.getPassCode().isEmpty() && + prefs.getBoolean("check_first_time", true)) { + intent = new Intent(this, IntroductionActivity.class); } else { intent = new Intent(this, LoginActivity.class); } diff --git a/app/src/main/java/org/mifos/mobile/ui/adapters/IntroductionViewPagerAdapter.java b/app/src/main/java/org/mifos/mobile/ui/adapters/IntroductionViewPagerAdapter.java new file mode 100644 index 000000000..4d4379c38 --- /dev/null +++ b/app/src/main/java/org/mifos/mobile/ui/adapters/IntroductionViewPagerAdapter.java @@ -0,0 +1,45 @@ +package org.mifos.mobile.ui.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.viewpager.widget.PagerAdapter; + +public class IntroductionViewPagerAdapter extends PagerAdapter { + + private LayoutInflater layoutInflater; + private int[] layouts; + Context context; + + public IntroductionViewPagerAdapter(int[] layoutArray, Context context) { + layouts = layoutArray; + this.context = context; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View view = layoutInflater.inflate(layouts[position], container, false); + container.addView(view); + return view; + } + + @Override + public int getCount() { + return layouts.length; + } + + @Override + public boolean isViewFromObject(View view, Object obj) { + return view == obj; + } + + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + View view = (View) object; + container.removeView(view); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_done.png b/app/src/main/res/drawable-hdpi/ic_done.png new file mode 100644 index 000000000..d765fa436 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_done.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_intro.png b/app/src/main/res/drawable-hdpi/ic_intro.png new file mode 100644 index 000000000..f4636b2fd Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_intro.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_permission.png b/app/src/main/res/drawable-hdpi/ic_permission.png new file mode 100644 index 000000000..65a33ce9e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_permission.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_done.png b/app/src/main/res/drawable-mdpi/ic_done.png new file mode 100644 index 000000000..a59b05430 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_done.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_intro.png b/app/src/main/res/drawable-mdpi/ic_intro.png new file mode 100644 index 000000000..075895f42 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_intro.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_permission.png b/app/src/main/res/drawable-mdpi/ic_permission.png new file mode 100644 index 000000000..0c0f2a1f9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_permission.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_done.png b/app/src/main/res/drawable-xhdpi/ic_done.png new file mode 100644 index 000000000..b1d06d296 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_done.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_intro.png b/app/src/main/res/drawable-xhdpi/ic_intro.png new file mode 100644 index 000000000..56f49a54d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_intro.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_permission.png b/app/src/main/res/drawable-xhdpi/ic_permission.png new file mode 100644 index 000000000..69481935f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_permission.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_done.png b/app/src/main/res/drawable-xxhdpi/ic_done.png new file mode 100644 index 000000000..5955c1c36 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_done.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_intro.png b/app/src/main/res/drawable-xxhdpi/ic_intro.png new file mode 100644 index 000000000..42a288081 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_intro.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_permission.png b/app/src/main/res/drawable-xxhdpi/ic_permission.png new file mode 100644 index 000000000..ebaba9600 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_permission.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_done.png b/app/src/main/res/drawable-xxxhdpi/ic_done.png new file mode 100644 index 000000000..2cfa9ee3f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_done.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_intro.png b/app/src/main/res/drawable-xxxhdpi/ic_intro.png new file mode 100644 index 000000000..60bba8eb4 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_intro.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_permission.png b/app/src/main/res/drawable-xxxhdpi/ic_permission.png new file mode 100644 index 000000000..45fdb3935 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_permission.png differ diff --git a/app/src/main/res/layout/activity_introduction.xml b/app/src/main/res/layout/activity_introduction.xml new file mode 100644 index 000000000..3a4d2536f --- /dev/null +++ b/app/src/main/res/layout/activity_introduction.xml @@ -0,0 +1,51 @@ + + + + + + + + + + +