package com.piusvelte.sonet.fragment;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.piusvelte.eidos.Eidos;
import com.piusvelte.sonet.OAuthLogin;
import com.piusvelte.sonet.R;
import com.piusvelte.sonet.Sonet;
import com.piusvelte.sonet.SonetService;
import com.piusvelte.sonet.adapter.MenuItemAdapter;
import com.piusvelte.sonet.provider.Accounts;
import com.piusvelte.sonet.provider.Entity;
import com.piusvelte.sonet.provider.Widgets;
import com.piusvelte.sonet.provider.WidgetsSettings;
import com.piusvelte.sonet.social.Client;
import com.piusvelte.sonet.util.CircleTransformation;
import com.squareup.picasso.Picasso;
import static com.piusvelte.sonet.Sonet.ACTION_REFRESH;
import static com.piusvelte.sonet.Sonet.RSS;
import static com.piusvelte.sonet.Sonet.SMS;
/**
* Created by bemmanuel on 5/17/15.
*/
public class Settings extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private static final int INVALID_SERVICE = -1;
private static final int LOADER_WIDGET_SETTINGS = 0;
private static final String DIALOG_NOTIFICATION_SETTINGS = "dialog:notification_settings";
private static final String DIALOG_TIME_SETTINGS = "dialog:time_settings";
private static final String DIALOG_UPDATE_SETTINGS = "dialog:update_settings";
private static final int REQUEST_AUTHENTICATE = 0;
private static final int REQUEST_NOTIFICATION_SETTINGS = 1;
private static final int REQUEST_TIME_SETTINGS = 2;
private static final int REQUEST_UPDATE_SETTINGS = 3;
private View mLoadingView;
private String mWidgetAccountSettingsId = null;
private boolean mTime24hr_value = Sonet.default_time24hr;
private boolean mSound_value = Sonet.default_sound;
private boolean mVibrate_value = Sonet.default_vibrate;
private boolean mLights_value = Sonet.default_lights;
private boolean mBackgroundUpdate_value = Sonet.default_backgroundUpdate;
private int mInterval_value = Sonet.default_interval;
private boolean mInstantUpload_value = Sonet.default_instantUpload;
/** account specific settings */
public static Settings newInstance(long accountId, int service, String profileUrl, String username) {
Settings settings = new Settings();
Bundle args = new Bundle();
args.putLong(Accounts._ID, accountId);
args.putInt(Accounts.SERVICE, service);
args.putString(Entity.PROFILE_URL, profileUrl);
args.putString(Accounts.USERNAME, username);
settings.setArguments(args);
return settings;
}
/** app-wide settings */
public static Settings newInstance() {
return newInstance(Sonet.INVALID_ACCOUNT_ID, INVALID_SERVICE, null, null);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.account_detail, container, false);
}
private boolean isAccountSettings() {
return getArguments().getLong(Accounts._ID) != Sonet.INVALID_ACCOUNT_ID;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Bundle args = getArguments();
Picasso picasso = Picasso.with(getActivity());
ImageView profile = (ImageView) view.findViewById(R.id.profile);
String url = args.getString(Entity.PROFILE_URL);
if (!TextUtils.isEmpty(url)) {
picasso.load(url)
.transform(new CircleTransformation())
.into(profile);
} else {
picasso.load(R.drawable.ic_account_box_grey600_48dp)
.transform(new CircleTransformation())
.into(profile);
}
ImageView icon = (ImageView) view.findViewById(R.id.icon);
TextView name = (TextView) view.findViewById(R.id.friend);
int service = args.getInt(Accounts.SERVICE);
int iconResId;
String nameText;
int menuResId;
if (service == INVALID_SERVICE) {
iconResId = R.drawable.icon;
nameText = getString(R.string.settings);
menuResId = R.menu.menu_settings;
} else {
Client.Network network = Client.Network.get(args.getInt(Accounts.SERVICE));
iconResId = network.getIcon();
nameText = network + ": " + args.getString(Accounts.USERNAME);
menuResId = R.menu.menu_account_detail;
}
picasso.load(iconResId)
.into(icon);
name.setText(nameText);
setListAdapter(new MenuItemAdapter(getActivity(),
menuResId,
android.R.layout.simple_list_item_1));
mLoadingView = view.findViewById(R.id.loading);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mLoadingView.setVisibility(View.VISIBLE);
getLoaderManager().initLoader(LOADER_WIDGET_SETTINGS, getArguments(), this);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
int menuItemResId = (int) id;
switch (menuItemResId) {
case R.id.menu_background_update:
UpdateSettingsDialogFragment.newInstance(REQUEST_UPDATE_SETTINGS,
mInterval_value,
mBackgroundUpdate_value)
.show(getChildFragmentManager(),
DIALOG_UPDATE_SETTINGS);
break;
case R.id.menu_notifications:
NotificationSettingsDialogFragment.newInstance(mSound_value,
mVibrate_value,
mLights_value,
REQUEST_NOTIFICATION_SETTINGS)
.show(getChildFragmentManager(),
DIALOG_NOTIFICATION_SETTINGS);
break;
case R.id.menu_instant_upload:
// TODO make this change visible
mInstantUpload_value = !mInstantUpload_value;
l.setItemChecked(position, mInstantUpload_value);
updateDatabase(Widgets.INSTANT_UPLOAD, mInstantUpload_value);
break;
case R.id.menu_time:
TimeSettingsDialogFragment.newInstance(REQUEST_TIME_SETTINGS, mTime24hr_value)
.show(getChildFragmentManager(), DIALOG_TIME_SETTINGS);
break;
case R.id.menu_authenticate:
int service = getArguments().getInt(Accounts.SERVICE);
if (service != SMS && service != RSS) {
startActivityForResult(new Intent(getActivity(), OAuthLogin.class)
.putExtra(Accounts.SERVICE, service)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
.putExtra(Sonet.EXTRA_ACCOUNT_ID, id),
REQUEST_AUTHENTICATE);
}
break;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_AUTHENTICATE:
if (resultCode == Activity.RESULT_OK) {
Eidos.requestBackup(getActivity());
getActivity().startService(new Intent(getActivity(), SonetService.class)
.setAction(ACTION_REFRESH)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { AppWidgetManager.INVALID_APPWIDGET_ID }));
}
break;
case REQUEST_NOTIFICATION_SETTINGS:
if (resultCode == Activity.RESULT_OK) {
boolean value = NotificationSettingsDialogFragment.hasSound(data, mSound_value);
if (value != mSound_value) {
mSound_value = value;
updateDatabase(Widgets.SOUND, mSound_value ? 1 : 0);
}
value = NotificationSettingsDialogFragment.hasVibrate(data, mVibrate_value);
if (value != mVibrate_value) {
mVibrate_value = value;
updateDatabase(Widgets.VIBRATE, mVibrate_value ? 1 : 0);
}
value = NotificationSettingsDialogFragment.hasLights(data, mLights_value);
if (value != mLights_value) {
mLights_value = value;
updateDatabase(Widgets.LIGHTS, mLights_value ? 1 : 0);
}
}
break;
case REQUEST_TIME_SETTINGS:
if (resultCode == Activity.RESULT_OK) {
boolean time24hr = TimeSettingsDialogFragment.is24hr(data, mTime24hr_value);
if (time24hr != mTime24hr_value) {
mTime24hr_value = time24hr;
updateDatabase(Widgets.TIME24HR, time24hr ? 1 : 0);
}
}
break;
case REQUEST_UPDATE_SETTINGS:
if (resultCode == Activity.RESULT_OK) {
int interval = UpdateSettingsDialogFragment.getUpdateInterval(data, mInterval_value);
if (interval != mInterval_value) {
mInterval_value = interval;
updateDatabase(Widgets.INTERVAL, mInterval_value);
}
boolean backgroundUpdates = UpdateSettingsDialogFragment.hasBackgroundUpdate(data, mBackgroundUpdate_value);
if (backgroundUpdates != mBackgroundUpdate_value) {
mBackgroundUpdate_value = backgroundUpdates;
updateDatabase(Widgets.BACKGROUND_UPDATE, mBackgroundUpdate_value ? 1 : 0);
}
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_WIDGET_SETTINGS:
return new CursorLoader(getActivity(),
WidgetsSettings.getContentUri(getActivity()),
new String[] { Widgets._ID,
Widgets.ACCOUNT,
Widgets.TIME24HR,
Widgets.SOUND,
Widgets.VIBRATE,
Widgets.LIGHTS,
Widgets.BACKGROUND_UPDATE,
Widgets.INSTANT_UPLOAD },
Widgets.WIDGET + "=? and (" + Widgets.ACCOUNT + "=? or " + Widgets.ACCOUNT + "=?)",
new String[] { Integer.toString(AppWidgetManager.INVALID_APPWIDGET_ID),
Long.toString(args.getLong(Accounts._ID)),
Long.toString(Sonet.INVALID_ACCOUNT_ID) },
Widgets.WIDGET + " DESC, " + Widgets.ACCOUNT + " DESC");
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case LOADER_WIDGET_SETTINGS:
mLoadingView.setVisibility(View.GONE);
if (cursor != null) {
if (cursor.moveToFirst()) {
// insert rows for settings records that are missing
mWidgetAccountSettingsId = String.valueOf(cursor.getInt(cursor.getColumnIndexOrThrow(Widgets._ID)));
long account = cursor.getLong(cursor.getColumnIndexOrThrow(Widgets.ACCOUNT));
if (account == Accounts.INVALID_ACCOUNT_ID && isAccountSettings()) {
// the first row is non-account, insert the account specific row
// this id is used, copying any settings changes to this specific record
mWidgetAccountSettingsId = Sonet.initAccountSettings(getActivity(),
AppWidgetManager.INVALID_APPWIDGET_ID,
getArguments().getLong(Accounts._ID));
}
// get the settings
mTime24hr_value = cursor.getInt(cursor.getColumnIndexOrThrow(Widgets.TIME24HR)) == 1;
mSound_value = cursor.getInt(cursor.getColumnIndexOrThrow(Widgets.SOUND)) == 1;
mVibrate_value = cursor.getInt(cursor.getColumnIndexOrThrow(Widgets.VIBRATE)) == 1;
mLights_value = cursor.getInt(cursor.getColumnIndexOrThrow(Widgets.LIGHTS)) == 1;
mBackgroundUpdate_value = cursor.getInt(cursor.getColumnIndexOrThrow(Widgets.BACKGROUND_UPDATE)) == 1;
mInstantUpload_value = cursor.getInt(cursor.getColumnIndexOrThrow(Widgets.INSTANT_UPLOAD)) == 1;
} else {
// got nothing, init all, the Loader should requery
Sonet.initAccountSettings(getActivity(), AppWidgetManager.INVALID_APPWIDGET_ID, Sonet.INVALID_ACCOUNT_ID);
mWidgetAccountSettingsId = Sonet.initAccountSettings(getActivity(),
AppWidgetManager.INVALID_APPWIDGET_ID,
getArguments().getLong(Accounts._ID));
}
}
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
private void updateDatabase(String column, boolean value) {
updateDatabase(column, value ? 1 : 0);
}
private void updateDatabase(String column, int value) {
// TODO update via Loader
ContentValues values = new ContentValues();
values.put(column, value);
getActivity().getContentResolver()
.update(Widgets.getContentUri(getActivity()),
values,
Widgets._ID + "=?",
new String[] { mWidgetAccountSettingsId });
}
}