Skip to content

Commit

Permalink
Merge pull request #189 from rksh/scanning_indicator_button
Browse files Browse the repository at this point in the history
ENH - Scanning indicator button
  • Loading branch information
rksh committed Oct 20, 2017
2 parents 07415ad + b998783 commit 9a14a86
Show file tree
Hide file tree
Showing 31 changed files with 327 additions and 20 deletions.
Expand Up @@ -27,7 +27,7 @@
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
Expand All @@ -46,7 +46,7 @@
import java.text.NumberFormat;
import java.util.Set;

import pl.droidsonroids.gif.GifImageView;
import pl.droidsonroids.gif.GifImageButton;

import static android.view.View.GONE;
import static android.view.View.VISIBLE;
Expand All @@ -61,6 +61,7 @@ public final class ListFragment extends Fragment implements ApiListener, DialogL

private static final int SORT_DIALOG = 100;
private static final int UPLOAD_DIALOG = 101;
private static final int QUICK_PAUSE_DIALOG = 102;

public static final float MIN_DISTANCE_ACCURACY = 32f;

Expand All @@ -81,6 +82,7 @@ public final class ListFragment extends Fragment implements ApiListener, DialogL
public static final String PREF_SCAN_PERIOD_STILL = "scanPeriodStill";
public static final String PREF_SCAN_PERIOD = "scanPeriod";
public static final String PREF_SCAN_PERIOD_FAST = "scanPeriodFast";
public static final String PREF_QUICK_PAUSE = "quickScanPause";
public static final String GPS_SCAN_PERIOD = "gpsPeriod";
public static final String PREF_FOUND_SOUND = "foundSound";
public static final String PREF_FOUND_NEW_SOUND = "foundNewSound";
Expand Down Expand Up @@ -150,6 +152,10 @@ public final class ListFragment extends Fragment implements ApiListener, DialogL
public static final String ANONYMOUS = "anonymous";
public static final String WIFI_LOCK_NAME = "wigleWifiLock";

public static final String QUICK_SCAN_UNSET = "UNSET";
public static final String QUICK_SCAN_DO_NOTHING = "DO_NOTHING";
public static final String QUICK_SCAN_PAUSE = "PAUSE";

/** cross-activity communication */
public static class LameStatic {
public Location location;
Expand Down Expand Up @@ -233,24 +239,59 @@ public void setStatusUI( final View view, final String status ) {
final TextView tv = (TextView) view.findViewById( R.id.status );
tv.setText( status );
}
MainActivity ma = MainActivity.getMainActivity();
final MainActivity ma = MainActivity.getMainActivity();
if (null != ma) {
setScanningStatusIndicator(ma.isScanning());
final GifImageButton scanningImageButton = (GifImageButton) view.findViewById(R.id.scanning);
final ImageButton notScanningImageButton = (ImageButton) view.findViewById(R.id.not_scanning);
final SharedPreferences prefs = getActivity().getSharedPreferences(SHARED_PREFS, 0);

scanningImageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick( final View buttonView ) {
String quickPausePref = prefs.getString(PREF_QUICK_PAUSE, QUICK_SCAN_UNSET);
if (QUICK_SCAN_DO_NOTHING.equals(quickPausePref)) return;
if (QUICK_SCAN_PAUSE.equals(quickPausePref)) {
toggleScan();
} else {
makeQuickPausePrefDialog(ma);
}
}
});
notScanningImageButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick( final View buttonView ) {
String quickPausePref = prefs.getString(PREF_QUICK_PAUSE, QUICK_SCAN_UNSET);
if (QUICK_SCAN_DO_NOTHING.equals(quickPausePref)) return;
toggleScan();
}
});
}

}

public void toggleScan() {
final MainActivity ma = MainActivity.getMainActivity();
if (null != ma) {
final boolean scanning = !ma.isScanning();
ma.handleScanChange(scanning);
String name = ma.getString(R.string.scan) + " " + (scanning ? ma.getString(R.string.off) : ma.getString(R.string.on));
ma.setTitle(name);
handleScanChange(ma, getView());
}
}

public void setScanningStatusIndicator(boolean scanning) {
View view = getView();
if (view != null) {
final GifImageView scanningImageView = (GifImageView) view.findViewById(R.id.scanning);
final ImageView notScanningImageView = (ImageView) view.findViewById(R.id.not_scanning);
final GifImageButton scanningImageButton = (GifImageButton) view.findViewById(R.id.scanning);
final ImageButton notScanningImageButton = (ImageButton) view.findViewById(R.id.not_scanning);
if (scanning) {
scanningImageView.setVisibility(VISIBLE);
notScanningImageView.setVisibility(GONE);
scanningImageButton.setVisibility(VISIBLE);
notScanningImageButton.setVisibility(GONE);
} else {
scanningImageView.setVisibility(GONE);
notScanningImageView.setVisibility(VISIBLE);

scanningImageButton.setVisibility(GONE);
notScanningImageButton.setVisibility(VISIBLE);
}
}

Expand Down Expand Up @@ -655,6 +696,14 @@ public void makeUploadDialog(final MainActivity main) {
MainActivity.createConfirmation( ListFragment.this.getActivity(), text, MainActivity.LIST_TAB_POS, UPLOAD_DIALOG);
}

public void makeQuickPausePrefDialog(final MainActivity main) {
final String dialogText = getString(R.string.quick_pause_text);
final String checkboxText = getString(R.string.quick_pause_decision);
MainActivity.createCheckboxConfirmation(ListFragment.this.getActivity(), dialogText, checkboxText,
ListFragment.PREF_QUICK_PAUSE, ListFragment.QUICK_SCAN_PAUSE,
ListFragment.QUICK_SCAN_DO_NOTHING, MainActivity.LIST_TAB_POS, QUICK_PAUSE_DIALOG);
}

@Override
public void handleDialog(final int dialogId) {
final SharedPreferences prefs = getActivity().getSharedPreferences(ListFragment.SHARED_PREFS, 0);
Expand All @@ -672,6 +721,9 @@ public void handleDialog(final int dialogId) {
}
uploadFile( state.dbHelper );
break;
case QUICK_PAUSE_DIALOG:
MainActivity.info("quick pause callback");
toggleScan();
default:
MainActivity.warn("ListFragment unhandled dialogId: " + dialogId);
}
Expand Down
Expand Up @@ -711,22 +711,74 @@ public static ConfirmationDialog newInstance(final String message, final int tab
return frag;
}

/**
* alternate instantiation with a prefs-back checkbox inline - String prefs only
* @param message
* @param checkboxLabel
* @param tabPos
* @param dialogId
* @return
*/
public static ConfirmationDialog newInstance(final String message, final String checkboxLabel,
final String persistPrefKey,
final String persistPrefAgreeValue,
final String persistPrefDisagreeValue,
final int tabPos,
final int dialogId) {
final ConfirmationDialog frag = new ConfirmationDialog();
Bundle args = new Bundle();
args.putString("message", message);
args.putInt("tabPos", tabPos);
args.putInt("dialogId", dialogId);
args.putString("checkboxLabel", checkboxLabel);
args.putString("persistPref", persistPrefKey);
args.putString("persistPrefAgreeValue", persistPrefAgreeValue);
args.putString("persistPrefDisagreeValue", persistPrefDisagreeValue);
frag.setArguments(args);
return frag;
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Activity activity = getActivity();
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setCancelable(true);
builder.setTitle("Confirmation");
builder.setTitle("Confirmation"); //TODO: literal string
final String checkboxLabel = getArguments().containsKey("checkboxLabel") ? getArguments().getString("checkboxLabel"): null;
if (null != checkboxLabel) {
View checkBoxView = View.inflate(activity, R.layout.checkbox, null);
CheckBox checkBox = (CheckBox) checkBoxView.findViewById(R.id.checkbox);
checkBox.setText(checkboxLabel);
builder.setView(checkBoxView);
}
final String persistPrefKey = getArguments().containsKey("persistPref") ?
getArguments().getString("persistPref"): null;
final String persistPrefAgreeValue = getArguments().containsKey("persistPrefAgreeValue") ?
getArguments().getString("persistPrefAgreeValue"): null;
final String persistPrefDisagreeValue = getArguments().containsKey("persistPrefDisagreeValue") ?
getArguments().getString("persistPrefDisagreeValue"): null;

builder.setMessage(getArguments().getString("message"));
final int tabPos = getArguments().getInt("tabPos");
final int dialogId = getArguments().getInt("dialogId");
final SharedPreferences prefs = activity.getSharedPreferences( ListFragment.SHARED_PREFS, 0 );


final AlertDialog ad = builder.create();
// ok
ad.setButton(DialogInterface.BUTTON_POSITIVE, activity.getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int which) {
try {
if (null != persistPrefKey) {
CheckBox checkBox = (CheckBox) ((AlertDialog) dialog).findViewById(R.id.checkbox);
if (checkBox.isChecked()) {
final SharedPreferences.Editor editor = prefs.edit();
editor.putString(persistPrefKey, persistPrefAgreeValue);
editor.apply();
}
}
dialog.dismiss();
final Activity activity = getActivity();
if (activity == null) {
Expand All @@ -752,6 +804,14 @@ public void onClick(final DialogInterface dialog, final int which) {
@Override
public void onClick(final DialogInterface dialog, final int which) {
try {
if (null != persistPrefKey) {
CheckBox checkBox = (CheckBox) ((AlertDialog) dialog).findViewById(R.id.checkbox);
if (checkBox.isChecked()) {
final SharedPreferences.Editor editor = prefs.edit();
editor.putString(persistPrefKey, persistPrefDisagreeValue);
editor.apply();
}
}
dialog.dismiss();
} catch (Exception ex) {
// guess it wasn't there anyways
Expand Down Expand Up @@ -780,6 +840,26 @@ static void createConfirmation(final FragmentActivity activity, final String mes
}
}

static void createCheckboxConfirmation(final FragmentActivity activity, final String message,
final String checkboxLabel, final String persistPrefKey,
final String persistPrefAgreeValue,
final String persistPrefDisagreeValue,
final int tabPos, final int dialogId) {
try {
final FragmentManager fm = activity.getSupportFragmentManager();
final ConfirmationDialog dialog = ConfirmationDialog.newInstance(message, checkboxLabel,
persistPrefKey, persistPrefAgreeValue, persistPrefDisagreeValue, tabPos, dialogId);
final String tag = tabPos + "-" + dialogId + "-" + activity.getClass().getSimpleName();
info("tag: " + tag + " fm: " + fm);
dialog.show(fm, tag);
} catch (WindowManager.BadTokenException ex) {
MainActivity.info("exception showing dialog, view probably changed: " + ex, ex);
} catch (final IllegalStateException ex) {
final String errorMessage = "Exception trying to show dialog: " + ex;
MainActivity.error(errorMessage, ex);
}
}

private void setupDatabase() {
// could be set by nonconfig retain
if (state.dbHelper == null) {
Expand Down
Expand Up @@ -3,12 +3,10 @@
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
Expand All @@ -32,16 +30,12 @@
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;

import net.wigle.wigleandroid.background.ApiDownloader;
Expand Down Expand Up @@ -467,6 +461,12 @@ public void onClick( final View view ) {
"2" + min,"5" + min,"10" + min,off };
SettingsUtil.doSpinner( R.id.reset_wifi_spinner, view, ListFragment.PREF_RESET_WIFI_PERIOD,
MainActivity.DEFAULT_RESET_WIFI_PERIOD, resetPeriods, resetName, getContext() );

// prefs setting for tap-to-pause scan indicator
final String[] pauseOptions = new String[] {ListFragment.QUICK_SCAN_UNSET, ListFragment.QUICK_SCAN_PAUSE, ListFragment.QUICK_SCAN_DO_NOTHING};
final String[] pauseOptionNames = new String[] {getString(R.string.quick_pause_unset), getString(R.string.quick_pause), getString(R.string.quick_pause_do_nothing)};
SettingsUtil.doSpinner( R.id.quick_pause_spinner, view, ListFragment.PREF_QUICK_PAUSE,
ListFragment.QUICK_SCAN_UNSET, pauseOptions, pauseOptionNames, getContext() );
}

private void updateRegister(final View view) {
Expand Down
17 changes: 17 additions & 0 deletions wiglewifiwardriving/src/main/res/layout/checkbox.xml
@@ -0,0 +1,17 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingLeft="10dp">
<CheckBox
android:id="@+id/checkbox"
style="?android:attr/textAppearanceMedium"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp" />
</LinearLayout>
</FrameLayout>
10 changes: 8 additions & 2 deletions wiglewifiwardriving/src/main/res/layout/list.xml
Expand Up @@ -101,24 +101,30 @@
android:layout_height="fill_parent"
android:layout_weight="1"
>
<ImageView

<ImageButton
android:id="@+id/not_scanning"
android:background="#00000000"
android:paddingTop="1dip"
android:paddingRight="1dip"
android:paddingBottom="1dip"
android:paddingLeft="3dip"
android:layout_margin="5dip"
android:layout_width="44dip"
android:layout_height="44dip"
android:src="@android:drawable/ic_menu_close_clear_cancel"
android:visibility="gone"/>
<pl.droidsonroids.gif.GifImageView
<pl.droidsonroids.gif.GifImageButton
android:id="@+id/scanning"
android:background="#00000000"
android:paddingTop="1dip"
android:paddingRight="1dip"
android:paddingBottom="1dip"
android:paddingLeft="3dip"
android:layout_margin="5dip"
android:layout_width="44dip"
android:layout_height="44dip"
android:scaleType="fitCenter"
android:src="@drawable/signal_anim"/>
</LinearLayout>
</LinearLayout>
Expand Down
28 changes: 27 additions & 1 deletion wiglewifiwardriving/src/main/res/layout/settings.xml
Expand Up @@ -330,7 +330,33 @@
/>
</LinearLayout>

<Button android:id="@+id/speech_button" android:layout_width="wrap_content"
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
>
<Spinner android:id="@+id/quick_pause_spinner"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:drawSelectorOnTop="true"
android:layout_weight="0"
android:prompt="@string/quick_pause_text"
/>
<TextView
android:id="@+id/quick_pause_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/quick_pause_text"
android:layout_weight="1"
android:layout_marginRight="6dip"
tools:ignore="RtlHardcoded"
android:layout_gravity="left"
/>
</LinearLayout>

<Button android:id="@+id/speech_button" android:layout_width="wrap_content"
android:layout_height="0dip"
android:text="@string/speech_button" android:layout_weight="1"
android:paddingTop="10dip" android:paddingBottom="10dip"/>
Expand Down
6 changes: 6 additions & 0 deletions wiglewifiwardriving/src/main/res/values-ar/strings.xml
Expand Up @@ -304,4 +304,10 @@
<string name="error_general">خطأ</string>
<string name="no_barcode_support_text">Barcode detection not available on this device.</string>
<string name="gps_status">حالة غس</string>
<string name="quick_pause_text">وقفة / استئناف المسح عند النقر على المؤشر؟</string>
<string name="quick_pause_decision">تذكر هذا القرار</string>
<string name="quick_pause_unset">تؤكد</string>
<string name="quick_pause">وقفة</string>
<string name="quick_pause_do_nothing">لا تفعل شيئا</string>

</resources>

0 comments on commit 9a14a86

Please sign in to comment.