package de.jeisfeld.augendiagnoselib.activities;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.Menu;
import android.view.MenuItem;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import de.jeisfeld.augendiagnoselib.Application;
import de.jeisfeld.augendiagnoselib.Application.AuthorizationLevel;
import de.jeisfeld.augendiagnoselib.R;
import de.jeisfeld.augendiagnoselib.components.DirectorySelectionPreference;
import de.jeisfeld.augendiagnoselib.components.PinchImageView;
import de.jeisfeld.augendiagnoselib.fragments.SettingsFragment;
import de.jeisfeld.augendiagnoselib.util.GoogleBillingHelper;
import de.jeisfeld.augendiagnoselib.util.PreferenceUtil;
import de.jeisfeld.augendiagnoselib.util.SystemUtil;
import de.jeisfeld.augendiagnoselib.util.TrackingUtil;
import de.jeisfeld.augendiagnoselib.util.TrackingUtil.Category;
/**
* Activity to display the settings page.
*/
public class SettingsActivity extends BasePreferenceActivity {
/**
* The fragment tag.
*/
private static final String FRAGMENT_TAG = "FRAGMENT_TAG";
/**
* The resource key for the type of preferences to be displayed.
*/
private static final String STRING_EXTRA_PREF_TYPE = "de.jeisfeld.augendiagnoselib.PREF_TYPE";
/**
* The path resources for which external storage prefix should be replaced.
*/
private static final int[] PATH_RESOURCES = {R.string.key_folder_input, R.string.key_folder_photos};
/**
* The settings fragment.
*/
private SettingsFragment mFragment;
/**
* Utility method to start the activity.
*
* @param context The context in which the activity is started.
* @param prefType The type of preferences to be displayed.
*/
public static void startActivity(@NonNull final Context context, @Nullable final Integer prefType) {
Intent intent = new Intent(context, SettingsActivity.class);
if (prefType != null) {
intent.putExtra(STRING_EXTRA_PREF_TYPE, prefType);
}
context.startActivity(intent);
}
@Override
protected final void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int prefType = getIntent().getIntExtra(STRING_EXTRA_PREF_TYPE, -1);
if (prefType != -1) {
mFragment = (SettingsFragment) getFragmentManager().findFragmentByTag(FRAGMENT_TAG);
if (mFragment == null) {
mFragment = new SettingsFragment();
mFragment.setParameters(getString(prefType));
getFragmentManager().beginTransaction().replace(android.R.id.content, mFragment, FRAGMENT_TAG).commit();
getFragmentManager().executePendingTransactions();
if (savedInstanceState == null) {
PreferenceUtil.incrementCounter(R.string.key_statistics_countsettings);
TrackingUtil.sendEvent(Category.EVENT_USER, "Open Settings", null);
}
}
}
if (savedInstanceState == null) {
PreferenceUtil.incrementCounter(R.string.key_statistics_countsettings);
TrackingUtil.sendEvent(Category.EVENT_USER, "Open Settings", null);
}
String[] activitiesWithHomeEnablement = getResources().getStringArray(R.array.activities_with_home_enablement);
if (getActionBar() != null) {
getActionBar().setDisplayHomeAsUpEnabled(Arrays.asList(activitiesWithHomeEnablement).contains(getClass().getName()));
}
}
@Override
protected final void onResume() {
super.onResume();
TrackingUtil.sendScreen(this);
}
@Override
public final void onBuildHeaders(@NonNull final List<Header> target) {
List<Header> baseHeaders = new ArrayList<>();
int prefType = getIntent().getIntExtra(STRING_EXTRA_PREF_TYPE, -1);
if (prefType == -1) {
// Load resource only into preliminary list, in order to allow manipulation.
loadHeadersFromResource(R.xml.pref_header, baseHeaders);
for (int i = 0; i < baseHeaders.size(); i++) {
Header header = baseHeaders.get(i);
String listPrefType = header.fragmentArguments == null ? "" : header.fragmentArguments.getString(SettingsFragment.STRING_PREF_TYPE);
if (listPrefType == null || listPrefType.equals(getString(R.string.key_dummy_screen_input_settings))
&& getString(R.string.pref_title_folder_input).length() == 0) {
// ignore basic settings if there is no need to enter input folder
continue;
}
if (listPrefType.equals(getString(R.string.key_dummy_screen_premium_settings))
&& Application.getAuthorizationLevel() != AuthorizationLevel.FULL_ACCESS
&& getString(R.string.pref_title_folder_input).length() == 0) {
// if not authorized and if input folder not required, put premium settings at top position.
target.add(0, header);
continue;
}
target.add(header);
}
}
}
@Override
protected final boolean isValidFragment(@NonNull final String fragmentName) {
return fragmentName.startsWith("de.jeisfeld.augendiagnoselib.fragments");
}
@Override
public final boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_default, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public final boolean onOptionsItemSelected(@NonNull final MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.action_help) {
DisplayHtmlActivity.startActivity(this, R.string.html_settings);
return true;
}
else {
return super.onOptionsItemSelected(item);
}
}
/**
* Set the default shared preferences (after first installation) Regarding paths, choose external folder as base
* folder.
*
* @param context The Context in which the preferences should be set.
*/
@SuppressLint("SdCardPath")
public static void setDefaultSharedPreferences(@NonNull final Context context) {
PreferenceManager.setDefaultValues(Application.getAppContext(), R.xml.prefs_input, true);
PreferenceManager.setDefaultValues(Application.getAppContext(), R.xml.prefs_display, true);
PreferenceManager.setDefaultValues(Application.getAppContext(), R.xml.prefs_storage, true);
PreferenceManager.setDefaultValues(Application.getAppContext(), R.xml.prefs_camera, true);
PreferenceManager.setDefaultValues(Application.getAppContext(), R.xml.prefs_premium, true);
if (PreferenceUtil.getSharedPreferenceString(R.string.key_folder_input).equals(
context.getString(R.string.pref_dummy_folder_input))) {
// On first startup, make default setting dependent on status of Eye-Fi.
if (SystemUtil.isAppInstalled(Application.getResourceString(R.string.package_mobi))) {
// If Eye-Fi (new) is available, use Eye-Fi default folder
PreferenceUtil.setSharedPreferenceString(R.string.key_folder_input,
context.getString(R.string.pref_default_folder_input_mobi));
}
else if (SystemUtil.isAppInstalled(Application.getResourceString(R.string.package_eyefi))) {
// If Eye-Fi is available, use Eye-Fi default folder
PreferenceUtil.setSharedPreferenceString(R.string.key_folder_input,
context.getString(R.string.pref_default_folder_input_eyefi));
}
else {
// Otherwise, use normal default folder.
PreferenceUtil.setSharedPreferenceString(R.string.key_folder_input,
context.getString(R.string.pref_default_folder_input));
}
}
for (int id : PATH_RESOURCES) {
String path = PreferenceUtil.getSharedPreferenceString(id);
String mappedPath = DirectorySelectionPreference.replaceSpecialFolderTags(path);
if (!path.equals(mappedPath)) {
PreferenceUtil.setSharedPreferenceString(id, mappedPath);
}
}
// Setting for full resolution setting and for max bitmap size - dependent on available memory.
PreferenceUtil.setDefaultResolutionSettings();
// Setting for camera API - dependent on OS version.
PreferenceUtil.setDefaultCameraSettings();
// Settings for overlay buttons.
PreferenceUtil.setDefaultOverlayButtonSettings();
// Do the initialization of hint settings
if (!PreferenceUtil.getSharedPreferenceBoolean(R.string.key_internal_initialized_hints)) {
boolean showTips = Boolean.parseBoolean(context.getString(R.string.pref_default_show_tips));
PreferenceUtil.setAllHints(!showTips);
// always show tips for first use
PreferenceUtil.setSharedPreferenceBoolean(R.string.key_tip_firstuse, false);
PreferenceUtil.setSharedPreferenceBoolean(R.string.key_internal_initialized_hints, true);
}
// Inform PinchImageView about maxBitmapSize
PinchImageView.setMaxBitmapSize(PreferenceUtil.getSharedPreferenceIntString(R.string.key_max_bitmap_size, 0));
}
@Override
public final void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Google Billing is started by Fragment, but on Activity level!
GoogleBillingHelper.handleActivityResult(requestCode, resultCode, data);
}
@Override
public final void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
if (requestCode == SettingsFragment.REQUEST_CODE_PERMISSION) {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
mFragment.initializeGoogleBilling();
}
}
}
}