package click.dummer.textthing; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.Typeface; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import static android.Manifest.*; public class MainActivity extends AppCompatActivity { private static final String PROJECT_LINK = "http://no-go.github.io/TextThing/"; private static final String PROJECT2_LINK = "http://style64.org/c64-truetype"; public static final int FILEREQCODE = 1234; private SharedPreferences mPreferences; private boolean isMono; private boolean autoSave; private boolean fromExtern; private int themeNr; private Uri data = null; private TextView contentView; private Button btn; private PopupMenu popup; private ViewGroup mainView; private Typeface c64Font; private Typeface intuitiveFont; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); fromExtern = false; contentView = (TextView) findViewById(R.id.editText); mainView = (ViewGroup) findViewById(R.id.mainView); btn = (Button) findViewById(R.id.optnBtn); float fontSize = mPreferences.getFloat(App.PREF_Size, App.DEFAULT_Size); isMono = mPreferences.getBoolean(App.PREF_Mono, App.DEFAULT_Mono); autoSave = mPreferences.getBoolean(App.PREF_AutoSave, App.DEFAULT_AutoSave); themeNr = mPreferences.getInt(App.PREF_Theme, App.DEFAULT_Theme); contentView.setTextSize(fontSize); c64Font = Typeface.createFromAsset(getAssets(), "fonts/c64pro_mono.ttf"); intuitiveFont = Typeface.createFromAsset(getAssets(), "fonts/intuitive.ttf"); if (isMono == true) { contentView.setTypeface(Typeface.MONOSPACE); } else { contentView.setTypeface(Typeface.SANS_SERIF); } switch (themeNr) { case 1: themeDay(); break; case 2: themeNight(); break; case 3: themeC64(); break; case 4: themeGreen(); break; case 5: themePanther(); break; default: themeRetro(); break; } popup = new PopupMenu(MainActivity.this, btn); popup.dismiss(); popup.getMenuInflater().inflate(R.menu.pref, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { float fontSize = mPreferences.getFloat(App.PREF_Size, App.DEFAULT_Size); switch (item.getItemId()) { case R.id.smallerSize: fontSize = fontSize * 0.9f; break; case R.id.biggerSize: fontSize = fontSize * 1.1f; break; case R.id.monoStyle: if (item.isChecked() == false) { item.setChecked(true); isMono = true; contentView.setTypeface(Typeface.MONOSPACE); } else { item.setChecked(false); isMono = false; contentView.setTypeface(Typeface.SANS_SERIF); } break; case R.id.autoSave: if (item.isChecked() == false) { item.setChecked(true); autoSave = true; } else { item.setChecked(false); autoSave = false; } break; case R.id.theme_retro: item.setChecked(true); themeRetro(); break; case R.id.theme_c64: item.setChecked(true); themeC64(); break; case R.id.theme_day: item.setChecked(true); themeDay(); break; case R.id.theme_night: item.setChecked(true); themeNight(); break; case R.id.theme_green: item.setChecked(true); themeGreen(); break; case R.id.theme_panther: item.setChecked(true); themePanther(); break; case R.id.fileSelect: Intent intentFileChooser = new Intent() .setType(Intent.normalizeMimeType("text/*")) .setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intentFileChooser, getString(R.string.open)), FILEREQCODE); break; case R.id.action_project: Intent intentProj = new Intent(Intent.ACTION_VIEW, Uri.parse(PROJECT_LINK)); startActivity(intentProj); break; case R.id.action_project2: Intent intentProj2 = new Intent(Intent.ACTION_VIEW, Uri.parse(PROJECT2_LINK)); startActivity(intentProj2); break; default: return false; } contentView.setTextSize(fontSize); SharedPreferences.Editor editor = mPreferences.edit(); editor.putFloat(App.PREF_Size, fontSize); editor.putBoolean(App.PREF_Mono, isMono); editor.putBoolean(App.PREF_AutoSave, autoSave); editor.putInt(App.PREF_Theme, themeNr); editor.commit(); Intent i = new Intent("click.dummer.textthing.widget.UPDATE"); sendBroadcast(i); return true; } }); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MenuItem mi = popup.getMenu().findItem(R.id.monoStyle); MenuItem mi0 = popup.getMenu().findItem(R.id.theme_retro); MenuItem mi1 = popup.getMenu().findItem(R.id.theme_day); MenuItem mi2 = popup.getMenu().findItem(R.id.theme_night); MenuItem mi3 = popup.getMenu().findItem(R.id.autoSave); MenuItem mi4 = popup.getMenu().findItem(R.id.theme_c64); MenuItem mi5 = popup.getMenu().findItem(R.id.theme_green); MenuItem mi6 = popup.getMenu().findItem(R.id.theme_panther); if (themeNr == 0) mi0.setChecked(true); if (themeNr == 1) mi1.setChecked(true); if (themeNr == 2) mi2.setChecked(true); if (themeNr == 3) mi4.setChecked(true); if (themeNr == 4) mi5.setChecked(true); if (themeNr == 5) mi6.setChecked(true); mi.setChecked(isMono); mi3.setChecked(autoSave); popup.show(); } }); Intent intent = getIntent(); data = intent.getData(); if (data != null) { fromExtern = true; Log.d(App.PACKAGE_NAME, "intent.getData() is not Null - Use App via filemanager?"); try { InputStream input = getContentResolver().openInputStream(data); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input)); String text = ""; while (bufferedReader.ready()) { text += bufferedReader.readLine() + "\n"; } contentView.setText(text); } catch (Exception e) { e.printStackTrace(); } } else { // opening App without a filemanager and use the default file fromExtern = false; Log.d(App.PACKAGE_NAME, "intent.getData() is Null - use App with default File"); if (PermissionUtils.readGranted(this)) { loadNow(); } else { String[] permissions = new String[]{permission.READ_EXTERNAL_STORAGE, permission.WRITE_EXTERNAL_STORAGE}; PermissionUtils.requestPermissions(this, App.READ_PERMISSION_REQ, permissions); } } } void themeRetro() { themeNr = 0; mainView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.LightRetro) ); btn.setTextColor(Color.WHITE); contentView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.DarkRetro) ); contentView.setTextColor( ContextCompat.getColor(getApplicationContext(), R.color.LightRetro) ); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor( ContextCompat.getColor(getApplicationContext(), R.color.LightRetro) ); } if (isMono) { contentView.setTypeface(Typeface.MONOSPACE); btn.setTypeface(Typeface.MONOSPACE); } else { contentView.setTypeface(Typeface.SANS_SERIF); btn.setTypeface(Typeface.SANS_SERIF); } } void themeDay() { themeNr = 1; mainView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.MiddleDay) ); btn.setTextColor(Color.WHITE); contentView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.DarkDay) ); contentView.setTextColor( ContextCompat.getColor(getApplicationContext(), R.color.LightDay) ); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor( ContextCompat.getColor(getApplicationContext(), R.color.LightDay) ); } if (isMono) { contentView.setTypeface(Typeface.MONOSPACE); btn.setTypeface(Typeface.MONOSPACE); } else { contentView.setTypeface(Typeface.SANS_SERIF); btn.setTypeface(Typeface.SANS_SERIF); } } void themeNight() { themeNr = 2; mainView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.MiddleNight) ); btn.setTextColor(Color.GRAY); contentView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.DarkNight) ); contentView.setTextColor( ContextCompat.getColor(getApplicationContext(), R.color.LightNight) ); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor( ContextCompat.getColor(getApplicationContext(), R.color.LightNight) ); } if (isMono) { contentView.setTypeface(Typeface.MONOSPACE); btn.setTypeface(Typeface.MONOSPACE); } else { contentView.setTypeface(Typeface.SANS_SERIF); btn.setTypeface(Typeface.SANS_SERIF); } } void themeC64() { themeNr = 3; isMono = true; contentView.setTypeface(Typeface.MONOSPACE); mainView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.LightRetro) ); btn.setTextColor(Color.WHITE); contentView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.DarkRetro) ); contentView.setTextColor( ContextCompat.getColor(getApplicationContext(), R.color.LightRetro) ); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor( ContextCompat.getColor(getApplicationContext(), R.color.LightRetro) ); } contentView.setTypeface(c64Font); btn.setTypeface(c64Font); } void themeGreen() { themeNr = 4; isMono = true; contentView.setTypeface(Typeface.MONOSPACE); mainView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.LightGreen) ); btn.setTextColor(Color.WHITE); contentView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.DarkGreen) ); contentView.setTextColor( ContextCompat.getColor(getApplicationContext(), R.color.LightGreen) ); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor( ContextCompat.getColor(getApplicationContext(), R.color.LightGreen) ); } contentView.setTypeface(c64Font); btn.setTypeface(c64Font); } void themePanther() { themeNr = 5; isMono = true; contentView.setTypeface(Typeface.MONOSPACE); mainView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.LightPanther) ); btn.setTextColor(Color.BLACK); contentView.setBackgroundColor( ContextCompat.getColor(getApplicationContext(), R.color.DarkPanther) ); contentView.setTextColor( ContextCompat.getColor(getApplicationContext(), R.color.LightPanther) ); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor( ContextCompat.getColor(getApplicationContext(), R.color.MiddlePanther) ); } contentView.setTypeface(intuitiveFont); btn.setTypeface(intuitiveFont); } @Override protected void onPause() { super.onPause(); Log.d(App.PACKAGE_NAME, "onPause()"); if (data != null && autoSave && !fromExtern && PermissionUtils.writeGranted(this)) { String path = data.getPath(); if (path != null) { try { path = PathUtil.getPath(getApplicationContext(), data); File file = new File(path); FileOutputStream fos = new FileOutputStream(file); fos.write(contentView.getText().toString().getBytes()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); Toast.makeText( getApplicationContext(), getString(R.string.errWrite) + "\n" + path, Toast.LENGTH_LONG ).show(); } } } } @Override protected void onResume() { super.onResume(); Log.d(App.PACKAGE_NAME, "onResume()"); if (data != null && autoSave && !fromExtern && PermissionUtils.readGranted(this)) { String path = data.getPath(); if (path != null) { try { path = PathUtil.getPath(getApplicationContext(), data); File file = new File(path); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(new FileInputStream(file)) ); String text = ""; while (bufferedReader.ready()) { text += bufferedReader.readLine() + "\n"; } contentView.setText(text); } catch (Exception e) { e.printStackTrace(); Toast.makeText( getApplicationContext(), getString(R.string.errRead) + "\n" + path, Toast.LENGTH_LONG ).show(); } } } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); final TextView textBox = (TextView) findViewById(R.id.editText); CharSequence userText = textBox.getText(); outState.putCharSequence("savedText", userText); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); final TextView textBox = (TextView) findViewById(R.id.editText); CharSequence userText = savedInstanceState.getCharSequence("savedText"); textBox.setText(userText); } public void clickSaveButton(View v) { if (PermissionUtils.writeGranted(this)) { saveNow(); } else { String[] permissions = new String[]{permission.WRITE_EXTERNAL_STORAGE, permission.READ_EXTERNAL_STORAGE}; PermissionUtils.requestPermissions(this, App.WRITE_PERMISSION_REQ, permissions); } } void saveNow() { if (data != null) { File file = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { file = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), App.PACKAGE_NAME ); } else { file = new File(Environment.getExternalStorageDirectory() + "/Documents/"+App.PACKAGE_NAME); } String path = file.getPath() + App.NOTE_FILENAME; try { if (!file.exists()) { Log.d(App.PACKAGE_NAME, "on save mkdirs()"); file.mkdirs(); } file = new File(path); if (!file.exists()) file.createNewFile(); } catch (Exception e) { Toast.makeText( getApplicationContext(), getString(R.string.errAccess) + "\n" + data.getPath(), Toast.LENGTH_LONG ).show(); } path = data.getPath(); if (path != null) { try { Log.d(App.PACKAGE_NAME, "saveNow()"); path = PathUtil.getPath(getApplicationContext(), data); file = new File(path); FileOutputStream fos = new FileOutputStream(file); fos.write(contentView.getText().toString().getBytes()); fos.flush(); fos.close(); Toast.makeText( getApplicationContext(), getString(R.string.ok) + "\n" + data.getPath(), Toast.LENGTH_SHORT ).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText( getApplicationContext(), getString(R.string.errWrite) + "\n" + path, Toast.LENGTH_LONG ).show(); } } Intent i = new Intent("click.dummer.textthing.widget.UPDATE"); sendBroadcast(i); } } void loadNow() { File file = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { file = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), App.PACKAGE_NAME ); } else { file = new File(Environment.getExternalStorageDirectory() + "/Documents/"+App.PACKAGE_NAME); } String path = file.getPath() + App.NOTE_FILENAME; try { if (!file.exists()) { Log.d(App.PACKAGE_NAME, "on load mkdirs()"); file.mkdirs(); } file = new File(path); if (!file.exists()) file.createNewFile(); data = Uri.fromFile(file); path = data.getPath(); if (path != null) { try { Log.d(App.PACKAGE_NAME, "loadNow()"); path = PathUtil.getPath(getApplicationContext(), data); file = new File(path); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(new FileInputStream(file)) ); String text = ""; while (bufferedReader.ready()) { text += bufferedReader.readLine() + "\n"; } contentView.setText(text); } catch (Exception e) { e.printStackTrace(); Toast.makeText( getApplicationContext(), getString(R.string.errRead) + "\n" + path, Toast.LENGTH_LONG ).show(); } } } catch (Exception e) { if (data != null) { Toast.makeText( getApplicationContext(), getString(R.string.errAccess) + "\n" + data.getPath(), Toast.LENGTH_LONG ).show(); } else { Toast.makeText( getApplicationContext(), getString(R.string.errAccess), Toast.LENGTH_LONG ).show(); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { boolean granted = false; switch (requestCode) { case App.READ_PERMISSION_REQ: granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; if (granted) { loadNow(); } else { //nobody knows what to do } break; case App.WRITE_PERMISSION_REQ: granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; if (granted) { saveNow(); } else { //nobody knows what to do } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if(requestCode == FILEREQCODE && resultCode == RESULT_OK) { if (intent != null) { data = intent.getData(); fromExtern = true; Log.d(App.PACKAGE_NAME, "intent.getData() is not Null - Use App via filemanager?"); try { InputStream input = getContentResolver().openInputStream(data); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input)); String text = ""; while (bufferedReader.ready()) { text += bufferedReader.readLine() + "\n"; } contentView.setText(text); } catch (Exception e) { e.printStackTrace(); } } } } }