package org.goodev.discourse; import android.content.ContentValues; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.NavUtils; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import org.goodev.discourse.contentprovider.Provider; import org.goodev.discourse.database.tables.SiteTable; import org.goodev.discourse.database.tables.UserInfoTable; import org.goodev.discourse.ui.AddSiteFragment; import org.goodev.discourse.ui.AddSiteFragment.AddSiteListener; import org.goodev.discourse.ui.AddUserFragment.AddUserListener; import org.goodev.discourse.ui.CheckLoginInfoFragment; import org.goodev.discourse.ui.CheckLoginInfoFragment.CheckLoginInfoCallback; import org.goodev.discourse.ui.CheckUrlFragment; import org.goodev.discourse.ui.CheckUrlFragment.CheckUrlCallback; import org.goodev.discourse.ui.ProgressFragment; import org.goodev.discourse.ui.SettingsFragment; import org.goodev.discourse.utils.L; import org.goodev.discourse.utils.MCrypt; import org.goodev.discourse.utils.Utils; import java.net.MalformedURLException; import java.net.URL; public class SettingsActivity extends FragmentActivity implements AddSiteListener, AddUserListener, CheckUrlCallback, CheckLoginInfoCallback { private static final String FRAG_TAG = "fragment_tag"; private Fragment mFragment; private String mCurrentSiteUrl; private String mName; private String mPassword; private boolean mRememberLoginInfo; private CheckUrlFragment mCheckUrlFragment; private String mSiteName; private String mSiteUrl; private ProgressFragment mProgressFragment; private CheckLoginInfoFragment mCheckLoginFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_settings); setupActionBar(); if (savedInstanceState == null) { mFragment = new SettingsFragment(); getSupportFragmentManager().beginTransaction().add(android.R.id.content, mFragment, FRAG_TAG).commit(); } else { mFragment = getSupportFragmentManager().findFragmentByTag(FRAG_TAG); } } private void setupActionBar() { getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.settings, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // This ID represents the Home or Up button. In the case of this // activity, the Up button is shown. Use NavUtils to allow users // to navigate up one level in the application structure. For // more details, see the Navigation pattern on Android Design: // // http://developer.android.com/design/patterns/navigation.html#up-vs-back // NavUtils.navigateUpFromSameTask(this); return true; case R.id.action_add_website: showAddSiteDialog(); return true; } return super.onOptionsItemSelected(item); } private void showAddSiteDialog() { new AddSiteFragment().show(getSupportFragmentManager(), "add_site_tag"); } @Override public void add(String name, String url) { if (TextUtils.isEmpty(url)) { Toast.makeText(this, R.string.add_site_url_is_empty, Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(name)) { name = url; } if (url.startsWith(Utils.HTTP_PREFIX) || url.startsWith(Utils.HTTPS_PREFIX)) { // nothing } else { url = Utils.HTTP_PREFIX + url; } if (!url.endsWith(Utils.SLASH)) { url = url + Utils.SLASH; } mSiteName = name; mSiteUrl = url; try { URL urlTest = new URL(url); } catch (MalformedURLException e) { Toast.makeText(this, R.string.add_site_url_error, Toast.LENGTH_LONG).show(); return; } FragmentManager manager = getSupportFragmentManager(); if (mCheckUrlFragment != null) { manager.beginTransaction().remove(mCheckUrlFragment).commit(); } mCheckUrlFragment = new CheckUrlFragment(); Bundle args = new Bundle(); args.putString(Utils.EXTRA_URL, url); mCheckUrlFragment.setArguments(args); manager.beginTransaction().add(mCheckUrlFragment, "check_url").commit(); } @Override public void onPreExecute() { mProgressFragment = new ProgressFragment(); mProgressFragment.show(getSupportFragmentManager(), "progress"); } @Override public void onResult(boolean ok) { getSupportFragmentManager().beginTransaction().remove(mProgressFragment).commit(); if (ok) { saveSite(); } else { Toast.makeText(this, getString(R.string.add_site_url_error, mSiteUrl), Toast.LENGTH_LONG).show(); } } private void saveSite() { Cursor cursor = getContentResolver().query(Provider.SITE_CONTENT_URI, SiteTable.ALL_COLUMNS, SiteTable.URL + " = \"" + mSiteUrl + "\"", null, null); if (cursor.getCount() > 0) { Toast.makeText(this, getString(R.string.add_site_is_exist, mSiteUrl), Toast.LENGTH_LONG).show(); return; } else { ContentValues values = new ContentValues(); values.put(SiteTable.TITLE, mSiteName); values.put(SiteTable.URL, mSiteUrl); getContentResolver().insert(Provider.SITE_CONTENT_URI, values); } } public void setCurrentSite(String url) { mCurrentSiteUrl = url; } @Override public void add(String name, String password, boolean remember) { if (TextUtils.isEmpty(name) || TextUtils.isEmpty(password)) { Toast.makeText(this, R.string.name_and_password_is_empty, Toast.LENGTH_LONG).show(); return; } if (TextUtils.isEmpty(mCurrentSiteUrl)) { return; } mRememberLoginInfo = remember; mName = name; mPassword = password; FragmentManager manager = getSupportFragmentManager(); if (mCheckLoginFragment != null) { manager.beginTransaction().remove(mCheckLoginFragment).commit(); } mCheckLoginFragment = new CheckLoginInfoFragment(); Bundle args = new Bundle(); args.putString(Utils.EXTRA_URL, mCurrentSiteUrl); args.putString(Utils.EXTRA_NAME, name); args.putString(Utils.EXTRA_PASSWORD, password); mCheckLoginFragment.setArguments(args); manager.beginTransaction().add(mCheckLoginFragment, "check_user").commit(); } private void saveLoginInfo(String name, String password) { App.setUserInfo(name, password); if (mRememberLoginInfo) { Cursor cursor = getContentResolver().query(Provider.SITE_CONTENT_URI, SiteTable.ALL_COLUMNS, SiteTable.URL + " = \"" + mCurrentSiteUrl + "\"", null, null); if (cursor.moveToFirst()) { long id = cursor.getLong(cursor.getColumnIndex(SiteTable.ID)); ContentValues values = new ContentValues(); values.put(UserInfoTable.NAME, name); String crypto; try { crypto = MCrypt.bytesToHex(new MCrypt().encrypt(password)); L.i("p: '%s' c: '%s'", password, crypto); } catch (Exception e) { crypto = password; } values.put(UserInfoTable.PASSWORD, crypto); values.put(UserInfoTable.SITEID, id); values.put(UserInfoTable.SITEURL, mCurrentSiteUrl); getContentResolver().insert(Provider.USERINFO_CONTENT_URI, values); } } } @Override public void onPreCheckExecute() { mProgressFragment = new ProgressFragment(); mProgressFragment.show(getSupportFragmentManager(), "progress"); } @Override public void onCheckResult(boolean ok) { getSupportFragmentManager().beginTransaction().remove(mProgressFragment).commit(); if (ok) { saveLoginInfo(mName, mPassword); } else { Toast.makeText(this, R.string.name_and_password_is_error, Toast.LENGTH_LONG).show(); } } }