ActionBar
to implement the recommended
- * design for navigation drawers.
- */
- protected ActionBarDrawerToggle mDrawerToggle;
- /*
- * The Drawer Layout
- */
- protected DrawerLayout mDrawerLayout;
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_home);
- // setup the navigation drawer
- setupNavigationDrawer();
- // Replace fragment
- getFragmentManager()
- .beginTransaction()
- .replace(R.id.fragment_editor, new NoFileOpenedFragment())
- .commit();
- /* First Time we open this activity */
- if (savedInstanceState == null) {
- // Open
- mDrawerLayout.openDrawer(Gravity.START);
- // Set the default title
- getActionBar().setTitle(getString(R.string.nome_app_turbo_editor));
- }
- // parse the intent
- parseIntent(getIntent());
- // show a dialog with the changelog
- showChangeLog();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected final void onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- mDrawerToggle.syncState();
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onResume() {
- super.onResume();
- // Register the Event Bus for events
- EventBus.getDefault().register(this);
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onPause() {
- super.onPause();
- // Unregister the Event Bus
- EventBus.getDefault().unregister(this);
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onDestroy() {
- try {
- closeKeyBoard();
- } catch (NullPointerException e) {
- Log.e(TAG, e.getMessage(), e);
- }
- super.onDestroy();
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public final void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- mDrawerToggle.onConfigurationChanged(newConfig);
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_home, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- /* If we clicked on the Navigation Drawer Menu item */
- if (mDrawerToggle.onOptionsItemSelected(item)) {
- return true;
- } else switch (item.getItemId()) {
- case R.id.im_open:
- startActivityForResult(new Intent(HomeActivity.this, SelectFileActivity.class)
- .putExtra("path", "")
- .putExtra("action", SelectFileActivity.Actions.SelectFile),
- SELECT_FILE_CODE);
- return true;
- case R.id.im_info:
- startActivity(new Intent(this, PreferenceAbout.class));
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK && requestCode == SELECT_FILE_CODE) {
- String path = data.getStringExtra("path");
- if (!TextUtils.isEmpty(path)) {
- EventBus.getDefault().postSticky(new NewFileOpened(path));
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- parseIntent(intent);
- }
-
- /**
- * @param event
- */
- public void onEvent(FileSelectedEvent event) {
- // Close the drawer
- mDrawerLayout.closeDrawer(Gravity.LEFT);
- // Replace fragment
- getFragmentManager()
- .beginTransaction()
- .replace(R.id.fragment_editor, EditorFragment.newInstance(event.getPath()))
- .commit();
- }
-
- /**
- * When a file is saved
- * Invoked by the EditorFragment
- *
- * @param event The event called
- */
- public void onEvent(FileSavedEvent event) {
- try {
- closeKeyBoard();
- } catch (NullPointerException e) {
- Log.e(TAG, e.getMessage(), e);
- }
- // Get intent, action and MIME type
- final Intent intent = getIntent();
- final String action = intent.getAction();
- final String type = intent.getType();
-
- if (Intent.ACTION_VIEW.equals(action)
- || Intent.ACTION_EDIT.equals(action)
- || Intent.ACTION_PICK.equals(action)
- && type != null) {
- //This Activity was called by startActivityForResult
- final Intent returnIntent = new Intent();
- setResult(Activity.RESULT_OK, returnIntent);
- // finish the activity
- finish();
- } else {
- //This Activity was called by startActivity
- //
- mDrawerLayout.openDrawer(Gravity.LEFT);
- //
- getActionBar().setTitle(getString(R.string.nome_app_turbo_editor));
- // Replace fragment
- getFragmentManager()
- .beginTransaction()
- .replace(R.id.fragment_editor, new NoFileOpenedFragment())
- .commit();
- }
- }
-
- /**
- * When a file can't be opened
- * Invoked by the EditorFragment
- *
- * @param event The event called
- */
- public void onEvent(ErrorOpeningFileEvent event) {
- //
- mDrawerLayout.openDrawer(Gravity.LEFT);
- //
- getActionBar().setTitle(getString(R.string.nome_app_turbo_editor));
- // Replace fragment
- getFragmentManager()
- .beginTransaction()
- .replace(R.id.fragment_editor, new NoFileOpenedFragment())
- .commit();
- }
-
- private void closeKeyBoard() throws NullPointerException {
- // Central system API to the overall input method framework (IMF) architecture
- InputMethodManager inputManager =
- (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-
- // Base interface for a remotable object
- IBinder windowToken = getCurrentFocus().getWindowToken();
-
- // Hide type
- int hideType = InputMethodManager.HIDE_NOT_ALWAYS;
-
- // Hide the KeyBoard
- inputManager.hideSoftInputFromWindow(windowToken, hideType);
- }
-
- /**
- * Setup the navigation drawer
- */
- private void setupNavigationDrawer() {
- mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
- /* Action Bar */
- final ActionBar ab = getActionBar();
- ab.setDisplayHomeAsUpEnabled(true);
- ab.setHomeButtonEnabled(true);
- /* Navigation drawer */
- mDrawerToggle =
- new ActionBarDrawerToggle(
- this,
- mDrawerLayout,
- R.drawable.ic_drawer,
- R.string.nome_app_turbo_editor,
- R.string.nome_app_turbo_editor) {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onDrawerClosed(View view) {
- invalidateOptionsMenu();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void onDrawerOpened(View drawerView) {
- invalidateOptionsMenu();
- }
- };
- /* link the mDrawerToggle to the Drawer Layout */
- mDrawerLayout.setDrawerListener(mDrawerToggle);
- }
-
- /**
- * Show a dialog with the changelog
- */
- private void showChangeLog() {
- final String currentVersion = AppInfoHelper.getCurrentVersion(this);
- final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
- final String lastVersion = preferences.getString("last_version", currentVersion);
- preferences.edit().putString("last_version", currentVersion).commit();
- if (!lastVersion.equals(currentVersion)) {
- ChangelogDialogFragment.showChangeLogDialog(getFragmentManager());
- }
- }
-
- /**
- * Parses the intent
- */
- private void parseIntent(Intent intent) {
- final String action = intent.getAction();
- final String type = intent.getType();
-
- if (Intent.ACTION_VIEW.equals(action)
- || Intent.ACTION_EDIT.equals(action)
- || Intent.ACTION_PICK.equals(action)
- && type != null) {
- // Post the NewFileOpened Event
- EventBus.getDefault().postSticky(new NewFileOpened(intent.getData().getPath()));
- }
- }
-}
diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/activity/LicensesActivity.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/activity/LicensesActivity.java
deleted file mode 100644
index 455b9ed..0000000
--- a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/activity/LicensesActivity.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.vmihalachi.turboeditor.activity;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import com.vmihalachi.turboeditor.R;
-
-public class LicensesActivity extends Activity implements AdapterView.OnItemClickListener {
-
-
- /**
- * {@inheritDoc}
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_licenses);
- ListView listView = (ListView) findViewById(android.R.id.list);
- listView.setOnItemClickListener(this);
- ArrayAdapterMust be a color value, in the form of "#rgb
", "#argb
",
+"#rrggbb
", or "#aarrggbb
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int color=0x7f010001;
+ /**
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int drawable=0x7f010000;
+ /**
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowColor=0x7f010005;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowDx=0x7f010003;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowDy=0x7f010004;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowRadius=0x7f010002;
+ }
+ public static final class styleable {
+ /** Attributes that can be used with a FloatingActionButton.
+
Includes the following attributes:
+Attribute | Description |
---|---|
{@link #FloatingActionButton_color com.faizmalkani.floatingactionbutton:color} | |
{@link #FloatingActionButton_drawable com.faizmalkani.floatingactionbutton:drawable} | |
{@link #FloatingActionButton_shadowColor com.faizmalkani.floatingactionbutton:shadowColor} | |
{@link #FloatingActionButton_shadowDx com.faizmalkani.floatingactionbutton:shadowDx} | |
{@link #FloatingActionButton_shadowDy com.faizmalkani.floatingactionbutton:shadowDy} | |
{@link #FloatingActionButton_shadowRadius com.faizmalkani.floatingactionbutton:shadowRadius} |
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#color} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a color value, in the form of "#rgb
", "#argb
",
+"#rrggbb
", or "#aarrggbb
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:color
+ */
+ public static final int FloatingActionButton_color = 1;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#drawable} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:drawable
+ */
+ public static final int FloatingActionButton_drawable = 0;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowColor} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowColor
+ */
+ public static final int FloatingActionButton_shadowColor = 5;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowDx} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowDx
+ */
+ public static final int FloatingActionButton_shadowDx = 3;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowDy} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowDy
+ */
+ public static final int FloatingActionButton_shadowDy = 4;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowRadius} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowRadius
+ */
+ public static final int FloatingActionButton_shadowRadius = 2;
+ };
+}
diff --git a/libraries/FloatingActionButton/build/generated/source/r/release/com/faizmalkani/floatingactionbutton/R.java b/libraries/FloatingActionButton/build/generated/source/r/release/com/faizmalkani/floatingactionbutton/R.java
new file mode 100644
index 0000000..99ce2ea
--- /dev/null
+++ b/libraries/FloatingActionButton/build/generated/source/r/release/com/faizmalkani/floatingactionbutton/R.java
@@ -0,0 +1,173 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package com.faizmalkani.floatingactionbutton;
+
+public final class R {
+ public static final class attr {
+ /**
Must be a color value, in the form of "#rgb
", "#argb
",
+"#rrggbb
", or "#aarrggbb
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int color=0x7f010001;
+ /**
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int drawable=0x7f010000;
+ /**
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowColor=0x7f010005;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowDx=0x7f010003;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowDy=0x7f010004;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static int shadowRadius=0x7f010002;
+ }
+ public static final class styleable {
+ /** Attributes that can be used with a FloatingActionButton.
+
Includes the following attributes:
+Attribute | Description |
---|---|
{@link #FloatingActionButton_color com.faizmalkani.floatingactionbutton:color} | |
{@link #FloatingActionButton_drawable com.faizmalkani.floatingactionbutton:drawable} | |
{@link #FloatingActionButton_shadowColor com.faizmalkani.floatingactionbutton:shadowColor} | |
{@link #FloatingActionButton_shadowDx com.faizmalkani.floatingactionbutton:shadowDx} | |
{@link #FloatingActionButton_shadowDy com.faizmalkani.floatingactionbutton:shadowDy} | |
{@link #FloatingActionButton_shadowRadius com.faizmalkani.floatingactionbutton:shadowRadius} |
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#color} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a color value, in the form of "#rgb
", "#argb
",
+"#rrggbb
", or "#aarrggbb
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:color
+ */
+ public static final int FloatingActionButton_color = 1;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#drawable} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:drawable
+ */
+ public static final int FloatingActionButton_drawable = 0;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowColor} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowColor
+ */
+ public static final int FloatingActionButton_shadowColor = 5;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowDx} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowDx
+ */
+ public static final int FloatingActionButton_shadowDx = 3;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowDy} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowDy
+ */
+ public static final int FloatingActionButton_shadowDy = 4;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.R.attr#shadowRadius} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton:shadowRadius
+ */
+ public static final int FloatingActionButton_shadowRadius = 2;
+ };
+}
diff --git a/libraries/FloatingActionButton/build/generated/source/r/test/debug/com/faizmalkani/floatingactionbutton/R.java b/libraries/FloatingActionButton/build/generated/source/r/test/debug/com/faizmalkani/floatingactionbutton/R.java
new file mode 100644
index 0000000..3dec0c8
--- /dev/null
+++ b/libraries/FloatingActionButton/build/generated/source/r/test/debug/com/faizmalkani/floatingactionbutton/R.java
@@ -0,0 +1,27 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+package com.faizmalkani.floatingactionbutton;
+
+public final class R {
+ public static final class attr {
+ public static final int color = 0x7f010001;
+ public static final int drawable = 0x7f010000;
+ public static final int shadowColor = 0x7f010005;
+ public static final int shadowDx = 0x7f010003;
+ public static final int shadowDy = 0x7f010004;
+ public static final int shadowRadius = 0x7f010002;
+ }
+ public static final class styleable {
+ public static final int[] FloatingActionButton = { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005 };
+ public static final int FloatingActionButton_color = 1;
+ public static final int FloatingActionButton_drawable = 0;
+ public static final int FloatingActionButton_shadowColor = 5;
+ public static final int FloatingActionButton_shadowDx = 3;
+ public static final int FloatingActionButton_shadowDy = 4;
+ public static final int FloatingActionButton_shadowRadius = 2;
+ }
+}
diff --git a/libraries/FloatingActionButton/build/generated/source/r/test/debug/com/faizmalkani/floatingactionbutton/test/R.java b/libraries/FloatingActionButton/build/generated/source/r/test/debug/com/faizmalkani/floatingactionbutton/test/R.java
new file mode 100644
index 0000000..b092092
--- /dev/null
+++ b/libraries/FloatingActionButton/build/generated/source/r/test/debug/com/faizmalkani/floatingactionbutton/test/R.java
@@ -0,0 +1,173 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package com.faizmalkani.floatingactionbutton.test;
+
+public final class R {
+ public static final class attr {
+ /**
Must be a color value, in the form of "#rgb
", "#argb
",
+"#rrggbb
", or "#aarrggbb
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static final int color=0x7f010001;
+ /**
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static final int drawable=0x7f010000;
+ /**
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static final int shadowColor=0x7f010005;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static final int shadowDx=0x7f010003;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static final int shadowDy=0x7f010004;
+ /**
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ */
+ public static final int shadowRadius=0x7f010002;
+ }
+ public static final class styleable {
+ /** Attributes that can be used with a FloatingActionButton.
+
Includes the following attributes:
+Attribute | Description |
---|---|
{@link #FloatingActionButton_color com.faizmalkani.floatingactionbutton.test:color} | |
{@link #FloatingActionButton_drawable com.faizmalkani.floatingactionbutton.test:drawable} | |
{@link #FloatingActionButton_shadowColor com.faizmalkani.floatingactionbutton.test:shadowColor} | |
{@link #FloatingActionButton_shadowDx com.faizmalkani.floatingactionbutton.test:shadowDx} | |
{@link #FloatingActionButton_shadowDy com.faizmalkani.floatingactionbutton.test:shadowDy} | |
{@link #FloatingActionButton_shadowRadius com.faizmalkani.floatingactionbutton.test:shadowRadius} |
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.test.R.attr#color} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a color value, in the form of "#rgb
", "#argb
",
+"#rrggbb
", or "#aarrggbb
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton.test:color
+ */
+ public static final int FloatingActionButton_color = 1;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.test.R.attr#drawable} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton.test:drawable
+ */
+ public static final int FloatingActionButton_drawable = 0;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.test.R.attr#shadowColor} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be an integer value, such as "100
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton.test:shadowColor
+ */
+ public static final int FloatingActionButton_shadowColor = 5;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.test.R.attr#shadowDx} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton.test:shadowDx
+ */
+ public static final int FloatingActionButton_shadowDx = 3;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.test.R.attr#shadowDy} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton.test:shadowDy
+ */
+ public static final int FloatingActionButton_shadowDy = 4;
+ /**
+
This symbol is the offset where the {@link com.faizmalkani.floatingactionbutton.test.R.attr#shadowRadius} + attribute's value can be found in the {@link #FloatingActionButton} array. + + +
Must be a floating point value, such as "1.2
".
+
This may also be a reference to a resource (in the form
+" 升级到高级版 升级到高级版并支持开发其他很酷的功能。谢谢! Upgrade to Premium Upgrade to Premium and support the development of other cool features. Thank you! Upgrade to Premium Upgrade to Premium and support the development of other cool features. Thank you!@[package:]type:name
") or
+theme attribute (in the form
+"?[package:][type:]name
")
+containing a value of this type.
+ @attr name com.faizmalkani.floatingactionbutton.test:shadowRadius
+ */
+ public static final int FloatingActionButton_shadowRadius = 2;
+ };
+}
diff --git a/libraries/FloatingActionButton/build/intermediates/bundles/debug/AndroidManifest.xml b/libraries/FloatingActionButton/build/intermediates/bundles/debug/AndroidManifest.xml
new file mode 100644
index 0000000..3851bcf
--- /dev/null
+++ b/libraries/FloatingActionButton/build/intermediates/bundles/debug/AndroidManifest.xml
@@ -0,0 +1,14 @@
+
+boolean
which indicates whether or not the partition has been
+ * remounted as specified.
+ */
+ protected boolean remount(String file, String mountType) {
+
+ // if the path has a trailing slash get rid of it.
+ if (file.endsWith("/") && !file.equals("/")) {
+ file = file.substring(0, file.lastIndexOf("/"));
+ }
+ // Make sure that what we are trying to remount is in the mount list.
+ boolean foundMount = false;
+ while (!foundMount) {
+ try {
+ for (Mount mount : getMounts()) {
+ Log.d(RootCommands.TAG, mount.getMountPoint().toString());
+
+ if (file.equals(mount.getMountPoint().toString())) {
+ foundMount = true;
+ break;
+ }
+ }
+ } catch (Exception e) {
+ Log.e(RootCommands.TAG, "Exception", e);
+ return false;
+ }
+ if (!foundMount) {
+ try {
+ file = (new File(file).getParent()).toString();
+ } catch (Exception e) {
+ Log.e(RootCommands.TAG, "Exception", e);
+ return false;
+ }
+ }
+ }
+ Mount mountPoint = findMountPointRecursive(file);
+
+ Log.d(RootCommands.TAG, "Remounting " + mountPoint.getMountPoint().getAbsolutePath()
+ + " as " + mountType.toLowerCase(Locale.US));
+ final boolean isMountMode = mountPoint.getFlags().contains(mountType.toLowerCase(Locale.US));
+
+ if (!isMountMode) {
+ // grab an instance of the internal class
+ try {
+ SimpleCommand command = new SimpleCommand("busybox mount -o remount,"
+ + mountType.toLowerCase(Locale.US) + " " + mountPoint.getDevice().getAbsolutePath()
+ + " " + mountPoint.getMountPoint().getAbsolutePath(),
+ "toolbox mount -o remount," + mountType.toLowerCase(Locale.US) + " "
+ + mountPoint.getDevice().getAbsolutePath() + " "
+ + mountPoint.getMountPoint().getAbsolutePath(), "mount -o remount,"
+ + mountType.toLowerCase(Locale.US) + " "
+ + mountPoint.getDevice().getAbsolutePath() + " "
+ + mountPoint.getMountPoint().getAbsolutePath(),
+ "/system/bin/toolbox mount -o remount," + mountType.toLowerCase(Locale.US) + " "
+ + mountPoint.getDevice().getAbsolutePath() + " "
+ + mountPoint.getMountPoint().getAbsolutePath());
+
+ // execute on shell
+ shell.add(command).waitForFinish();
+
+ } catch (Exception e) {
+ }
+
+ mountPoint = findMountPointRecursive(file);
+ }
+
+ if (mountPoint != null) {
+ Log.d(RootCommands.TAG, mountPoint.getFlags() + " AND " + mountType.toLowerCase(Locale.US));
+ if (mountPoint.getFlags().contains(mountType.toLowerCase(Locale.US))) {
+ Log.d(RootCommands.TAG, mountPoint.getFlags().toString());
+ return true;
+ } else {
+ Log.d(RootCommands.TAG, mountPoint.getFlags().toString());
+ }
+ } else {
+ Log.d(RootCommands.TAG, "mountPoint is null");
+ }
+ return false;
+ }
+
+ private Mount findMountPointRecursive(String file) {
+ try {
+ ArrayListArrayList
an ArrayList of the class Mount.
+ * @throws Exception
+ * if we cannot return the mount points.
+ */
+ protected static ArrayList
+ * root 24736 1 12140 584 ffffffff 40010d14 S /data/data/org.adaway/files/blank_webserver
+ * ^\\S \\s ([0-9]+) .* processName $
+ *
+ */
+ psRegex = "^\\S+\\s+([0-9]+).*" + Pattern.quote(processName) + "$";
+ psPattern = Pattern.compile(psRegex);
+ }
+
+ public ArrayListtrue
if process was found and killed successfully
+ * @throws java.io.IOException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws BrokenBusyboxException
+ */
+ public boolean killAll(String processName) throws BrokenBusyboxException, TimeoutException,
+ IOException {
+ Log.d(RootCommands.TAG, "Killing process " + processName);
+
+ PsCommand psCommand = new PsCommand(processName);
+ shell.add(psCommand).waitForFinish();
+
+ // kill processes
+ if (!psCommand.getPids().isEmpty()) {
+ // example: kill -9 1234 1222 5343
+ SimpleCommand killCommand = new SimpleCommand("kill -9 "
+ + psCommand.getPidsString());
+ shell.add(killCommand).waitForFinish();
+
+ if (killCommand.getExitCode() == 0) {
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ Log.d(RootCommands.TAG, "No pid found! Nothing was killed!");
+ return false;
+ }
+ }
+
+ /**
+ * Kill a running executable
+ *
+ * See README for more information how to use your own executables!
+ *
+ * @param executableName
+ * @return
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public boolean killAllExecutable(String executableName) throws BrokenBusyboxException,
+ TimeoutException, IOException {
+ return killAll(ExecutableCommand.EXECUTABLE_PREFIX + executableName + ExecutableCommand.EXECUTABLE_SUFFIX);
+ }
+
+ /**
+ * This method can be used to to check if a process is running
+ *
+ * @param processName
+ * name of process to check
+ * @return true
if process was found
+ * @throws java.io.IOException
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * (Could not determine if the process is running)
+ */
+ public boolean isProcessRunning(String processName) throws BrokenBusyboxException,
+ TimeoutException, IOException {
+ PsCommand psCommand = new PsCommand(processName);
+ shell.add(psCommand).waitForFinish();
+
+ // if pids are available process is running!
+ if (!psCommand.getPids().isEmpty()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Checks if binary is running
+ *
+ * @param binaryName
+ * @return
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public boolean isBinaryRunning(String binaryName) throws BrokenBusyboxException,
+ TimeoutException, IOException {
+ return isProcessRunning(ExecutableCommand.EXECUTABLE_PREFIX + binaryName
+ + ExecutableCommand.EXECUTABLE_SUFFIX);
+ }
+
+ /**
+ * Ls command to get permissions or symlinks
+ */
+ private class LsCommand extends Command {
+ private String fileName;
+ private String permissionRegex;
+ private Pattern permissionPattern;
+ private String symlinkRegex;
+ private Pattern symlinkPattern;
+
+ private String symlink;
+ private String permissions;
+
+ public String getSymlink() {
+ return symlink;
+ }
+
+ public String getPermissions() {
+ return permissions;
+ }
+
+ public LsCommand(String file) {
+ super("ls -l " + file);
+
+ // get only filename:
+ this.fileName = (new File(file)).getName();
+ Log.d(RootCommands.TAG, "fileName: " + fileName);
+
+ /**
+ * regex to get pid out of ps line, example:
+ *
+ *
+ * with busybox:
+ * lrwxrwxrwx 1 root root 15 Aug 13 12:14 dev/stdin -> /proc/self/fd/0
+ *
+ * with toolbox:
+ * lrwxrwxrwx root root 15 Aug 13 12:14 stdin -> /proc/self/fd/0
+ *
+ * Regex:
+ * ^.*?(\\S{10}) .* $
+ *
+ */
+ permissionRegex = "^.*?(\\S{10}).*$";
+ permissionPattern = Pattern.compile(permissionRegex);
+
+ /**
+ * regex to get symlink
+ *
+ *
+ * -> /proc/self/fd/0
+ * ^.*?\\-\\> \\s+ (.*) $
+ *
+ */
+ symlinkRegex = "^.*?\\-\\>\\s+(.*)$";
+ symlinkPattern = Pattern.compile(symlinkRegex);
+ }
+
+ /**
+ * Converts permission string from ls command to numerical value. Example: -rwxrwxrwx gets
+ * to 777
+ *
+ * @param permissions
+ * @return
+ */
+ private String convertPermissions(String permissions) {
+ int owner = getGroupPermission(permissions.substring(1, 4));
+ int group = getGroupPermission(permissions.substring(4, 7));
+ int world = getGroupPermission(permissions.substring(7, 10));
+
+ return "" + owner + group + world;
+ }
+
+ /**
+ * Calculates permission for one group
+ *
+ * @param permission
+ * @return value of permission string
+ */
+ private int getGroupPermission(String permission) {
+ int value = 0;
+
+ if (permission.charAt(0) == 'r') {
+ value += 4;
+ }
+ if (permission.charAt(1) == 'w') {
+ value += 2;
+ }
+ if (permission.charAt(2) == 'x') {
+ value += 1;
+ }
+
+ return value;
+ }
+
+ @Override
+ public void output(int id, String line) {
+ // general check if line contains file
+ if (line.contains(fileName)) {
+
+ // try to match line exactly
+ try {
+ Matcher permissionMatcher = permissionPattern.matcher(line);
+ if (permissionMatcher.find()) {
+ permissions = convertPermissions(permissionMatcher.group(1));
+
+ Log.d(RootCommands.TAG, "Found permissions: " + permissions);
+ } else {
+ Log.d(RootCommands.TAG, "Permissions were not found in ls command!");
+ }
+
+ // try to parse for symlink
+ Matcher symlinkMatcher = symlinkPattern.matcher(line);
+ if (symlinkMatcher.find()) {
+ /*
+ * TODO: If symlink points to a file in the same directory the path is not
+ * absolute!!!
+ */
+ symlink = symlinkMatcher.group(1);
+ Log.d(RootCommands.TAG, "Symlink found: " + symlink);
+ } else {
+ Log.d(RootCommands.TAG, "No symlink found!");
+ }
+ } catch (Exception e) {
+ Log.e(RootCommands.TAG, "Error with regex!", e);
+ }
+ }
+ }
+
+ @Override
+ public void afterExecution(int id, int exitCode) {
+ }
+
+ }
+
+ /**
+ * @param file
+ * String that represent the file, including the full path to the file and its name.
+ * @param followSymlinks
+ * @return File permissions as String, for example: 777, returns null on error
+ * @throws java.io.IOException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws BrokenBusyboxException
+ *
+ */
+ public String getFilePermissions(String file) throws BrokenBusyboxException, TimeoutException,
+ IOException {
+ Log.d(RootCommands.TAG, "Checking permissions for " + file);
+
+ String permissions = null;
+
+ if (fileExists(file)) {
+ Log.d(RootCommands.TAG, file + " was found.");
+
+ LsCommand lsCommand = new LsCommand(file);
+ shell.add(lsCommand).waitForFinish();
+
+ permissions = lsCommand.getPermissions();
+ }
+
+ return permissions;
+ }
+
+ /**
+ * Sets permission of file
+ *
+ * @param file
+ * absolute path to file
+ * @param permissions
+ * String like 777
+ * @return true if command worked
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public boolean setFilePermissions(String file, String permissions)
+ throws BrokenBusyboxException, TimeoutException, IOException {
+ Log.d(RootCommands.TAG, "Set permissions of " + file + " to " + permissions);
+
+ SimpleCommand chmodCommand = new SimpleCommand("chmod " + permissions + " " + file);
+ shell.add(chmodCommand).waitForFinish();
+
+ if (chmodCommand.getExitCode() == 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * This will return a String that represent the symlink for a specified file.
+ *
+ * @param file
+ * The path to the file to get the Symlink for. (must have absolute path)
+ *
+ * @return A String that represent the symlink for a specified file or null if no symlink
+ * exists.
+ * @throws java.io.IOException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws BrokenBusyboxException
+ */
+ public String getSymlink(String file) throws BrokenBusyboxException, TimeoutException,
+ IOException {
+ Log.d(RootCommands.TAG, "Find symlink for " + file);
+
+ String symlink = null;
+
+ LsCommand lsCommand = new LsCommand(file);
+ shell.add(lsCommand).waitForFinish();
+
+ symlink = lsCommand.getSymlink();
+
+ return symlink;
+ }
+
+ /**
+ * Copys a file to a destination. Because cp is not available on all android devices, we use dd
+ * or cat.
+ *
+ * @param source
+ * example: /data/data/org.adaway/files/hosts
+ * @param destination
+ * example: /system/etc/hosts
+ * @param remountAsRw
+ * remounts the destination as read/write before writing to it
+ * @param preserveFileAttributes
+ * tries to copy file attributes from source to destination, if only cat is available
+ * only permissions are preserved
+ * @return true if it was successfully copied
+ * @throws BrokenBusyboxException
+ * @throws java.io.IOException
+ * @throws java.util.concurrent.TimeoutException
+ */
+ public boolean copyFile(String source, String destination, boolean remountAsRw,
+ boolean preservePermissions) throws BrokenBusyboxException, IOException,
+ TimeoutException {
+
+ /*
+ * dd can only copy files, but we can not check if the source is a file without invoking
+ * shell commands, because from Java we probably have no read access, thus we only check if
+ * they are ending with trailing slashes
+ */
+ if (source.endsWith("/") || destination.endsWith("/")) {
+ throw new FileNotFoundException("dd can only copy files!");
+ }
+
+ // remount destination as read/write before copying to it
+ if (remountAsRw) {
+ if (!remount(destination, "RW")) {
+ Log.d(RootCommands.TAG,
+ "Remounting failed! There is probably no need to remount this partition!");
+ }
+ }
+
+ // get permissions of source before overwriting
+ String permissions = null;
+ if (preservePermissions) {
+ permissions = getFilePermissions(source);
+ }
+
+ boolean commandSuccess = false;
+
+ SimpleCommand ddCommand = new SimpleCommand("dd if=" + source + " of="
+ + destination);
+ shell.add(ddCommand).waitForFinish();
+
+ if (ddCommand.getExitCode() == 0) {
+ commandSuccess = true;
+ } else {
+ // try cat if dd fails
+ SimpleCommand catCommand = new SimpleCommand("cat " + source + " > "
+ + destination);
+ shell.add(catCommand).waitForFinish();
+
+ if (catCommand.getExitCode() == 0) {
+ commandSuccess = true;
+ }
+ }
+
+ // set back permissions from source to destination
+ if (preservePermissions) {
+ setFilePermissions(destination, permissions);
+ }
+
+ // remount destination back to read only
+ if (remountAsRw) {
+ if (!remount(destination, "RO")) {
+ Log.d(RootCommands.TAG,
+ "Remounting failed! There is probably no need to remount this partition!");
+ }
+ }
+
+ return commandSuccess;
+ }
+
+ public static final int REBOOT_HOTREBOOT = 1;
+ public static final int REBOOT_REBOOT = 2;
+ public static final int REBOOT_SHUTDOWN = 3;
+ public static final int REBOOT_RECOVERY = 4;
+
+ /**
+ * Shutdown or reboot device. Possible actions are REBOOT_HOTREBOOT, REBOOT_REBOOT,
+ * REBOOT_SHUTDOWN, REBOOT_RECOVERY
+ *
+ * @param action
+ * @throws java.io.IOException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws BrokenBusyboxException
+ */
+ public void reboot(int action) throws BrokenBusyboxException, TimeoutException, IOException {
+ if (action == REBOOT_HOTREBOOT) {
+ killAll("system_server");
+ // or: killAll("zygote");
+ } else {
+ String command;
+ switch (action) {
+ case REBOOT_REBOOT:
+ command = "reboot";
+ break;
+ case REBOOT_SHUTDOWN:
+ command = "reboot -p";
+ break;
+ case REBOOT_RECOVERY:
+ command = "reboot recovery";
+ break;
+ default:
+ command = "reboot";
+ break;
+ }
+
+ SimpleCommand rebootCommand = new SimpleCommand(command);
+ shell.add(rebootCommand).waitForFinish();
+
+ if (rebootCommand.getExitCode() == -1) {
+ Log.e(RootCommands.TAG, "Reboot failed!");
+ }
+ }
+ }
+
+ /**
+ * This command checks if a file exists
+ */
+ private class FileExistsCommand extends Command {
+ private String file;
+ private boolean fileExists = false;
+
+ public FileExistsCommand(String file) {
+ super("ls " + file);
+ this.file = file;
+ }
+
+ public boolean isFileExists() {
+ return fileExists;
+ }
+
+ @Override
+ public void output(int id, String line) {
+ if (line.trim().equals(file)) {
+ fileExists = true;
+ }
+ }
+
+ @Override
+ public void afterExecution(int id, int exitCode) {
+ }
+
+ }
+
+ /**
+ * Use this to check whether or not a file exists on the filesystem.
+ *
+ * @param file
+ * String that represent the file, including the full path to the file and its name.
+ *
+ * @return a boolean that will indicate whether or not the file exists.
+ * @throws java.io.IOException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws BrokenBusyboxException
+ *
+ */
+ public boolean fileExists(String file) throws BrokenBusyboxException, TimeoutException,
+ IOException {
+ FileExistsCommand fileExistsCommand = new FileExistsCommand(file);
+ shell.add(fileExistsCommand).waitForFinish();
+
+ if (fileExistsCommand.isFileExists()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public abstract class WithPermissions {
+ abstract void whileHavingPermissions();
+ }
+
+ /**
+ * Execute user defined Java code while having temporary permissions on a file
+ *
+ * @param file
+ * @param withPermissions
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public void withPermission(String file, String permission, WithPermissions withPermissions)
+ throws BrokenBusyboxException, TimeoutException, IOException {
+ String oldPermissions = getFilePermissions(file);
+
+ // set permissions (If set to 666, then Dalvik VM can also write to that file!)
+ setFilePermissions(file, permission);
+
+ // execute user defined code
+ withPermissions.whileHavingPermissions();
+
+ // set back to old permissions
+ setFilePermissions(file, oldPermissions);
+ }
+
+ /**
+ * Execute user defined Java code while having temporary write permissions on a file using chmod
+ * 666
+ *
+ * @param file
+ * @param withWritePermissions
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public void withWritePermissions(String file, WithPermissions withWritePermissions)
+ throws BrokenBusyboxException, TimeoutException, IOException {
+ withPermission(file, "666", withWritePermissions);
+ }
+
+ /**
+ * Sets system clock using /dev/alarm
+ *
+ * @param millis
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public void setSystemClock(final long millis) throws BrokenBusyboxException, TimeoutException,
+ IOException {
+ withWritePermissions("/dev/alarm", new WithPermissions() {
+
+ @Override
+ void whileHavingPermissions() {
+ SystemClock.setCurrentTimeMillis(millis);
+ }
+ });
+ }
+
+ /**
+ * Adjust system clock by offset using /dev/alarm
+ *
+ * @param offset
+ * @throws BrokenBusyboxException
+ * @throws java.util.concurrent.TimeoutException
+ * @throws java.io.IOException
+ */
+ public void adjustSystemClock(final long offset) throws BrokenBusyboxException,
+ TimeoutException, IOException {
+ withWritePermissions("/dev/alarm", new WithPermissions() {
+
+ @Override
+ void whileHavingPermissions() {
+ SystemClock.setCurrentTimeMillis(System.currentTimeMillis() + offset);
+ }
+ });
+ }
+
+ /**
+ * This will take a path, which can contain the file name as well, and attempt to remount the
+ * underlying partition.
+ *
+ * For example, passing in the following string:
+ * "/system/bin/some/directory/that/really/would/never/exist" will result in /system ultimately
+ * being remounted. However, keep in mind that the longer the path you supply, the more work
+ * this has to do, and the slower it will run.
+ *
+ * @param file
+ * file path
+ * @param mountType
+ * mount type: pass in RO (Read only) or RW (Read Write)
+ * @return a boolean
which indicates whether or not the partition has been
+ * remounted as specified.
+ */
+ public boolean remount(String file, String mountType) {
+ // Recieved a request, get an instance of Remounter
+ Remounter remounter = new Remounter(shell);
+ // send the request
+ return (remounter.remount(file, mountType));
+ }
+
+ /**
+ * This will tell you how the specified mount is mounted. rw, ro, etc...
+ *
+ * @param The
+ * mount you want to check
+ *
+ * @return String
What the mount is mounted as.
+ * @throws Exception
+ * if we cannot determine how the mount is mounted.
+ */
+ public String getMountedAs(String path) throws Exception {
+ ArrayListActionBar
to implement the recommended
+ * design for navigation drawers.
+ */
+ private ActionBarDrawerToggle mDrawerToggle;
+ /*
+ * The Drawer Layout
+ */
+ private CustomDrawerLayout mDrawerLayout;
+
+ //region Activity facts
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ // set the windows background
+ ThemeHelper.setWindowsBackground(this);
+ // super!!
+ super.onCreate(savedInstanceState);
+ // setup the layout
+ setContentView(R.layout.activity_home);
+ // setup the navigation drawer
+ setupNavigationDrawer();
+ // Replace fragment
+ getFragmentManager()
+ .beginTransaction()
+ .replace(R.id.fragment_editor, new NoFileOpenedFragment())
+ .commit();
+ /* First Time we open this activity */
+ if (savedInstanceState == null) {
+ // Open
+ mDrawerLayout.openDrawer(Gravity.START);
+ // Set the default title
+ getActionBar().setTitle(getString(R.string.nome_app_turbo_editor));
+ }
+ // parse the intent
+ parseIntent(getIntent());
+ // show a dialog with the changelog
+ showChangeLog();
+ }
+
+
+ @Override
+ protected final void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ mDrawerToggle.syncState();
+ }
+
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Register the Event Bus for events
+ EventBus.getDefault().registerSticky(this);
+ }
+
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ // Unregister the Event Bus
+ EventBus.getDefault().unregister(this);
+ }
+
+
+ @Override
+ protected void onDestroy() {
+ try {
+ closeKeyBoard();
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (getFragmentManager().findFragmentById(R.id.fragment_editor) instanceof EditorFragment) {
+
+ // remove editor fragment
+ getFragmentManager()
+ .beginTransaction()
+ .replace(R.id.fragment_editor, new NoFileOpenedFragment())
+ .commit();
+ // Set the default title
+ getActionBar().setTitle(getString(R.string.nome_app_turbo_editor));
+
+ EventBus.getDefault().post(new EventBusEvents.ClosedAFile());
+
+ mDrawerLayout.openDrawer(Gravity.START);
+ mDrawerLayout.closeDrawer(Gravity.END);
+ } else {
+ displayInterstitial();
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ onBackPressed();
+ return true;
+ }
+
+ if (editor == null)
+ editor = (EditText) findViewById(R.id.editor);
+ // this will happen on first key pressed on hard-keyboard only. Once myInputField
+ // gets the focus again, it will automatically receive further key presses.
+
+ try{
+ if (editor != null && !editor.hasFocus()) {
+ editor.requestFocus();
+ editor.onKeyDown(keyCode, event);
+ }
+ } catch (NullPointerException ex){
+
+ }
+
+ return true;
+ }
+
+ @Override
+ public final void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode == RESULT_OK && requestCode == SELECT_FILE_CODE) {
+ String path = data.getStringExtra("path");
+ File file = new File(path);
+ if (file.isFile() && file.exists()) {
+ EventBus.getDefault().postSticky(new EventBusEvents.NewFileToOpen(new File(path)));
+ } else if(file.isDirectory()) {
+
+ }
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ /* If we clicked on the Navigation Drawer Menu item */
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ mDrawerLayout.closeDrawer(Gravity.RIGHT);
+ return true;
+ } else
+ return super.onOptionsItemSelected(item);
+ }
+
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ parseIntent(intent);
+ }
+ //endregion
+
+ //region Calls from the layout
+ public void OpenFile(View view) {
+ Intent subActivity = new Intent(BaseHomeActivity.this, SelectFileActivity.class);
+ subActivity.putExtra("action", SelectFileActivity.Actions.SelectFile);
+ Bundle scaleBundle = ActivityOptionsCompat.makeScaleUpAnimation(
+ view, 0, 0, view.getWidth(), view.getHeight()).toBundle();
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ startActivityForResult(subActivity, SELECT_FILE_CODE, scaleBundle);
+ else
+ startActivityForResult(subActivity, SELECT_FILE_CODE);
+ }
+
+ public void CreateFile(View view) {
+ onEvent(new EventBusEvents.NewFileToOpen(""));
+ onEvent(new EventBusEvents.AFileIsSelected("")); // simulate click on the list
+ }
+
+ public void OpenInfo(View view) {
+ Intent subActivity = new Intent(BaseHomeActivity.this, PreferenceAbout.class);
+ Bundle scaleBundle = ActivityOptionsCompat.makeScaleUpAnimation(
+ view, 0, 0, view.getWidth(), view.getHeight()).toBundle();
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
+ startActivity(subActivity, scaleBundle);
+ else
+ startActivity(subActivity);
+ }
+
+ public void OpenSettings(View view) {
+ mDrawerLayout.closeDrawer(Gravity.START);
+ mDrawerLayout.openDrawer(Gravity.END);
+ }
+ //endregion
+
+ //region Eventbus
+ public void onEvent(final EventBusEvents.NewFileToOpen event) {
+
+ new AsyncTask