Vibration: allow BoardConfig to disable vibration for a device.

Change-Id: Ibd2f67391ce6d7774498839829e0de9391508781
diff --git a/Android.mk b/Android.mk
old mode 100644
new mode 100755
index 4036473..9b91235
--- a/Android.mk
+++ b/Android.mk
@@ -293,6 +293,9 @@
 ifeq ($(TW_NO_EXFAT_FUSE), true)
     LOCAL_CFLAGS += -DTW_NO_EXFAT_FUSE
 endif
+ifeq ($(TW_NO_HAPTICS), true)
+    LOCAL_CFLAGS += -DTW_NO_HAPTICS
+endif
 ifeq ($(TW_INCLUDE_JB_CRYPTO), true)
     TW_INCLUDE_CRYPTO := true
 endif
diff --git a/data.cpp b/data.cpp
old mode 100644
new mode 100755
index d9239a4..cf8349b
--- a/data.cpp
+++ b/data.cpp
@@ -587,9 +587,16 @@
 	mConst.SetValue("false", "0");
 
 	mConst.SetValue(TW_VERSION_VAR, TW_VERSION_STR);
+
+#ifndef TW_NO_HAPTICS
 	mPersist.SetValue("tw_button_vibrate", "80");
 	mPersist.SetValue("tw_keyboard_vibrate", "40");
 	mPersist.SetValue("tw_action_vibrate", "160");
+	mConst.SetValue("tw_disable_haptics", "0");
+#else
+	LOGINFO("TW_NO_HAPTICS := true\n");
+	mConst.SetValue("tw_disable_haptics", "1");
+#endif
 
 	TWPartition *store = PartitionManager.Get_Default_Storage_Partition();
 	if (store)
@@ -1110,9 +1117,11 @@
 
 void DataManager::Vibrate(const string& varName)
 {
+#ifndef TW_NO_HAPTICS
 	int vib_value = 0;
 	GetValue(varName, vib_value);
 	if (vib_value) {
 		vibrate(vib_value);
 	}
+#endif
 }
diff --git a/data.hpp b/data.hpp
old mode 100644
new mode 100755
diff --git a/gui/action.cpp b/gui/action.cpp
old mode 100644
new mode 100755
index d708dd4..11d9580
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -516,8 +516,12 @@
 	blankTimer.resetTimerAndUnblank();
 	property_set("twrp.action_complete", "1");
 	time(&Stop);
+
+#ifndef TW_NO_HAPTICS
 	if ((int) difftime(Stop, Start) > 10)
 		DataManager::Vibrate("tw_action_vibrate");
+#endif
+
 	LOGINFO("operation_end - status=%d\n", operation_status);
 }
 
diff --git a/gui/button.cpp b/gui/button.cpp
old mode 100644
new mode 100755
index dfae5e2..7c7f69f
--- a/gui/button.cpp
+++ b/gui/button.cpp
@@ -248,7 +248,10 @@
 	} else {
 		if (last_state == 0) {
 			last_state = 1;
+
+#ifndef TW_NO_HAPTICS
 			DataManager::Vibrate("tw_button_vibrate");
+#endif
 			if (mButtonLabel != NULL)
 				mButtonLabel->isHighlighted = true;
 			if (mButtonImg != NULL)
diff --git a/gui/checkbox.cpp b/gui/checkbox.cpp
old mode 100644
new mode 100755
index de63cba..025a803
--- a/gui/checkbox.cpp
+++ b/gui/checkbox.cpp
@@ -179,7 +179,10 @@
 		lastState = (lastState == 0) ? 1 : 0;
 		DataManager::SetValue(mVarName, lastState);
 
+#ifndef TW_NO_HAPTICS
 		DataManager::Vibrate("tw_button_vibrate");
+#endif
+
 	}
 	return 0;
 }
diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp
old mode 100644
new mode 100755
index ca7006d..b6a772b
--- a/gui/keyboard.cpp
+++ b/gui/keyboard.cpp
@@ -549,7 +549,11 @@
 			bool repeatKey = false;
 			Layout& lay = layouts[currentLayout - 1];
 			if (state == TOUCH_RELEASE && was_held == 0) {
+
+#ifndef TW_NO_HAPTICS
 				DataManager::Vibrate("tw_keyboard_vibrate");
+#endif
+
 				if (key.layout > 0) {
 					// Switch layouts
 					if (lay.is_caps && key.layout == lay.revert_layout && !CapsLockOn) {
@@ -593,7 +597,11 @@
 				was_held = 1;
 				if (key.longpresskey > 0) {
 					// Long Press Key
+
+#ifndef TW_NO_HAPTICS
 					DataManager::Vibrate("tw_keyboard_vibrate");
+#endif
+
 					PageManager::NotifyCharInput(key.longpresskey);
 				}
 				else
diff --git a/gui/patternpassword.cpp b/gui/patternpassword.cpp
old mode 100644
new mode 100755
index 5559f9d..a75ed15
--- a/gui/patternpassword.cpp
+++ b/gui/patternpassword.cpp
@@ -370,7 +370,11 @@
 			mTrackingTouch = true;
 			ResetActiveDots();
 			ConnectDot(dot_idx);
+
+#ifndef TW_NO_HAPTICS
 			DataManager::Vibrate("tw_button_vibrate");
+#endif
+
 			mCurLineX = x;
 			mCurLineY = y;
 			mNeedRender = true;
@@ -386,7 +390,11 @@
 			{
 				ConnectIntermediateDots(dot_idx);
 				ConnectDot(dot_idx);
+
+#ifndef TW_NO_HAPTICS
 				DataManager::Vibrate("tw_button_vibrate");
+#endif
+
 			}
 
 			mCurLineX = x;
diff --git a/gui/scrolllist.cpp b/gui/scrolllist.cpp
old mode 100644
new mode 100755
index ecfb5fe..bf5a9b0
--- a/gui/scrolllist.cpp
+++ b/gui/scrolllist.cpp
@@ -508,7 +508,10 @@
 			NotifySelect(selectedItem);
 			mUpdate = 1;
 
+#ifndef TW_NO_HAPTICS
 			DataManager::Vibrate("tw_button_vibrate");
+#endif
+
 			selectedItem = NO_ITEM;
 		} else {
 			// Start kinetic scrolling
diff --git a/gui/slider.cpp b/gui/slider.cpp
old mode 100644
new mode 100755
index fab5a2e..3c5f652
--- a/gui/slider.cpp
+++ b/gui/slider.cpp
@@ -208,7 +208,11 @@
 			return 0;
 
 		if (sCurTouchX >= mRenderX + mRenderW - sTouchW) {
+
+#ifndef TW_NO_HAPTICS
 			DataManager::Vibrate("tw_button_vibrate");
+#endif
+
 			sAction->doActions();
 		}
 
diff --git a/gui/terminal.cpp b/gui/terminal.cpp
old mode 100644
new mode 100755
index b1799ce..a4fed91
--- a/gui/terminal.cpp
+++ b/gui/terminal.cpp
@@ -530,7 +530,11 @@
 		switch (ch)
 		{
 			case 7: // BEL
+
+#ifndef TW_NO_HAPTICS
 				DataManager::Vibrate("tw_button_vibrate");
+#endif
+
 				break;
 			case 8: // BS
 				left();
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
old mode 100644
new mode 100755
index 5bbfe90..f6f14bc
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -3166,19 +3166,28 @@
 				<placement x="%tab5_col4_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
 			</fill>
 
+			<text style="text_m">
+				<condition var1="tw_disable_haptics" var2="1"/>
+				<placement x="col1_x_left" y="%row4_y%" w="%content_width%"/>
+				<text>{@vibration_disabled=Vibration Disabled for Device}</text>
+			</text>
+
 			<slidervalue>
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="col1_x_left" y="%row4_y%" w="%content_width%"/>
 				<text>{@button_vibration=Button Vibration:}</text>
 				<data variable="tw_button_vibrate" min="0" max="300"/>
 			</slidervalue>
 
 			<slidervalue>
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="col1_x_left" y="%row9_y%" w="%content_width%"/>
 				<text>{@kb_vibration=Keyboard Vibration:}</text>
 				<data variable="tw_keyboard_vibrate" min="0" max="300"/>
 			</slidervalue>
 
 			<slidervalue>
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="col1_x_left" y="%row14_y%" w="%content_width%"/>
 				<text>{@act_vibration=Action Vibration:}</text>
 				<data variable="tw_action_vibrate" min="0" max="500"/>
diff --git a/gui/theme/common/languages/en.xml b/gui/theme/common/languages/en.xml
old mode 100644
new mode 100755
index afba59a..03d4e08
--- a/gui/theme/common/languages/en.xml
+++ b/gui/theme/common/languages/en.xml
@@ -318,6 +318,7 @@
 		<string name="settings_tz_btn">Time Zone</string>
 		<string name="settings_screen_btn">Screen</string>
 		<string name="settings_screen_bright_btn">Screen Brightness</string>
+		<string name="vibration_disabled">Vibration is disabled for this device</string>
 		<string name="settings_vibration_btn">Vibration</string>
 		<string name="settings_language_btn">Language</string>
 		<string name="time_zone_hdr">Time Zone</string>
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
old mode 100644
new mode 100755
index 1176922..09b7c6b
--- a/gui/theme/common/portrait.xml
+++ b/gui/theme/common/portrait.xml
@@ -3329,19 +3329,28 @@
 				<placement x="%tab5_col4_x%" y="%row_tab_y%" w="%tab5_width%" h="%tab_indicator_height%"/>
 			</fill>
 
+			<text style="text_m">
+				<condition var1="tw_disable_haptics" var2="1"/>
+				<placement x="%indent%" y="%row4_y%"/>
+				<text>{@vibration_disabled=Vibration Disabled for Device}</text>
+			</text>
+
 			<slidervalue>
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="indent" y="%row4_y%" w="%content_width%"/>
 				<text>{@button_vibration=Button Vibration:}</text>
 				<data variable="tw_button_vibrate" min="0" max="300"/>
 			</slidervalue>
 
 			<slidervalue>
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="indent" y="%row9_y%" w="%content_width%"/>
 				<text>{@kb_vibration=Keyboard Vibration:}</text>
 				<data variable="tw_keyboard_vibrate" min="0" max="300"/>
 			</slidervalue>
 
 			<slidervalue>
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="indent" y="%row14_y%" w="%content_width%"/>
 				<text>{@act_vibration=Action Vibration:}</text>
 				<data variable="tw_action_vibrate" min="0" max="500"/>
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
old mode 100644
new mode 100755
index 83f4b63..d36bb2d
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -3518,6 +3518,7 @@
 			</button>
 
 			<button style="main_button">
+				<condition var1="tw_disable_haptics" var2="0"/>
 				<placement x="%col1_x_right%" y="%row6_y%"/>
 				<text>{@settings_vibration_btn=Vibration}</text>
 				<action function="page">settings_vibration</action>
diff --git a/minuitwrp/events.cpp b/minuitwrp/events.cpp
old mode 100644
new mode 100755
index bd29f71..9374ef1
--- a/minuitwrp/events.cpp
+++ b/minuitwrp/events.cpp
@@ -123,6 +123,7 @@
 	return -1;
 }
 
+#ifndef TW_NO_HAPTICS
 int vibrate(int timeout_ms)
 {
     if (timeout_ms > 10000) timeout_ms = 1000;
@@ -135,6 +136,7 @@
 
     return 0;
 }
+#endif
 
 /* Returns empty tokens */
 static char *vk_strtok_r(char *str, const char *delim, char **save_str)
@@ -722,7 +724,9 @@
 
                 last_virt_key = e->vks[i].scancode;
 
+#ifndef TW_NO_HAPTICS
                 vibrate(VIBRATOR_TIME_MS);
+#endif
 
                 // Mark that all further movement until lift is discard,
                 // and make sure we don't come back into this area