WiGLE WiFi Wardriving FOSS v2.63版本的 MD5 值为:20a157bff1dec2e81d8268d404e15cb5
以下内容为反编译后的 UploadsFragment.java 源代码,内容仅作参考
package net.wigle.wigleandroid;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.TextView;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.navigation.NavigationView;
import java.io.File;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import net.wigle.wigleandroid.background.AbstractApiRequest;
import net.wigle.wigleandroid.background.ApiDownloader;
import net.wigle.wigleandroid.background.ApiListener;
import net.wigle.wigleandroid.background.DownloadHandler;
import net.wigle.wigleandroid.model.Upload;
import net.wigle.wigleandroid.ui.EndlessScrollListener;
import net.wigle.wigleandroid.util.FileUtility;
import net.wigle.wigleandroid.util.MenuUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class UploadsFragment extends Fragment {
private static final String KEY_DOWNLOADED = "downloadedToLocal";
private static final String KEY_FILE_NAME = "fileName";
private static final String KEY_QUEUE_DEPTH = "processingQueueDepth";
private static final String KEY_STATUS = "status";
private static final String KEY_TRANSID = "transid";
private static final String KEY_UPLOADED = "uploadedFromLocal";
private static final int MENU_SITE_STATS = 201;
private static final int MENU_USER_STATS = 200;
private static final int MSG_RANKING_DONE = 100;
private static final String RESULT_LIST_KEY = "results";
private static final int ROW_COUNT = 100;
public static boolean disableListButtons = false;
private static final Map<String, String> uploadStatusMap;
private AtomicBoolean finishing;
private RankDownloadHandler handler;
private UploadsListAdapter listAdapter;
private NumberFormat numberFormat;
private static final String KEY_TOTAL_WIFI_GPS = "discoveredGps";
private static final String KEY_TOTAL_BT_GPS = "btDiscoveredGps";
private static final String KEY_TOTAL_CELL_GPS = "genDiscoveredGps";
private static final String KEY_PERCENT_DONE = "percentDone";
private static final String KEY_FILE_SIZE = "fileSize";
private static final String[] ALL_ROW_KEYS = {KEY_TOTAL_WIFI_GPS, KEY_TOTAL_BT_GPS, KEY_TOTAL_CELL_GPS, KEY_PERCENT_DONE, KEY_FILE_SIZE};
private int currentPage = 0;
private final AtomicBoolean busy = new AtomicBoolean(false);
static int access$708(UploadsFragment uploadsFragment) {
int i = uploadsFragment.currentPage;
uploadsFragment.currentPage = i + 1;
return i;
}
static {
HashMap hashMap = new HashMap();
hashMap.put("W", "upload_queued");
hashMap.put("I", "upload_parsing");
hashMap.put("T", "upload_trilaterating");
hashMap.put("S", "upload_stats");
hashMap.put("D", "upload_success");
hashMap.put("E", "upload_failed");
hashMap.put("A", "upload_archive");
hashMap.put("C", "upload_catalog");
hashMap.put("G", "upload_geoindex");
uploadStatusMap = Collections.unmodifiableMap(hashMap);
}
@Override
public void onCreate(Bundle bundle) {
MainActivity.info("UPLOADS: onCreate");
super.onCreate(bundle);
setHasOptionsMenu(true);
FragmentActivity activity = getActivity();
if (activity != null) {
MainActivity.setLocale(activity);
activity.setVolumeControlStream(3);
}
this.finishing = new AtomicBoolean(false);
NumberFormat numberInstance = NumberFormat.getNumberInstance(Locale.US);
this.numberFormat = numberInstance;
if (numberInstance instanceof DecimalFormat) {
numberInstance.setMinimumFractionDigits(0);
this.numberFormat.setMaximumFractionDigits(2);
}
}
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
MainActivity.info("UPLOADS: onCreateView. orientation: " + getResources().getConfiguration().orientation);
LinearLayout linearLayout = (LinearLayout) layoutInflater.inflate(R.layout.uploads, viewGroup, false);
setupSwipeRefresh(linearLayout);
setupListView(linearLayout);
if (getActivity() != null) {
RankDownloadHandler rankDownloadHandler = new RankDownloadHandler(linearLayout, this.numberFormat, getActivity().getPackageName(), getResources());
this.handler = rankDownloadHandler;
rankDownloadHandler.setUploadsListAdapter(this.listAdapter);
this.busy.set(false);
downloadUploads(0);
}
return linearLayout;
}
private void setupSwipeRefresh(LinearLayout linearLayout) {
((SwipeRefreshLayout) linearLayout.findViewById(R.id.uploads_swipe_container)).setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if (UploadsFragment.this.listAdapter != null) {
UploadsFragment.this.listAdapter.clear();
}
UploadsFragment.this.downloadUploads(0);
}
});
}
public void downloadUploads(int i) {
if (this.handler == null) {
MainActivity.error("downloadUploads handler is null");
}
if (this.busy.compareAndSet(false, true)) {
int i2 = i * 100;
try {
new ApiDownloader(getActivity(), ListFragment.lameStatic.dbHelper, null, "https://api.wigle.net/api/v2/file/transactions?pagestart=" + i2 + "&pageend=" + (i2 + 100), false, true, true, AbstractApiRequest.REQUEST_GET, new ApiListener() {
@Override
public void requestComplete(JSONObject jSONObject, boolean z) {
if (!z) {
UploadsFragment uploadsFragment = UploadsFragment.this;
uploadsFragment.handleUploads(jSONObject, uploadsFragment.handler);
}
UploadsFragment.this.busy.set(false);
}
}).startDownload(this);
return;
} catch (WiGLEAuthException unused) {
MainActivity.info("Transactions Download Failed due to failed auth");
return;
}
}
MainActivity.error("preventing download because previous is still in progress.");
}
private void setupListView(View view) {
FragmentActivity activity = getActivity();
if (activity != null) {
SharedPreferences sharedPreferences = activity.getSharedPreferences(ListFragment.SHARED_PREFS, 0);
UploadsListAdapter uploadsListAdapter = this.listAdapter;
if (uploadsListAdapter == null) {
this.listAdapter = new UploadsListAdapter(getActivity(), R.layout.uploadrow, sharedPreferences, this);
} else if (!uploadsListAdapter.isEmpty() && !TokenAccess.hasApiToken(sharedPreferences)) {
this.listAdapter.clear();
}
}
AbsListView absListView = (AbsListView) view.findViewById(R.id.uploads_list_view);
absListView.setAdapter((ListAdapter) this.listAdapter);
absListView.setOnScrollListener(new EndlessScrollListener() {
@Override
public boolean onLoadMore(int i, int i2) {
UploadsFragment.access$708(UploadsFragment.this);
UploadsFragment uploadsFragment = UploadsFragment.this;
uploadsFragment.downloadUploads(uploadsFragment.currentPage);
return true;
}
});
}
private String statusValue(String str) {
int identifier = getResources().getIdentifier("upload_unknown", "string", BuildConfig.APPLICATION_ID);
Map<String, String> map = uploadStatusMap;
if (map.containsKey(str)) {
identifier = getResources().getIdentifier(map.get(str), "string", BuildConfig.APPLICATION_ID);
}
return getString(identifier);
}
public static final class RankDownloadHandler extends DownloadHandler {
private final AtomicBoolean lockListAdapter;
private UploadsListAdapter uploadsListAdapter;
private RankDownloadHandler(View view, NumberFormat numberFormat, String str, Resources resources) {
super(view, numberFormat, str, resources);
this.lockListAdapter = new AtomicBoolean(false);
}
public void setUploadsListAdapter(UploadsListAdapter uploadsListAdapter) {
this.uploadsListAdapter = uploadsListAdapter;
}
@Override
public void handleMessage(Message message) {
Bundle data = message.getData();
ArrayList parcelableArrayList = data.getParcelableArrayList(UploadsFragment.RESULT_LIST_KEY);
if (message.what != 100 || parcelableArrayList == null || this.uploadsListAdapter == null) {
return;
}
if (this.lockListAdapter.compareAndSet(false, true)) {
try {
((TextView) this.view.findViewById(R.id.queue_depth)).setText(this.resources.getString(R.string.queue_depth) + ": " + data.getString(UploadsFragment.KEY_QUEUE_DEPTH));
this.uploadsListAdapter.clear();
Iterator it = parcelableArrayList.iterator();
while (it.hasNext()) {
Parcelable parcelable = (Parcelable) it.next();
if (parcelable instanceof Bundle) {
Bundle bundle = (Bundle) parcelable;
this.uploadsListAdapter.add(new Upload(bundle.getString(UploadsFragment.KEY_TRANSID), bundle.getLong(UploadsFragment.KEY_TOTAL_WIFI_GPS), bundle.getLong(UploadsFragment.KEY_TOTAL_BT_GPS), bundle.getLong(UploadsFragment.KEY_TOTAL_CELL_GPS), (int) bundle.getLong(UploadsFragment.KEY_PERCENT_DONE), bundle.getString("status"), bundle.getLong(UploadsFragment.KEY_FILE_SIZE), bundle.getString(UploadsFragment.KEY_FILE_NAME), Boolean.valueOf(bundle.getBoolean(UploadsFragment.KEY_UPLOADED)), Boolean.valueOf(bundle.getBoolean(UploadsFragment.KEY_DOWNLOADED))));
}
}
} finally {
this.lockListAdapter.set(false);
((SwipeRefreshLayout) this.view.findViewById(R.id.uploads_swipe_container)).setRefreshing(false);
}
}
}
}
public void handleUploads(JSONObject jSONObject, Handler handler) {
String str;
boolean z;
String str2 = "status";
String str3 = KEY_QUEUE_DEPTH;
String str4 = RESULT_LIST_KEY;
if (jSONObject == null) {
MainActivity.info("handleUploads null json, returning");
return;
}
Bundle bundle = new Bundle();
try {
JSONArray jSONArray = jSONObject.getJSONArray(RESULT_LIST_KEY);
ArrayList<? extends Parcelable> arrayList = new ArrayList<>(100);
List<File> csvUploadsAndDownloads = FileUtility.getCsvUploadsAndDownloads(getContext());
int i = 0;
while (i < jSONArray.length()) {
JSONObject jSONObject2 = jSONArray.getJSONObject(i);
Bundle bundle2 = new Bundle();
String[] strArr = ALL_ROW_KEYS;
int length = strArr.length;
JSONArray jSONArray2 = jSONArray;
int i2 = 0;
while (i2 < length) {
int i3 = length;
String str5 = strArr[i2];
bundle2.putLong(str5, jSONObject2.getLong(str5));
i2++;
length = i3;
str3 = str3;
str4 = str4;
}
String str6 = str3;
String str7 = str4;
String string = jSONObject2.getString(KEY_TRANSID);
bundle2.putString(KEY_TRANSID, string);
String string2 = jSONObject2.getString(KEY_FILE_NAME);
bundle2.putString(KEY_FILE_NAME, string2);
bundle2.putString(str2, statusValue(jSONObject2.getString(str2)));
arrayList.add(bundle2);
String str8 = string2 + FileUtility.GZ_EXT;
int i4 = 0;
while (true) {
str = str2;
if (i4 >= csvUploadsAndDownloads.size()) {
z = false;
break;
}
File file = csvUploadsAndDownloads.get(i4);
if (str8.contains(file.getName())) {
bundle2.putBoolean(KEY_UPLOADED, true);
bundle2.putBoolean(KEY_DOWNLOADED, false);
csvUploadsAndDownloads.remove(i4);
z = true;
break;
} else if (file.getName().startsWith(string)) {
bundle2.putBoolean(KEY_UPLOADED, false);
z = true;
bundle2.putBoolean(KEY_DOWNLOADED, true);
csvUploadsAndDownloads.remove(i4);
break;
} else {
i4++;
str2 = str;
}
}
if (!z) {
bundle2.putBoolean(KEY_UPLOADED, false);
bundle2.putBoolean(KEY_DOWNLOADED, false);
}
i++;
jSONArray = jSONArray2;
str2 = str;
str3 = str6;
str4 = str7;
}
String str9 = str3;
bundle.putParcelableArrayList(str4, arrayList);
bundle.putString(str9, jSONObject.getString(str9));
} catch (JSONException e) {
MainActivity.error("json error: " + e, e);
} catch (Exception e2) {
MainActivity.error("uploads error: " + e2, e2);
}
Message message = new Message();
message.setData(bundle);
message.what = 100;
handler.sendMessage(message);
this.busy.set(false);
}
@Override
public void onDestroy() {
MainActivity.info("UPLOADS: onDestroy");
this.finishing.set(true);
super.onDestroy();
}
@Override
public void onResume() {
MainActivity.info("UPLOADS: onResume");
super.onResume();
this.busy.set(false);
if (getActivity() != null) {
getActivity().setTitle(R.string.uploads_app_name);
}
}
@Override
public void onStart() {
MainActivity.info("UPLOADS: onStart");
super.onStart();
}
@Override
public void onPause() {
MainActivity.info("UPLOADS: onPause");
super.onPause();
}
@Override
public void onStop() {
MainActivity.info("UPLOADS: onStop");
super.onStop();
}
@Override
public void onConfigurationChanged(Configuration configuration) {
MainActivity.info("UPLOADS: config changed");
super.onConfigurationChanged(configuration);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
MenuItem add = menu.add(0, 200, 0, getString(R.string.user_stats_app_name));
add.setIcon(17301576);
MenuItemCompat.setShowAsAction(add, 1);
menu.add(0, 200, 0, getString(R.string.user_stats_app_name)).setIcon(17301576);
MenuItem add2 = menu.add(0, MENU_SITE_STATS, 0, getString(R.string.site_stats_app_name));
add2.setIcon(R.drawable.wiglewifi_small_black_white);
MenuItemCompat.setShowAsAction(add2, 1);
menu.add(0, MENU_SITE_STATS, 0, getString(R.string.site_stats_app_name)).setIcon(R.drawable.wiglewifi_small_black_white);
super.onCreateOptionsMenu(menu, menuInflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
MainActivity mainActivity = MainActivity.getMainActivity();
FragmentActivity activity = getActivity();
if (activity != null) {
NavigationView navigationView = (NavigationView) activity.findViewById(R.id.left_drawer);
int itemId = menuItem.getItemId();
if (itemId == 200) {
MenuUtil.selectStatsSubmenuItem(navigationView, mainActivity, R.id.nav_user_stats);
return true;
} else if (itemId != MENU_SITE_STATS) {
return false;
} else {
MenuUtil.selectStatsSubmenuItem(navigationView, mainActivity, R.id.nav_site_stats);
return true;
}
}
return false;
}
}