/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package my.home.lehome.activity; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.nfc.NfcAdapter; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import my.home.common.util.PrefUtil; import my.home.lehome.R; import my.home.lehome.asynctask.LoadProfileHeaderBgAsyncTask; import my.home.lehome.fragment.ChatFragment; import my.home.lehome.fragment.FindMyTagFragment; import my.home.lehome.fragment.GeoFencingFragment; import my.home.lehome.fragment.HomeStateFragment; import my.home.lehome.fragment.MessageFragment; import my.home.lehome.fragment.ShortcutFragment; import my.home.lehome.mvp.presenters.MainActivityPresenter; import my.home.lehome.mvp.views.ActionBarControlView; import my.home.lehome.mvp.views.MainActivityView; import my.home.lehome.service.LocalMessageService; import my.home.lehome.util.Constants; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, ActionBarControlView, MainActivityView { public static final String TAG = "MainActivity"; public static final String EXTRA_IMAGE_INTENTS = "EXTRA_IMAGE_INTENTS"; public static boolean STOPPED = false; public static boolean VISIBLE = false; private final String CHAT_FRAGMENT_TAG = "CHAT_FRAGMENT_TAG"; private final String SHORTCUT_FRAGMENT_TAG = "SHORTCUT_FRAGMENT_TAG"; private final String FIND_TAG_FRAGMENT_TAG = "FIND_TAG_FRAGMENT_TAG"; private final String HOME_STATE_FRAGMENT_TAG = "HOME_STATE_FRAGMENT_TAG"; private final String GEO_FENCING_FRAGMENT_TAG = "GEO_FENCING_FRAGMENT_TAG"; private final String MESSAGE_FRAGMENT_TAG = "MESSAGE_FRAGMENT_TAG"; private static final String PREF_KEY_LAST_OPEN_FRAGMENT_INDEX = "PREF_KEY_LAST_OPEN_FRAGMENT_INDEX"; private ActionBar mActionBar; private int mActionBarHeight; private int mCurrentNavindex = -1; private boolean doubleBackToExitPressedOnce; private MainActivityPresenter mMainActivityPresenter; private boolean mInVolumeDown = false; private DrawerLayout mDrawer; private NavigationView mNavigationView; private Uri mSelectedNavHeaderImageUri; private int SELECT_PICTURE_REQUEST_CODE = 111; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getIntent() != null && getIntent().getAction() != null) { String action = getIntent().getAction(); if (action.equals(WakeupActivity.INTENT_VOICE_COMMAND)) { Window wind = this.getWindow(); wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } else if (action.equals(LocalMessageService.LOCAL_MESSAGE_SERVICE_NOTIFICATION_ACTION)) { PrefUtil.setIntValue(this, PREF_KEY_LAST_OPEN_FRAGMENT_INDEX, 0); } } this.setupViews(null); STOPPED = false; if (savedInstanceState != null) { if (savedInstanceState.getParcelable(MainActivity.EXTRA_IMAGE_INTENTS) != null) { mSelectedNavHeaderImageUri = savedInstanceState.getParcelable(MainActivity.EXTRA_IMAGE_INTENTS); } } mMainActivityPresenter = new MainActivityPresenter(this); mMainActivityPresenter.start(); mMainActivityPresenter.onActivityCreate(this); } @Override public void setupViews(View rootView) { final TypedArray styledAttributes = getTheme().obtainStyledAttributes( new int[]{android.R.attr.actionBarSize}); mActionBarHeight = (int) styledAttributes.getDimension(0, 0); styledAttributes.recycle(); this.setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mActionBar = getSupportActionBar(); mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, mDrawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); InputMethodManager inputManager = (InputMethodManager) MainActivity.this. getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow( MainActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); resetNavProfileName(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); } }; mDrawer.setDrawerListener(toggle); toggle.syncState(); mNavigationView = (NavigationView) findViewById(R.id.nav_view); mNavigationView.setNavigationItemSelectedListener(this); mNavigationView.findViewById(R.id.nav_profile_headerview).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { openImageIntent(); } }); TextView detailTextView = (TextView) mNavigationView.findViewById(R.id.nav_profile_detail_textview); detailTextView.setText(this.getString(R.string.title_remote_msg_mode)); String profileImagePath = PrefUtil.getStringValue(MainActivity.this, LoadProfileHeaderBgAsyncTask.PREF_KEY_PROFILE_IMAGE, null); if (profileImagePath != null) { Uri uri = Uri.parse(profileImagePath); ImageView iconImageView = (ImageView) mNavigationView.findViewById(R.id.nav_profile_icon); ProgressBar progressBar = (ProgressBar) findViewById(R.id.load_profile_icon_progressBar); new LoadProfileHeaderBgAsyncTask(MainActivity.this, iconImageView, progressBar).execute(uri); } selectNavFragment(PrefUtil.getIntValue(this, PREF_KEY_LAST_OPEN_FRAGMENT_INDEX, 0)); } private void resetNavProfileName() { TextView nameTextView = (TextView) mNavigationView.findViewById(R.id.nav_profile_name_textview); String myName = PrefUtil.getStringValue(this, "pref_client_id", ""); nameTextView.setText(myName); } @Override protected void onDestroy() { mMainActivityPresenter.stop(); mMainActivityPresenter.onActivityDestory(this); // recycle navigator icon ImageView iconImageView = (ImageView) mNavigationView.findViewById(R.id.nav_profile_icon); Drawable drawable = iconImageView.getDrawable(); if (drawable != null && drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap(); if (bitmap != null) bitmap.recycle(); iconImageView.setImageBitmap(null); } super.onDestroy(); } @Override protected void onResume() { super.onResume(); MainActivity.VISIBLE = true; if (mMainActivityPresenter != null) mMainActivityPresenter.onActivityResume(this); if (getIntent() != null && getIntent().getAction().equals(WakeupActivity.INTENT_VOICE_COMMAND)) { Window wind = this.getWindow(); wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); if (mCurrentNavindex != 0) { selectNavFragment(0); } if (!getChatFragment().isRecognizing()) { Log.d(TAG, "get intent, startRecognize."); Message msg = ChatFragment.PublicHandler .obtainMessage(ChatFragment.MSG_TYPE_VOICE_CMD); ChatFragment.PublicHandler.sendMessageDelayed(msg, 500); } } } @Override protected void onPause() { super.onPause(); MainActivity.VISIBLE = false; } @Override protected void onStart() { mMainActivityPresenter.onActivityStart(this); super.onStart(); } @Override protected void onStop() { mMainActivityPresenter.onActivityStop(this); super.onStop(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (TextUtils.isEmpty(intent.getAction())) { Log.d(TAG, "null action intent:" + intent); return; } Log.d(TAG, "onNewIntent: " + intent.getAction()); setIntent(intent); if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) { mMainActivityPresenter.handleNfcNdefIntent(intent); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putParcelable(MainActivity.EXTRA_IMAGE_INTENTS, mSelectedNavHeaderImageUri); super.onSaveInstanceState(outState); } public void onFragmentAttached(int id) { mCurrentNavindex = id; } @Override public boolean onCreateOptionsMenu(Menu menu) { switch (mCurrentNavindex) { case 0: getMenuInflater().inflate(R.menu.main, menu); break; case 1: getMenuInflater().inflate(R.menu.shortcut, menu); break; case 2: getMenuInflater().inflate(R.menu.find_my_tag, menu); break; default: break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == Constants.SETTINGS_ACTIVITY_RESULT_CODE && data != null) { if (!mMainActivityPresenter.onSettingsActivityResult(resultCode, data)) Toast.makeText(this, getResources().getString(R.string.error_local_msg_service), Toast.LENGTH_SHORT).show(); resetNavProfileName(); } else if (requestCode == SELECT_PICTURE_REQUEST_CODE) { mMainActivityPresenter.onNavHeaderChooserActivityResult(data, mSelectedNavHeaderImageUri); } } } @Override public void onBackPressed() { if (doubleBackToExitPressedOnce) { super.onBackPressed(); return; } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { this.doubleBackToExitPressedOnce = true; Toast.makeText(getApplicationContext(), getResources().getString(R.string.double_back_to_quit), Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { doubleBackToExitPressedOnce = false; } }, 2000); } } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return super.onKeyUp(keyCode, event); } @Override public boolean onKeyDown(final int keycode, final KeyEvent e) { switch (keycode) { case KeyEvent.KEYCODE_MENU: if (mCurrentNavindex == 0 && !mDrawer.isDrawerOpen(GravityCompat.START)) { getChatFragment().switchInputMode(); } return true; case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: if (mCurrentNavindex != 0 || mDrawer.isDrawerOpen(GravityCompat.START)) { break; } if (!PrefUtil.getbooleanValue(this, "pref_volume_key_control_speech", true)) { break; } if (mInVolumeDown) { mInVolumeDown = false; ChatFragment chatFragment = getChatFragment(); if (chatFragment != null && !chatFragment.isRecognizing()) { getChatFragment().startRecognize(); } return true; } else if (!mInVolumeDown) { mInVolumeDown = true; new Handler().postDelayed(new Runnable() { @Override public void run() { if (mInVolumeDown) { mInVolumeDown = false; } } }, Constants.VOLUME_KEY_DOWN_DELAY); return true; } } return super.onKeyDown(keycode, e); } public ChatFragment getChatFragment() { FragmentManager fm = getSupportFragmentManager(); return (ChatFragment) fm.findFragmentByTag(CHAT_FRAGMENT_TAG); } public ShortcutFragment getShortcurFragment() { FragmentManager fm = getSupportFragmentManager(); return (ShortcutFragment) fm.findFragmentByTag(SHORTCUT_FRAGMENT_TAG); } @Override public void showActionBar() { if (!mActionBar.isShowing()) { mActionBar.show(); } } @Override public void hideActionBar() { if (mActionBar.isShowing()) { mActionBar.hide(); } } @Override public Context getContext() { return this; } @Override public int getActionBarHeight() { return mActionBarHeight; } // --------------------------- Local Message ---------------------------- @Override public void showServerStateIndicator(boolean isLocal) { TextView detailTextView = (TextView) mNavigationView.findViewById(R.id.nav_profile_detail_textview); if (isLocal) { detailTextView.setText(this.getString(R.string.title_local_msg_mode)); } else { detailTextView.setText(this.getString(R.string.title_remote_msg_mode)); } } public boolean shouldUseLocalMsg() { return mMainActivityPresenter.shouldUseLocalMsg(); } @Override public boolean onNavigationItemSelected(MenuItem menuItem) { int id = menuItem.getItemId(); if (id == R.id.nav_settings) { Intent intent = new Intent(); intent.setClass(MainActivity.this, SettingsActivity.class); startActivityForResult(intent, Constants.SETTINGS_ACTIVITY_RESULT_CODE); return true; } else if (id == R.id.nav_exit) { if (!mMainActivityPresenter.onAppExit()) Toast.makeText(this, getResources().getString(R.string.error_stop_local_msg_service), Toast.LENGTH_SHORT).show(); STOPPED = true; this.finish(); return true; } else { switch (id) { case R.id.nav_control: selectNavFragment(0); break; case R.id.nav_favour: selectNavFragment(1); break; case R.id.nav_locator: selectNavFragment(2); break; case R.id.nav_camera: selectNavFragment(3); break; case R.id.nav_message: selectNavFragment(4); break; case R.id.nav_geo_fencing: selectNavFragment(5); break; default: break; } mDrawer.closeDrawer(GravityCompat.START); return true; } } private void selectNavFragment(int index) { if (mCurrentNavindex == index) return; mCurrentNavindex = index; Fragment fragment = null; FragmentManager fm = getSupportFragmentManager(); String fragment_tag = null; int titleId = -1; if (index == 0) { ChatFragment chatFragment = (ChatFragment) fm.findFragmentByTag(CHAT_FRAGMENT_TAG); if (chatFragment == null) { chatFragment = new ChatFragment(); } fragment_tag = CHAT_FRAGMENT_TAG; fragment = chatFragment; titleId = R.string.title_section1; if (!fragment.isAdded()) { Bundle bundle = new Bundle(); bundle.putBoolean(ChatFragment.BUNDLE_KEY_SCROLL_TO_BOTTOM, true); fragment.setArguments(bundle); } else { fragment.getArguments().putBoolean(ChatFragment.BUNDLE_KEY_SCROLL_TO_BOTTOM, true); } } else if (index == 1) { ShortcutFragment shortcutFragment = (ShortcutFragment) fm.findFragmentByTag(SHORTCUT_FRAGMENT_TAG); if (shortcutFragment == null) { shortcutFragment = new ShortcutFragment(); } fragment_tag = SHORTCUT_FRAGMENT_TAG; fragment = shortcutFragment; titleId = R.string.title_section2; } else if (index == 2) { FindMyTagFragment findMyTagFragment = (FindMyTagFragment) fm.findFragmentByTag(FIND_TAG_FRAGMENT_TAG); if (findMyTagFragment == null) { findMyTagFragment = FindMyTagFragment.newInstance(); } fragment_tag = FIND_TAG_FRAGMENT_TAG; fragment = findMyTagFragment; titleId = R.string.title_section3; } else if (index == 3) { HomeStateFragment homeStateFragment = (HomeStateFragment) fm.findFragmentByTag(HOME_STATE_FRAGMENT_TAG); if (homeStateFragment == null) { homeStateFragment = HomeStateFragment.newInstance(); } fragment_tag = HOME_STATE_FRAGMENT_TAG; fragment = homeStateFragment; titleId = R.string.title_section4; } else if (index == 4) { MessageFragment messageFragment = (MessageFragment) fm.findFragmentByTag(MESSAGE_FRAGMENT_TAG); if (messageFragment == null) { messageFragment = MessageFragment.newInstance(); } fragment_tag = MESSAGE_FRAGMENT_TAG; fragment = messageFragment; titleId = R.string.title_section5; } else if (index == 5) { GeoFencingFragment geoFencingFragment = (GeoFencingFragment) fm.findFragmentByTag(GEO_FENCING_FRAGMENT_TAG); if (geoFencingFragment == null) { geoFencingFragment = GeoFencingFragment.newInstance(); } fragment_tag = GEO_FENCING_FRAGMENT_TAG; fragment = geoFencingFragment; titleId = R.string.title_section6; } this.onFragmentAttached(index); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() // .setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit) .replace(R.id.container, fragment, fragment_tag) .commit(); PrefUtil.setIntValue(this, PREF_KEY_LAST_OPEN_FRAGMENT_INDEX, index); mActionBar.setTitle(titleId); } private void openImageIntent() { Intent chooserIntent = mMainActivityPresenter.prepareNavHeaderImageChooserIntent(); mSelectedNavHeaderImageUri = chooserIntent.getParcelableExtra(MainActivity.EXTRA_IMAGE_INTENTS); startActivityForResult(chooserIntent, SELECT_PICTURE_REQUEST_CODE); } @Override public void changeNavHeaderBgImage(Uri selectedImageUri) { if (selectedImageUri != null) { ImageView iconImageView = (ImageView) mNavigationView.findViewById(R.id.nav_profile_icon); ProgressBar progressBar = (ProgressBar) findViewById(R.id.load_profile_icon_progressBar); new LoadProfileHeaderBgAsyncTask(this, iconImageView, progressBar).execute(selectedImageUri); } } }