/* * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * */ package com.odoo; import java.util.ArrayList; import java.util.List; import android.accounts.Account; import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SyncAdapterType; import android.graphics.Color; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.Toast; import com.odoo.addons.mail.MailDetail; import com.odoo.addons.mail.widgets.MailWidget; import com.odoo.auth.OdooAccountManager; import com.odoo.base.account.AccountsDetail; import com.odoo.base.account.UserProfile; import com.odoo.base.ir.IrModel; import com.odoo.base.login_signup.AccountCreate; import com.odoo.base.login_signup.LoginSignup; import com.odoo.orm.OColumn; import com.odoo.support.OUser; import com.odoo.support.fragment.AsyncTaskListener; import com.odoo.support.fragment.FragmentListener; import com.odoo.util.PreferenceManager; import com.odoo.util.drawer.DrawerItem; import com.odoo.widgets.WidgetHelper; /** * The Class MainActivity. */ public class MainActivity extends BaseActivity implements FragmentListener { private static final String TAG = "com.odoo.MainActivity"; private static final int RESULT_SETTINGS = 1; private Context mContext = null; private boolean mNewFragment = false; private FragmentManager mFragment = null; private OTouchListener mTouchAttacher; private boolean mTwoPane; private OUser mAccount = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getActionbar().setIcon(R.drawable.ic_odoo_o); mContext = this; mFragment = getSupportFragmentManager(); initTouchListener(); if (OUser.current(mContext) != null && savedInstanceState == null) { IrModel models = new IrModel(mContext); if (models.count() <= 0) { // Database cleaned so re-creating database updateAccount(); } else { onTaskDone(savedInstanceState); } } else { onTaskDone(savedInstanceState); } } private void updateAccount() { OUser userdata = OUser.current(mContext); if (userdata != null) { AccountCreate account = new AccountCreate(); Bundle args = new Bundle(); args.putBoolean("no_config_wizard", true); args.putAll(userdata.getAsBundle()); account.setArguments(args); startMainFragment(account, false); } else { List<OUser> accounts = OdooAccountManager.fetchAllAccounts(this); if (accounts.size() <= 0) { getActionbar().setDisplayHomeAsUpEnabled(false); getActionbar().setDisplayShowTitleEnabled(false); getActionbar().setHomeButtonEnabled(false); initDrawerControls(); lockDrawer(true); LoginSignup loginSignUp = new LoginSignup(); startMainFragment(loginSignUp, false); } } } public void onTaskDone(Bundle savedInstanceState) { initDrawerControls(); if (findViewById(R.id.fragment_detail_container) != null) { findViewById(R.id.fragment_detail_container).setVisibility( View.GONE); mTwoPane = true; } if (savedInstanceState != null) { return; } init(); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); if (OUser.current(mContext) != null && !isNewAccountRequest() && !intentRequests()) { populateNavDrawer(savedInstanceState); setupAccountBox(); if (savedInstanceState != null) { setDrawerItemPosition(savedInstanceState .getInt("current_drawer_item")); } else { if (OdooAccountManager.isAnyUser(mContext)) { setDrawerItemPosition((getDrawerItemPosition() < 0) ? 0 : getDrawerItemPosition()); onNavDrawerItemClicked( getDrawerItem(getDrawerItemPosition()), savedInstanceState); } } } } private void init() { Log.d(TAG, "MainActivity->init()"); /** * checks for available account related to Odoo */ App app = (App) getApplicationContext(); if (app.appInstalled("com.openerp")) { showUpgradeDialog(); } else { if (!OdooAccountManager.hasAccounts(this) || isNewAccountRequest()) { getActionbar().setDisplayHomeAsUpEnabled(false); getActionbar().setHomeButtonEnabled(false); lockDrawer(true); LoginSignup loginSignUp = new LoginSignup(); startMainFragment(loginSignUp, false); } else { lockDrawer(false); /** * User found but not logged in. Requesting for login with * available accounts. */ if (!OdooAccountManager.isAnyUser(mContext)) { accountSelectionDialog( OdooAccountManager.fetchAllAccounts(mContext)) .show(); } } } } private void showUpgradeDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Uninstall required"); builder.setMessage("Please uninstall older version of Odoo Messaging"); builder.setCancelable(false); builder.setPositiveButton("Uninstall now", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { OdooAccountManager.removeAllAccounts(getApplicationContext()); Uri packageUri = Uri.parse("package:com.openerp"); Intent uninstallIntent = new Intent( Intent.ACTION_UNINSTALL_PACKAGE, packageUri); startActivity(uninstallIntent); finish(); } }); builder.setNegativeButton("Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); builder.show(); } private void initTouchListener() { mTouchAttacher = new OTouchListener(this); } private String[] accountList(List<OUser> accounts) { String[] account_list = new String[accounts.size()]; int i = 0; for (OUser user : accounts) { account_list[i] = user.getAndroidName(); i++; } return account_list; } private Dialog accountSelectionDialog(final List<OUser> accounts) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.title_select_account) .setSingleChoiceItems(accountList(accounts), 1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mAccount = accounts.get(which); } }) .setNeutralButton(R.string.label_new, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { getActionbar().setDisplayHomeAsUpEnabled(false); getActionbar().setDisplayShowTitleEnabled(false); getActionbar().setHomeButtonEnabled(false); LoginSignup loginSignUp = new LoginSignup(); startMainFragment(loginSignUp, false); } }) // Set the action buttons .setPositiveButton(R.string.label_login, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { if (mAccount != null) { OdooAccountManager.loginUser(mContext, mAccount.getAndroidName()); onPostCreate(null); } else { Toast.makeText(mContext, "Please select account", Toast.LENGTH_LONG).show(); } init(); } }) .setNegativeButton(R.string.label_cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { finish(); } }); return builder.create(); } public boolean onSettingItemSelected(SettingKeys key) { switch (key) { case GLOBAL_SETTING: Intent i = new Intent(this, SettingActivity.class); startActivityForResult(i, RESULT_SETTINGS); return true; case ACCOUNTS: AccountsDetail acFragment = new AccountsDetail(); startMainFragment(acFragment, true); return true; case PROFILE: // UserProfile profileFragment = new UserProfile(); // startMainFragment(profileFragment, true); Intent intent = new Intent(this, UserProfile.class); startActivity(intent); return true; default: return true; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case RESULT_SETTINGS: updateSyncSettings(); break; } } private void updateSyncSettings() { Log.d(TAG, "MainActivity->updateSyncSettings()"); PreferenceManager mPref = new PreferenceManager(mContext); int sync_interval = mPref.getInt("sync_interval", 1440); List<String> default_authorities = new ArrayList<String>(); default_authorities.add("com.android.calendar"); default_authorities.add("com.android.contacts"); SyncAdapterType[] list = ContentResolver.getSyncAdapterTypes(); Account mAccount = OdooAccountManager.getAccount(mContext, OUser .current(mContext).getAndroidName()); for (SyncAdapterType lst : list) { if (lst.authority.contains("com.odoo") && lst.authority.contains("providers")) { default_authorities.add(lst.authority); } } for (String authority : default_authorities) { boolean isSyncActive = ContentResolver.getSyncAutomatically( mAccount, authority); if (isSyncActive) { setSyncPeriodic(authority, sync_interval, 60, 1); } } Toast.makeText(this, R.string.toast_setting_saved, Toast.LENGTH_LONG) .show(); } /* Called whenever we call invalidateOptionsMenu() */ @Override public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } public OTouchListener getTouchAttacher() { return mTouchAttacher; } /** * Sets the auto sync. * * @param authority * the authority * @param isON * the is on */ public void setAutoSync(String authority, boolean isON) { try { Account account = OdooAccountManager.getAccount(this, OUser .current(mContext).getAndroidName()); if (!ContentResolver.isSyncActive(account, authority)) { ContentResolver.setSyncAutomatically(account, authority, isON); } } catch (NullPointerException eNull) { } } /** * Request sync. * * @param authority * the authority * @param bundle * the extra data */ public void requestSync(String authority, Bundle bundle) { Account account = OdooAccountManager.getAccount( getApplicationContext(), OUser.current(getApplicationContext()) .getAndroidName()); Bundle settingsBundle = new Bundle(); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); settingsBundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); if (bundle != null) { settingsBundle.putAll(bundle); } ContentResolver.requestSync(account, authority, settingsBundle); } /** * Request sync. * * @param authority * the authority */ public void requestSync(String authority) { requestSync(authority, null); } /** * Sets the sync periodic. * * @param authority * the authority * @param interval_in_minute * the interval_in_minute * @param seconds_per_minute * the seconds_per_minute * @param milliseconds_per_second * the milliseconds_per_second */ public void setSyncPeriodic(String authority, long interval_in_minute, long seconds_per_minute, long milliseconds_per_second) { Account account = OdooAccountManager.getAccount(this, OUser.current(mContext).getAndroidName()); Bundle extras = new Bundle(); this.setAutoSync(authority, true); ContentResolver.setIsSyncable(account, authority, 1); final long sync_interval = interval_in_minute * seconds_per_minute * milliseconds_per_second; ContentResolver.addPeriodicSync(account, authority, extras, sync_interval); } /** * Cancel sync. * * @param authority * the authority */ public void cancelSync(String authority) { Account account = OdooAccountManager.getAccount(this, OUser.current(mContext).getAndroidName()); ContentResolver.cancelSync(account, authority); } @Override public void loadFragment(DrawerItem item) { Object frag = item.getFragmentInstace(); if (frag instanceof Fragment) { Fragment fragment = (Fragment) frag; if (item.getTagColor() != null && !fragment.getArguments().containsKey("tag_color")) { Bundle tagcolor = fragment.getArguments(); tagcolor.putInt("tag_color", Color.parseColor(item.getTagColor())); fragment.setArguments(tagcolor); } frag = fragment; } loadFragment(frag); } private void loadFragment(Object instance) { if (instance instanceof Intent) { startActivity((Intent) instance); } else { Fragment fragment = (Fragment) instance; if (fragment.getArguments() != null && fragment.getArguments().containsKey("settings")) { onSettingItemSelected(SettingKeys.valueOf(fragment .getArguments().get("settings").toString())); } if (fragment != null && !fragment.getArguments().containsKey("settings")) { startMainFragment(fragment, false); } } } public DrawerItem getNavItem() { if (getCurrentPosition() != -1) return getDrawerItem(getCurrentPosition()); return null; } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("current_drawer_item", getDrawerItemPosition()); super.onSaveInstanceState(outState); } @Override public void startMainFragment(Fragment fragment, boolean addToBackState) { Log.d(TAG, "MainActivity->FragmentListener->startMainFragment()"); int container_id = R.id.fragment_container; if (isTwoPane()) { findViewById(R.id.fragment_detail_container).setVisibility( View.GONE); Fragment detail = mFragment.findFragmentByTag("detail_fragment"); if (detail != null && !mNewFragment && !detail.isInLayout()) { startDetailFragment(recreateFragment(detail)); } } if (mFragment.findFragmentByTag("main_fragment") != null) { mFragment.popBackStack("main_fragment", FragmentManager.POP_BACK_STACK_INCLUSIVE); mFragment.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } FragmentTransaction tran = mFragment.beginTransaction().replace( container_id, fragment, "main_fragment"); tran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if (addToBackState) { tran.addToBackStack(null); } tran.commitAllowingStateLoss(); } @Override public void startDetailFragment(Fragment fragment) { Log.d(TAG, "MainActivity->FragmentListener->startDetailFragment()"); int container_id = (isTwoPane()) ? R.id.fragment_detail_container : R.id.fragment_container; FragmentTransaction tran = mFragment.beginTransaction().replace( container_id, fragment, "detail_fragment"); tran.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if (!isTwoPane()) { tran.addToBackStack(null); tran.commit(); } else { findViewById(R.id.fragment_detail_container).setVisibility( View.VISIBLE); tran.commitAllowingStateLoss(); } } private Fragment recreateFragment(Fragment fragment) { Log.d(TAG, "recreateFragment()"); Fragment newInstance = null; try { Fragment.SavedState savedState = mFragment .saveFragmentInstanceState(fragment); newInstance = fragment.getClass().newInstance(); newInstance.setInitialSavedState(savedState); } catch (Exception e) { e.printStackTrace(); } return newInstance; } @Override public void restart() { Log.d(TAG, "MainActivity->FragmentListener->restart()"); getIntent().putExtra("create_new_account", false); init(); } @Override public boolean isTwoPane() { return mTwoPane; } @Override protected boolean intentRequests() { /** * TODO: handle intent request from outside */ if (getIntent().getAction() != null && !getIntent().getAction().toString() .equalsIgnoreCase("android.intent.action.MAIN")) { lockDrawer(false); /** * TODO: handle widget fragment requests. */ if (getIntent().getAction().equals( MailWidget.ACTION_MESSAGE_WIDGET_CALL)) { String key = getIntent().getExtras().getString( WidgetHelper.EXTRA_WIDGET_ITEM_KEY); if (key.equals("message_detail")) { MailDetail detail = new MailDetail(); Bundle bundle = new Bundle(); bundle.putInt(OColumn.ROW_ID, getIntent().getExtras() .getInt(WidgetHelper.EXTRA_WIDGET_DATA_VALUE)); detail.setArguments(bundle); startMainFragment(detail, false); return true; } } } return false; } public void setViewAutoHide(ListView listView, View view) { registerHideableHeaderView(view); enableActionBarAutoHide(listView); hideActionBar(false); } public void setActionbarAutoHide(ListView listView) { Log.v(TAG, "setActionbarAutoHide"); enableActionBarAutoHide(listView); hideActionBar(true); } /** * AsyncTask quick task helper */ public class BackgroundTask extends AsyncTask<Void, Void, Object> { AsyncTaskListener mListener = null; public BackgroundTask(AsyncTaskListener listener) { mListener = listener; } @Override protected Object doInBackground(Void... params) { if (mListener != null) { return mListener.onPerformTask(); } return null; } @Override protected void onPostExecute(Object result) { super.onPostExecute(result); if (mListener != null) { mListener.onFinish(result); mListener = null; } } } public BackgroundTask newBackgroundTask(AsyncTaskListener taskListener) { return new BackgroundTask(taskListener); } }