Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ repositories {

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
buildToolsVersion "23.0.3"

defaultConfig {
applicationId "com.bixlabs.smssolidario"
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@
android:label="@string/title_activity_settings"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".activity.HistoryActivity"
android:label="@string/donations_history"
android:screenOrientation="portrait">
</activity>
<receiver
android:exported="false"
android:name="com.bixlabs.smssolidario.classes.AlertReceiver">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.bixlabs.smssolidario.activity;

import android.app.ProgressDialog;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.ViewFlipper;

import com.bixlabs.smssolidario.R;
import com.bixlabs.smssolidario.adapters.HistoryCursorAdapter;
import com.bixlabs.smssolidario.persistency.DatabaseHelper;
import com.bixlabs.smssolidario.persistency.HistoryLoader;

public class HistoryActivity extends AppCompatActivity
implements LoaderManager.LoaderCallbacks<Cursor> {

private ViewFlipper viewFlipper;
private ListView historyListview;
private HistoryCursorAdapter historyAdapter;
private DatabaseHelper databaseHelper;
private ProgressDialog progressDialog;

// Dismiss the Progress Dialog and make the ViewFlipper visible
// inside a Handler (which runs on the UI thread).
private final Handler progressDialogHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (historyAdapter.getCount() == 0) {
viewFlipper.setDisplayedChild(1);
} else {
viewFlipper.setDisplayedChild(0);
}
viewFlipper.setVisibility(View.VISIBLE);
progressDialog.dismiss();
return true;
}
});

@SuppressWarnings("ConstantConditions")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);

// Set the actionbar title and home button
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_main);
toolbar.setTitle(R.string.donations_history);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

progressDialog = ProgressDialog.show(this, getString(R.string.history_progressdialog_title),
getString(R.string.history_progressdialog_message), true, false);

viewFlipper = (ViewFlipper) this.findViewById(R.id.view_flipper_history);
historyListview = (ListView) this.findViewById(R.id.list_history);
historyAdapter = new HistoryCursorAdapter(this, null);
historyListview.setAdapter(historyAdapter);

databaseHelper = new DatabaseHelper(getApplicationContext());

// Make the ViewFlipper invisible until the loader has finished loading data
viewFlipper.setVisibility(View.INVISIBLE);

// Initialize the loader
getSupportLoaderManager().initLoader(0, null, this);
}

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
if (menuItem.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(menuItem);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new HistoryLoader(getApplicationContext(), databaseHelper);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, final Cursor data) {
// We can't swap the cursor inside the Handler because the DB
// would be already closed by that time. The good thing is that
// swapping takes a few milliseconds (tested with 10.000 rows of data) so
// it's completely transparent to the user.
historyAdapter.swapCursor(data);

// Send a delayed message to the ProgressDialog handler to avoid dialog flickering
// in case the data is loaded too fast. From a user perspective it introduces
// consistency.
progressDialogHandler.sendEmptyMessageDelayed(0, 1200); // 1.2 second
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
historyAdapter.swapCursor(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
Expand All @@ -24,6 +24,9 @@
import android.widget.ViewFlipper;

import com.awesomego.widget.ToggleButton;
import com.bixlabs.smssolidario.BuildConfig;
import com.bixlabs.smssolidario.R;
import com.bixlabs.smssolidario.SmsAnalyticsApplication;
import com.crashlytics.android.Crashlytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
Expand All @@ -35,9 +38,6 @@
import org.joda.time.DateTime;

import io.fabric.sdk.android.Fabric;
import com.bixlabs.smssolidario.BuildConfig;
import com.bixlabs.smssolidario.R;
import com.bixlabs.smssolidario.SmsAnalyticsApplication;

import static com.bixlabs.smssolidario.classes.Constants.COMPANY_NAME;
import static com.bixlabs.smssolidario.classes.Constants.DEFAULT_ACTIVE;
Expand Down Expand Up @@ -123,14 +123,18 @@ public boolean onOptionsItemSelected(MenuItem item) {
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
checkPermissions();
}

if (id == R.id.action_about) {
showAbout();
}
switch (id) {
case R.id.action_settings:
checkPermissions();
break;
case R.id.action_about:
showAbout();
break;
case R.id.action_history:
Intent historyIntent = new Intent(this, HistoryActivity.class);
startActivity(historyIntent);
break;
}

return super.onOptionsItemSelected(item);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
Expand All @@ -16,7 +18,6 @@
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.support.annotation.LayoutRes;
import android.os.Bundle;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.MenuInflater;
Expand All @@ -27,8 +28,19 @@
import android.widget.TimePicker;
import android.widget.Toast;

import com.bixlabs.smssolidario.R;
import com.bixlabs.smssolidario.classes.Scheduler;

import net.danlew.android.joda.JodaTimeAndroid;

import org.joda.time.DateTime;

import java.util.ArrayList;
import java.util.List;

import static com.bixlabs.smssolidario.classes.Constants.DEFAULT_HOUR;
import static com.bixlabs.smssolidario.classes.Constants.DEFAULT_MINUTES;
import static com.bixlabs.smssolidario.classes.Constants.ORGANIZATION_INFO;
import static com.bixlabs.smssolidario.classes.Constants.PREF_ACTIVE;
import static com.bixlabs.smssolidario.classes.Constants.PREF_CONFIGURED;
import static com.bixlabs.smssolidario.classes.Constants.PREF_DAY;
Expand All @@ -37,16 +49,6 @@
import static com.bixlabs.smssolidario.classes.Constants.PREF_MINUTE;
import static com.bixlabs.smssolidario.classes.Constants.PREF_MONTH;
import static com.bixlabs.smssolidario.classes.Constants.PREF_YEAR;
import static com.bixlabs.smssolidario.classes.Constants.ORGANIZATION_INFO;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;


import net.danlew.android.joda.JodaTimeAndroid;

import org.joda.time.DateTime;

import com.bixlabs.smssolidario.R;
import com.bixlabs.smssolidario.classes.Scheduler;

public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener,
android.support.v7.widget.Toolbar.OnMenuItemClickListener{
Expand Down Expand Up @@ -113,6 +115,19 @@ public boolean onPreferenceClick(Preference preference) {
phonePreference = findPreference(NUMBER_KEY);
hideMessageAndPhonePreferences();

// Load the organizations and add them to the preferences
ListPreference organizations = (ListPreference) findPreference(ORGANIZATION_KEY);
String[] orgs = getResources().getStringArray(R.array.organizations);
List<String> entries = new ArrayList<>();
List<String> values = new ArrayList<>();
for (String org : orgs) {
String[] splittedOrg = org.split("\\|", 2);
values.add(splittedOrg[0]);
entries.add(splittedOrg[1]);
}
organizations.setEntries(entries.toArray(new String[entries.size()]));
organizations.setEntryValues(values.toArray(new String[values.size()]));

JodaTimeAndroid.init(this);
getPreferencesFromUser();

Expand Down Expand Up @@ -364,10 +379,13 @@ protected Dialog onCreateDialog(int id) {
if (id == DATE_DIALOG_ID) {
DatePickerDialog datePickerDialog = new DatePickerDialog(this, dPickerListener, expirationYear, expirationMonth, expirationDay);
datePickerDialog.getDatePicker().setMinDate(DateTime.now().getMillis() - 1000);
datePickerDialog.setTitle(R.string.dialog_datepicker_title);
return datePickerDialog;
}
else if (id == TIME_DIALOG_ID) {
return new TimePickerDialog(this, timePickerListener, expirationHour, expirationMinute, true);
TimePickerDialog timePickerDialog = new TimePickerDialog(this, timePickerListener, expirationHour, expirationMinute, true);
timePickerDialog.setTitle(R.string.dialog_timepicker_title);
return timePickerDialog;
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.bixlabs.smssolidario.adapters;

import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.bixlabs.smssolidario.R;
import com.bixlabs.smssolidario.persistency.DatabaseHelper;

/**
* History ListView Adapter
*/
public class HistoryCursorAdapter extends CursorAdapter {
private int COL_ORGANIZATION = 0;
private int COL_DATE = 0;

public HistoryCursorAdapter(Context context, Cursor c) {
super(context, c, 0);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(R.layout.item_history, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setTag(holder);
return view;
}

@Override
public Cursor swapCursor(Cursor c) {
if (c != null) {
COL_ORGANIZATION = c.getColumnIndex(DatabaseHelper.COLUMN_HISTORY_ORG);
COL_DATE = c.getColumnIndex(DatabaseHelper.COLUMN_HISTORY_DATE);
}
return super.swapCursor(c);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();

String organizationName = cursor.getString(COL_ORGANIZATION);
String timestamp = cursor.getString(COL_DATE);

holder.organization.setText(organizationName);
holder.date.setText(timestamp);
}

private static class ViewHolder {
final TextView organization;
final TextView date;

ViewHolder(View view) {
organization = (TextView) view.findViewById(R.id.item_history_organization);
date = (TextView) view.findViewById(R.id.item_history_date);
}
}
}
Loading