package com.mareksebera.simpledilbert.preferences; import android.Manifest; import android.app.AlertDialog; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.mareksebera.simpledilbert.R; import com.mareksebera.simpledilbert.core.DilbertFragmentActivity; import com.mareksebera.simpledilbert.picker.FolderPickerActivity; import com.mareksebera.simpledilbert.widget.WidgetProvider; import java.io.File; import java.io.InputStream; import java.util.Map; import static android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE; import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID; import static android.appwidget.AppWidgetManager.getInstance; public final class DilbertPreferencesActivity extends AppCompatActivity { private static final int REQUEST_DOWNLOAD_TARGET = 1; private static final String TAG = "DilbertPreferencesAct"; private final OnClickListener licenseOnClickListener = new OnClickListener() { @Override public void onClick(View v) { showLicenseDialog(); } }; private final OnClickListener authorOnClickListener = new OnClickListener() { @Override public void onClick(View v) { Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto", "marek@msebera.cz", null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Simple Dilbert"); startActivity(Intent.createChooser(emailIntent, "Simple Dilbert")); } }; private CheckBox force_landscape, force_dark, hide_toolbars, share_image, reverse_landscape, open_at_latest_strip, widget_always_show_latest; private TextView download_path; private Button export_urls; private DilbertPreferences preferences; private final OnClickListener downloadPathClickListener = new OnClickListener() { @Override public void onClick(View v) { if (!isStoragePermissionGranted()) { Toast.makeText(DilbertPreferencesActivity.this, "Storage permission denied, cannot continue", Toast.LENGTH_LONG).show(); return; } Intent downloadPathSelector = new Intent( DilbertPreferencesActivity.this, FolderPickerActivity.class); downloadPathSelector.setData(Uri.fromFile(new File(preferences.getDownloadTarget()))); startActivityForResult(downloadPathSelector, REQUEST_DOWNLOAD_TARGET); } }; private final OnClickListener defaultZoomLevelClickListener = new OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(DilbertPreferencesActivity.this) .setTitle(R.string.pref_default_zoom_level) .setSingleChoiceItems(new CharSequence[]{"Minimum", "Medium", "Maximum"}, preferences.getDefaultZoomLevel(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { preferences.setDefaultZoomLevel(which); } }) .setCancelable(true) .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create() .show(); } }; private final OnClickListener exportUrlsListener = new OnClickListener() { @Override public void onClick(View v) { StringBuilder sb = new StringBuilder(); for (Map.Entry e : preferences.getCachedUrls().entrySet()) { sb.append(String.format("%s :: %s\n", e.getKey(), e.getValue())); } Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here"); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, sb.toString()); startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.menu_share))); } }; protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode != REQUEST_DOWNLOAD_TARGET) { super.onActivityResult(requestCode, resultCode, data); return; } if (resultCode != RESULT_OK) return; if (data != null) { Uri path = data.getData(); if (path != null) { preferences.setDownloadTarget(new File(path.getPath()).getAbsolutePath()); } } } private CharSequence getLicenseText() { String rtn = ""; try { InputStream stream = getAssets().open("LICENSE.txt"); java.util.Scanner s = new java.util.Scanner(stream) .useDelimiter("\\A"); rtn = s.hasNext() ? s.next() : ""; } catch (Exception | Error e) { Log.e(TAG, "License couldn't be retrieved", e); } return rtn; } private void showLicenseDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.apache_license_2_0); builder.setMessage(getLicenseText()); builder.setNeutralButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } @Override protected void onCreate(Bundle savedInstanceState) { preferences = new DilbertPreferences(this); if (preferences.isForceLandscape()) setRequestedOrientation(preferences.getLandscapeOrientation()); setTheme(preferences.isDarkLayoutEnabled() ? R.style.AppThemeDark : R.style.AppThemeLight); super.onCreate(savedInstanceState); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } setContentView(R.layout.preferences); setTitle(R.string.title_preferences); force_landscape = (CheckBox) findViewById(R.id.pref_force_landscape); force_dark = (CheckBox) findViewById(R.id.pref_force_dark_background); hide_toolbars = (CheckBox) findViewById(R.id.pref_hide_toolbars); share_image = (CheckBox) findViewById(R.id.pref_share_image); download_path = (TextView) findViewById(R.id.pref_download_path); reverse_landscape = (CheckBox) findViewById(R.id.pref_reverse_landscape); open_at_latest_strip = (CheckBox) findViewById(R.id.pref_open_at_latest_strip); widget_always_show_latest = (CheckBox) findViewById(R.id.pref_widget_always_latest); export_urls = (Button) findViewById(R.id.pref_export_urls); TextView default_zoom_level = (TextView) findViewById(R.id.pref_default_zoom_level); TextView author = (TextView) findViewById(R.id.app_author); LinearLayout download_path_layout = (LinearLayout) findViewById(R.id.pref_download_path_layout); TextView license = (TextView) findViewById(R.id.pref_show_license); default_zoom_level.setOnClickListener(defaultZoomLevelClickListener); download_path_layout.setOnClickListener(downloadPathClickListener); license.setOnClickListener(licenseOnClickListener); author.setOnClickListener(authorOnClickListener); force_landscape.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { reverse_landscape.setEnabled(isChecked); reverse_landscape.setChecked(reverse_landscape.isChecked() && isChecked); } }); export_urls.setOnClickListener(exportUrlsListener); } @Override public void onBackPressed() { startActivity(new Intent(this, DilbertFragmentActivity.class)); finish(); } @Override protected void onResume() { super.onResume(); force_landscape.setChecked(preferences.isForceLandscape()); force_dark.setChecked(preferences.isDarkLayoutEnabled()); hide_toolbars.setChecked(preferences.isToolbarsHidden()); download_path.setText(preferences.getDownloadTarget()); share_image.setChecked(preferences.isSharingImage()); reverse_landscape.setVisibility(Build.VERSION.SDK_INT >= 9 ? View.VISIBLE : View.GONE); reverse_landscape.setEnabled(preferences.isForceLandscape()); reverse_landscape.setChecked(preferences.isReversedLandscape() && preferences.isForceLandscape()); open_at_latest_strip.setChecked(preferences.isShouldOpenAtLatestStrip()); widget_always_show_latest.setChecked(preferences.isWidgetAlwaysShowLatest()); export_urls.setEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onPause() { super.onPause(); preferences.setIsDarkLayoutEnabled(force_dark.isChecked()); preferences.setIsForceLandscape(force_landscape.isChecked()); preferences.setIsToolbarsHidden(hide_toolbars.isChecked()); preferences.setIsSharingImage(share_image.isChecked()); preferences.setIsReversedLandscape(reverse_landscape.isChecked()); preferences.setShouldOpenAtLatestStrip(open_at_latest_strip.isChecked()); preferences.setWidgetAlwaysShowLatest(widget_always_show_latest.isChecked()); export_urls.setEnabled(false); updateWidgets(); } private void updateWidgets() { try { AppWidgetManager awm = getInstance(this); int[] ids = awm == null ? new int[0] : awm.getAppWidgetIds( new ComponentName(this, WidgetProvider.class)); if (ids != null) for (int id : ids) { Intent updateIntent = new Intent(); updateIntent .setAction(ACTION_APPWIDGET_UPDATE); updateIntent.putExtra(EXTRA_APPWIDGET_ID, id); sendBroadcast(updateIntent); } } catch (Throwable e) { e.printStackTrace(); } } private boolean isStoragePermissionGranted() { if (Build.VERSION.SDK_INT >= 23) { if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Log.v(TAG, "Permission is granted"); return true; } else { Log.v(TAG, "Permission is revoked"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); return false; } } else { //permission is automatically granted on sdk<23 upon installation Log.v(TAG, "Permission is granted"); return true; } } }