package com.example.focus;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.util.Arrays;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.preference.PreferenceManager;
import android.util.Base64;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.FacebookException;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.OnErrorListener;
public class SettingsActivity extends Activity implements OnClickListener, OnItemSelectedListener {
public final String TAG = "SettingActivity";
ImageButton ibBT;
ImageButton ibInfo;
SeekBar sbCurrent;
TextView tvCurrentLabel;
EditText pass;
Spinner spinner;
TextView tvFacebook;
private WorkableService mService = null;
private BluetoothDevice mDevice = null;
private BluetoothAdapter mBtAdapter = null;
// constants for twitter login:
static String TWITTER_CONSUMER_KEY = "c5mHCso3LzEN9t8OKhPVJA"; // place your
// consumer
// key here
static String TWITTER_CONSUMER_SECRET = "5WYJAbcEmUYjAfjilV9Uyk93sfiUtl8KyxsjdhmYaCw"; // place
// your
// consumer
// secret
// here
// Preference Constants
// static final String PREF_KEY_OAUTH_TOKEN =
// "616502507-jmpUzOvz0hPXxFtsLsyWEB8DY9EEPnxyBMg3bBBM";
// static final String PREF_KEY_OAUTH_SECRET =
// "j2trRe4BL4HigN19ZJbUt5XNZTd8zkb63AT6EFKvAo0";
static final String PREF_KEY_OAUTH_TOKEN = "oauth_token";
static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret";
static final String PREF_KEY_TWITTER_USERNAME = "twitter_username";
static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn";
static final String TWITTER_CALLBACK_URL = "oauth://stilldoesntcomplete.com";
// Twitter oauth urls
static final String URL_TWITTER_AUTH = "auth_url";
static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier";
static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token";
// Login button
ImageButton ibLoginTwitter;
TextView tvTwitter;
// Twitter
private static Twitter twitter;
private static RequestToken requestToken;
// Shared Preferences
private static SharedPreferences mSharedPreferences;
// Internet Connection detector
private ConnectionDetector cd;
// Alert Dialog Manager
AlertDialogManager alert = new AlertDialogManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBtAdapter = bluetoothManager.getAdapter();
if (mBtAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
finish();
return;
}
Bundle bundle = getIntent().getExtras();
if(bundle != null && mBtAdapter != null)
{
String deviceAddress = bundle.getString(BluetoothDevice.EXTRA_DEVICE);
mDevice = mBtAdapter.getRemoteDevice(deviceAddress);
}
ibBT = (ImageButton) findViewById(R.id.ibBT);
ibInfo = (ImageButton) findViewById(R.id.ibInfo);
ibBT.setOnClickListener(this);
ibInfo.setOnClickListener(this);
pass = (EditText) findViewById(R.id.etPincode);
tvCurrentLabel = (TextView) findViewById(R.id.tvCurrentLabel);
// Shared Preferences
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
// Add twitter login:
ibLoginTwitter = (ImageButton) findViewById(R.id.ibTwitter);
tvTwitter = (TextView) findViewById(R.id.tvTwitter);
/**
* Twitter login button click event will call loginToTwitter() function
* */
spinner = (Spinner) findViewById(R.id.spMode);
spinner.setOnItemSelectedListener(this);
int selectedMode = mSharedPreferences.getInt(CommonValues.ACTIVE_MODE, 0);
spinner.setSelection(selectedMode);
ibLoginTwitter.setOnClickListener(this);
if (!isTwitterLoggedInAlready()) {
Uri uri = getIntent().getData();
if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
oAuthVerifier(uri);
}
} else {
String username = mSharedPreferences.getString(PREF_KEY_TWITTER_USERNAME, "");
tvTwitter.setText(username);
}
initializeFacebookButton();
initializeSeekBar();
init();
}
private void init() {
Intent bindIntent = new Intent(this, WorkableService.class);
startService(bindIntent);
bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
protected void initializeFacebookButton() {
// Add Facebook login
tvFacebook = (TextView) findViewById(R.id.tvFacebook);
LoginButton authButton = (LoginButton) findViewById(R.id.ibFacebook);
authButton.setOnErrorListener(new OnErrorListener() {
@Override
public void onError(FacebookException error) {
Debugger.i(TAG, "Error " + error.getMessage());
}
});
authButton.setReadPermissions(Arrays.asList("basic_info", "email"));
// session state call back event
authButton.setSessionStatusCallback(new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Debugger.i(TAG, "Access Token" + session.getAccessToken());
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
Debugger.i(TAG, "User ID " + user.getId());
Debugger.i(TAG, "Email " + user.asMap().get("email"));
tvFacebook.setText(user.asMap().get("email").toString());
}
}
});
}
}
});
try {
PackageInfo info = getPackageManager().getPackageInfo("com.example.focus", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
Debugger.d("KeyHash:", hash);
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
protected void initializeSeekBar() {
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
int value = pref.getInt(CommonValues.MAX_CURRENT_PREF, 0);
sbCurrent = (SeekBar) findViewById(R.id.sbCurrent);
sbCurrent.setProgress(value);
int val = value + 20;
float progress = (float) ((val * 0.0067 + 0.7));
DecimalFormat df = new DecimalFormat("#.#");
String str = df.format(progress);
tvCurrentLabel.setText(str);
sbCurrent.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// min value should be 20;
// seek bar should be range from 0.8 to 2.0
// according to documentation, values that can be write to
// device
// can range from 20 to 200.
int val = progress + 20;
float value = (float) ((val * 0.0067 + 0.7));
DecimalFormat df = new DecimalFormat("#.#");
String str = df.format(value);
tvCurrentLabel.setText(str);
}
});
}
protected void oAuthVerifier(Uri uri) {
// oAuth verifier
GetAccessToken token = new GetAccessToken();
token.execute(uri);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibBT:
// Button BT
Intent intent = new Intent(this, DevicesActivity.class);
startActivity(intent);
break;
case R.id.ibInfo:
// Button Info
Toast.makeText(this, "Info", Toast.LENGTH_SHORT).show();
break;
case R.id.ibTwitter:
cd = new ConnectionDetector(getApplicationContext());
// Check if Internet present
if (!cd.isConnectingToInternet()) {
// Internet Connection is not present
alert.showAlertDialog(this, "Internet Connection Error", "Please connect to working Internet connection", false);
// stop executing code by return
break;
}
// if logged in already - than log out.
if (isTwitterLoggedInAlready()) {
new Thread(new Runnable() {
@Override
public void run() {
logoutFromTwitter();
}
}).start();
return;
}
// Call login twitter function
new Thread(new Runnable() {
@Override
public void run() {
// Check if twitter keys are set
if (TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0) {
// Internet Connection is not present
alert.showAlertDialog(getApplicationContext(), "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false);
// stop executing code by return
return;
} else
loginToTwitter();
}
}).start();
break;
default:
break;
}
}
@Override
public void onBackPressed() {
SharedPreferences.Editor pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit();
byte value = (byte) sbCurrent.getProgress();
pref.putInt(CommonValues.MAX_CURRENT_PREF, value);
if (mService != null && mDevice != null) {
mService.writeCharacteristic(WorkableService.MAX_CURRENT, value);
pref.commit();
if (pass.getText().toString().length() > 0) {
int password = Integer.valueOf(pass.getText().toString());
byte[] arr = ByteBuffer.allocate(4).putInt(password).array();
WorkableService.swapArray(arr);
mService.writeCharacteristic( WorkableService.PIN_CODE, arr);
}
} else {
Debugger.d(TAG, "OnBackPressed(). Device is not connected");
// AlertDialog.Builder builder = new AlertDialog.Builder(this);
// builder.setTitle("Problem");
// builder.setMessage(R.string.device_disconnected);
// builder.setNegativeButton(R.string.ok, new DialogInterface.OnClickListener() {
//
// @Override
// public void onClick(DialogInterface dialog, int which) {
// finish();
// }
//
// });
}
super.onBackPressed();
};
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder rawBinder) {
mService = ((WorkableService.LocalBinder) rawBinder).getService();
Debugger.d(TAG, "onServiceConnected mService= " + mService);
if (!mService.initialize()) {
Debugger.e(TAG, "Unable to initialize Bluetooth");
finish();
}
mService.setActivityHandler(mHandler);
}
public void onServiceDisconnected(ComponentName classname) {
mService.disconnect();
mService = null;
}
};
public void setDevice(BluetoothDevice device) {
mDevice = device;
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
final Bundle data = msg.getData();
switch (msg.what) {
case WorkableService.CONNECT_MSG:
String text = data.getString(BluetoothDevice.EXTRA_NAME);
break;
case WorkableService.READY_MSG:
// mService.readSpecificChar(mDevice,
// WorkableService.ACTUAL_LEVEL);
break;
case WorkableService.DISCONNECT_MSG:
mDevice = null;
Debugger.d(TAG, "Device disconnected");
break;
// int value;
// String name =
// data.getString(WorkableService.EXTRA_CHARACTERISTIC);
// if (name.equals(WorkableService.BATTERY_LEVEL.toString())) {
// value = data.getInt(name);
// }
}
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CommonValues.REQUEST_SELECT_DEVICE:
if (resultCode == Activity.RESULT_OK && data != null) {
String deviceAddress = data.getStringExtra(BluetoothDevice.EXTRA_DEVICE);
if(mBtAdapter != null)
mDevice = mBtAdapter.getRemoteDevice(deviceAddress);
else
{
Debugger.e(TAG, "onActivityResult. Error BluetoothAdapter = null.");
finish();
}
Debugger.d(TAG, "... onActivityResultdevice.address==" + mDevice + "mserviceValue" + mService);
// setUiState();
mService.connect(deviceAddress);
}
break;
default:
Debugger.e(TAG, "wrong request code");
break;
}
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
/* *
* Function to login twitter
*/
private void loginToTwitter() {
// Check if already logged in
if (!isTwitterLoggedInAlready()) {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
Configuration configuration = builder.build();
TwitterFactory factory = new TwitterFactory(configuration);
twitter = factory.getInstance();
try {
requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())));
} catch (TwitterException e) {
e.printStackTrace();
}
} else {
// user already logged into twitter
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Already Logged into twitter", Toast.LENGTH_LONG).show();
String username = mSharedPreferences.getString(PREF_KEY_TWITTER_USERNAME, "");
tvTwitter.setText(username);
}
});
}
}
/**
* Function to update status
* */
class GetAccessToken extends AsyncTask<Uri, Void, String> {
private AccessToken accessToken = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Uri... params) {
Uri uri = params[0];
final String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
try {
// Get the access token
accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
// Shared Preferences
Editor e = mSharedPreferences.edit();
// After getting access token, access token secret
// store them in application preferences
if (accessToken != null) {
e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
e.putString(PREF_KEY_OAUTH_SECRET, accessToken.getTokenSecret());
// Store login status - true
e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
// save changes
accessToken.getScreenName();
Debugger.e("Twitter OAuth Token", "> " + accessToken.getToken());
// Getting user details from twitter
// For now i am getting his name only
long userID = accessToken.getUserId();
User user = twitter.showUser(userID);
String username = user.getName();
e.putString(PREF_KEY_TWITTER_USERNAME, username);
e.commit();
return username;
}
} catch (TwitterException e) {
Debugger.e("GetAccessToken - Twitter Exception", e.getMessage());
} catch (Exception e) {
// Check log for login errors
Debugger.e("Twitter Login Error", "> " + e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String result) {
tvTwitter.setText(result);
}
}
/**
* Function to logout from twitter It will just clear the application shared
* preferences
* */
private void logoutFromTwitter() {
// Clear the shared preferences
Editor e = mSharedPreferences.edit();
e.remove(PREF_KEY_OAUTH_TOKEN);
e.remove(PREF_KEY_OAUTH_SECRET);
e.remove(PREF_KEY_TWITTER_LOGIN);
e.commit();
// After this take the appropriate action
// I am showing the hiding/showing buttons again
// You might not needed this code
runOnUiThread(new Runnable() {
@Override
public void run() {
tvTwitter.setText("");
}
});
// ibLoginTwitter.setVisibility(View.VISIBLE);
}
/**
* Check user already logged in your application using twitter Login flag is
* fetched from Shared Preferences
* */
private boolean isTwitterLoggedInAlready() {
// return twitter login status from Shared Preferences
return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
}
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
Debugger.d(TAG, "onDestroy()");
try {
unbindService(mServiceConnection);
} catch (Exception ignore) {
Debugger.e(TAG, ignore.toString());
}
super.onDestroy();
};
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if (mSharedPreferences == null) {
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
}
Editor editor = mSharedPreferences.edit();
// put current index of selected item
editor.putInt(CommonValues.ACTIVE_MODE, arg2);
editor.commit();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
}