package me.devsaki.hentoid.activities; import android.Manifest; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatDelegate; import android.widget.TextView; import com.github.paolorotolo.appintro.AppIntro2; import me.devsaki.hentoid.HentoidApp; import me.devsaki.hentoid.R; import me.devsaki.hentoid.fragments.BaseSlide; import me.devsaki.hentoid.util.ConstsImport; import me.devsaki.hentoid.util.Helper; import me.devsaki.hentoid.util.LogHelper; /** * Created by avluis on 03/20/2016. * Welcome (Intro Slide) Activity * Presents required permissions, then calls the proper activity to: * Set storage directory and library import */ public class IntroActivity extends AppIntro2 { private static final String TAG = LogHelper.makeLogTag(IntroActivity.class); private static final int IMPORT_SLIDE = 4; static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } private Fragment doneFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addSlide(BaseSlide.newInstance(R.layout.intro_slide_01)); if (Helper.isAtLeastAPI(Build.VERSION_CODES.M)) { addSlide(BaseSlide.newInstance(R.layout.intro_slide_02)); // Ask Storage permission in the second slide, // but only for Android M+ users. askForPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2); } else { // In order to keep the number of slides the same, // we show this info slide for non-M users. addSlide(BaseSlide.newInstance(R.layout.intro_slide_02_alt)); } addSlide(BaseSlide.newInstance(R.layout.intro_slide_03)); addSlide(BaseSlide.newInstance(R.layout.intro_slide_04)); addSlide(BaseSlide.newInstance(R.layout.intro_slide_05)); doneFragment = BaseSlide.newInstance(R.layout.intro_slide_06); addSlide(doneFragment); setNavBarColor("#2b0202"); setVibrate(true); setVibrateIntensity(30); showSkipButton(false); pager.setPagingEnabled(false); } @Override protected void onResume() { super.onResume(); if (pager.getCurrentItem() >= 1) { setTitle(R.string.app_name); } } @Override public void onSlideChanged(@Nullable Fragment oldFragment, @Nullable Fragment newFragment) { super.onSlideChanged(oldFragment, newFragment); if (pager.getCurrentItem() >= 1) { setTitle(R.string.app_name); } if (pager.getCurrentItem() == IMPORT_SLIDE) { setProgressButtonEnabled(false); TextView defaultTv = (TextView) findViewById(R.id.tv_library_default); TextView customTv = (TextView) findViewById(R.id.tv_library_custom); defaultTv.setCompoundDrawablesWithIntrinsicBounds( R.drawable.ic_action_sd_storage, 0, 0, 0); defaultTv.setCompoundDrawablePadding(10); customTv.setCompoundDrawablesWithIntrinsicBounds( R.drawable.ic_action_sd_storage, 0, 0, 0); customTv.setCompoundDrawablePadding(10); defaultTv.setOnClickListener(view -> { if (HentoidApp.isImportComplete()) { Intent defaultDir = new Intent( getApplicationContext(), ImportActivity.class); defaultDir.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(defaultDir, ConstsImport.RQST_IMPORT_RESULTS); } HentoidApp.setBeginImport(true); }); customTv.setOnClickListener(view -> { // TODO: Create activity listing possible storage locations if (HentoidApp.isImportComplete()) { Intent customDir = new Intent( getApplicationContext(), ImportActivity.class); startActivityForResult(customDir, ConstsImport.RQST_IMPORT_RESULTS); } HentoidApp.setBeginImport(true); }); } } @Override public void onDonePressed(Fragment currentFragment) { HentoidApp.setDonePressed(true); Helper.commitFirstRun(false); Intent intent = new Intent(this, DownloadsActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); finish(); } @Override public void onBackPressed() { if (pager.getCurrentItem() == IMPORT_SLIDE + 1) { // DO NOT ALLOW LogHelper.d(TAG, "You can't leave just yet!"); } else { super.onBackPressed(); } } private void initImport() { if (HentoidApp.isImportComplete()) { Handler handler = new Handler(); handler.postDelayed(() -> { Intent selectFolder = new Intent( getApplicationContext(), ImportActivity.class); startActivityForResult(selectFolder, ConstsImport.RQST_IMPORT_RESULTS); }, 200); handler.removeCallbacks(null); } HentoidApp.setBeginImport(true); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == ConstsImport.RQST_IMPORT_RESULTS) { LogHelper.d(TAG, "REQUEST RESULT RECEIVED"); if (data != null) { if (data.getStringExtra(ConstsImport.RESULT_KEY) != null) { String result = data.getStringExtra(ConstsImport.RESULT_KEY); if (resultCode == RESULT_OK) { resultHandler(true, result); } if (resultCode == RESULT_CANCELED) { resultHandler(false, result); } } else { LogHelper.d(TAG, "Error: Data not received! Bad resultKey."); // Try again! initImport(); } } else { LogHelper.d(TAG, "Data is null!"); // Try again! initImport(); } } else if (requestCode == ConstsImport.RQST_APP_SETTINGS) { // Back from app settings HentoidApp.setBeginImport(false); Handler handler = new Handler(); handler.postDelayed(() -> { setProgressButtonEnabled(true); pager.setCurrentItem(IMPORT_SLIDE - 2); }, 100); handler.removeCallbacks(null); } else { LogHelper.d(TAG, "Unknown result code!"); } } private void resultHandler(boolean success, String result) { if (success) { // If we get RESULT_OK, then: LogHelper.d(TAG, "RESULT_OK: "); LogHelper.d(TAG, result); if (result.equals(ConstsImport.PERMISSION_GRANTED)) { LogHelper.d(TAG, "Permission Allowed, resetting."); HentoidApp.setBeginImport(false); setProgressButtonEnabled(false); pager.setCurrentItem(IMPORT_SLIDE - 1); Snackbar.make(pager, R.string.permission_granted, Snackbar.LENGTH_SHORT).show(); Handler handler = new Handler(); handler.postDelayed(() -> pager.setCurrentItem(IMPORT_SLIDE), 2000); } else { // Disallow swiping back setSwipeLock(true); // If result passes validation, then we move to next slide pager.setCurrentItem(IMPORT_SLIDE + 1); setProgressButtonEnabled(true); // Auto push to DownloadActivity after 10 seconds Handler doneHandler = new Handler(); doneHandler.postDelayed(() -> { if (!HentoidApp.isDonePressed() && doneFragment != null) { onDonePressed(doneFragment); } }, 10000); doneHandler.removeCallbacks(null); } } else { switch (result) { case ConstsImport.PERMISSION_DENIED: LogHelper.d(TAG, "Permission Denied by User"); pager.setCurrentItem(IMPORT_SLIDE - 3); Snackbar.make(pager, R.string.permission_denied, Snackbar.LENGTH_LONG).show(); setProgressButtonEnabled(true); break; case ConstsImport.PERMISSION_DENIED_FORCED: LogHelper.d(TAG, "Permission Denied (Forced) by User/Policy"); setProgressButtonEnabled(false); setSwipeLock(true); pager.setCurrentItem(IMPORT_SLIDE - 3); Snackbar.make(pager, R.string.permission_denied_forced, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.open_app_settings, v -> openAppSettings()) .show(); break; case ConstsImport.EXISTING_LIBRARY_FOUND: LogHelper.d(TAG, "Existing Library Found"); pager.setCurrentItem(IMPORT_SLIDE - 2); Snackbar.make(pager, R.string.existing_library_error, Snackbar.LENGTH_LONG).show(); setProgressButtonEnabled(true); break; default: LogHelper.d(TAG, "RESULT_CANCELED"); pager.setCurrentItem(IMPORT_SLIDE - 2); setProgressButtonEnabled(true); break; } HentoidApp.setBeginImport(false); } } private void openAppSettings() { Intent appSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName())); appSettings.addCategory(Intent.CATEGORY_DEFAULT); appSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivityForResult(appSettings, ConstsImport.RQST_APP_SETTINGS); } }