package org.droidplanner.android.fragments.account; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; 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.TextView; import com.geeksville.apiproxy.rest.RESTClient; import org.droidplanner.android.R; import org.droidplanner.android.activities.interfaces.AccountLoginListener; import org.droidplanner.android.utils.prefs.DroidPlannerPrefs; import org.droidplanner.android.view.NiceProgressView; import org.droidplanner.android.view.adapterViews.UserDataAdapter; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; /** * Created by Fredia Huya-Kouadio on 1/22/15. */ public class DroneshareAccountFragment extends Fragment { private static final String TAG = DroneshareAccountFragment.class.getSimpleName(); private final static String EXTRA_USER_DATA = "extra_user_data"; public final static String DRONESHARE_URL = "http://www.droneshare.com/"; private DroidPlannerPrefs dpPrefs; private JSONObject userData; private UserDataAdapter userDataAdapter; private AccountLoginListener loginListener; @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof AccountLoginListener)) { throw new IllegalStateException("Parent must implement " + AccountLoginListener.class.getName()); } loginListener = (AccountLoginListener) activity; } @Override public void onDetach() { super.onDetach(); loginListener = null; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); return inflater.inflate(R.layout.fragment_droneshare_account, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); final Context context = getActivity().getApplicationContext(); dpPrefs = DroidPlannerPrefs.getInstance(context); final String username = dpPrefs.getDroneshareLogin(); final String password = dpPrefs.getDronesharePassword(); final TextView usernameView = (TextView) view.findViewById(R.id.dshare_username); usernameView.setText(username); final String userProfileUrl = DRONESHARE_URL + "user/" + username; final TextView userUrlView = (TextView) view.findViewById(R.id.dshare_user_url); userUrlView.setText(userProfileUrl); final View userInfoBox = view.findViewById(R.id.user_info_container); userInfoBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Open the user profile on droneshare. startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(userProfileUrl))); } }); final NiceProgressView progressView = (NiceProgressView) view.findViewById(R.id.vehicle_loading_progress); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.user_vehicles_list); //Use this setting to improve performance if you know that changes in content do not change the layout side // of the RecyclerView recyclerView.setHasFixedSize(true); //Use a grid layout manager final int colCount = getResources().getInteger(R.integer.vehiclesColCount); final RecyclerView.LayoutManager gridLayoutMgr = new GridLayoutManager(context, colCount); recyclerView.setLayoutManager(gridLayoutMgr); userDataAdapter = new UserDataAdapter(context); if (savedInstanceState != null) { String userDataString = savedInstanceState.getString(EXTRA_USER_DATA); if (userDataString != null) { try { userData = new JSONObject(userDataString); userDataAdapter.updateUserData(userData); } catch (JSONException e) { Log.e(TAG, "Unable to read saved user data.", e); } } } recyclerView.setAdapter(userDataAdapter); new LoadUserData(progressView, userData == null).execute(username, password); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (userData != null) outState.putString(EXTRA_USER_DATA, userData.toString()); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_droneshare_account, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_dshare_logout: dpPrefs.setDronesharePassword(""); loginListener.onLogout(); break; default: return super.onOptionsItemSelected(item); } return true; } private class LoadUserData extends AsyncTask<String, Void, JSONObject> { private final boolean forceUpdate; private final NiceProgressView progressView; LoadUserData(NiceProgressView progressView, boolean forceUpdate) { this.progressView = progressView; this.forceUpdate = forceUpdate; } @Override protected void onPreExecute() { if(progressView != null && forceUpdate) progressView.setVisibility(View.VISIBLE); } @Override protected void onCancelled() { if(progressView != null && forceUpdate) progressView.setVisibility(View.GONE); } @Override protected JSONObject doInBackground(String... params) { final String username = params[0]; final String password = params[1]; JSONObject userData = null; try { userData = RESTClient.getUserData(username, password, dpPrefs.getDroneshareApiKey()); } catch (IOException e) { Log.e(TAG, e.getMessage(), e); } return userData; } @Override protected void onPostExecute(JSONObject result) { if(progressView != null && forceUpdate) progressView.setVisibility(View.GONE); if(loginListener == null) return; if (result == null) { if (forceUpdate) loginListener.onLogout(); } else { userData = result; userDataAdapter.updateUserData(result); } } } }