/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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 org.awesomeapp.messenger;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.SearchManager;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.TextView;
import com.github.javiersantos.appupdater.AppUpdater;
import com.github.javiersantos.appupdater.enums.Display;
import com.github.javiersantos.appupdater.enums.UpdateFrom;
import org.awesomeapp.messenger.model.ImConnection;
import org.awesomeapp.messenger.provider.Imps;
import org.awesomeapp.messenger.service.IChatSession;
import org.awesomeapp.messenger.service.IChatSessionManager;
import org.awesomeapp.messenger.service.IImConnection;
import org.awesomeapp.messenger.service.ImServiceConstants;
import org.awesomeapp.messenger.tasks.AddContactAsyncTask;
import org.awesomeapp.messenger.tasks.ChatSessionInitTask;
import org.awesomeapp.messenger.ui.AccountFragment;
import org.awesomeapp.messenger.ui.AccountsActivity;
import org.awesomeapp.messenger.ui.AddContactActivity;
import org.awesomeapp.messenger.ui.BaseActivity;
import org.awesomeapp.messenger.ui.ContactsListFragment;
import org.awesomeapp.messenger.ui.ContactsPickerActivity;
import org.awesomeapp.messenger.ui.ConversationDetailActivity;
import org.awesomeapp.messenger.ui.ConversationListFragment;
import org.awesomeapp.messenger.ui.LockScreenActivity;
import org.awesomeapp.messenger.ui.MoreFragment;
import org.awesomeapp.messenger.ui.legacy.SettingActivity;
import org.awesomeapp.messenger.ui.onboarding.OnboardingActivity;
import org.awesomeapp.messenger.ui.onboarding.OnboardingManager;
import org.awesomeapp.messenger.util.AssetUtil;
import org.awesomeapp.messenger.util.SecureMediaStore;
import org.awesomeapp.messenger.util.SystemServices;
import org.awesomeapp.messenger.util.XmppUriHelper;
import org.ironrabbit.type.CustomTypefaceManager;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import im.zom.messenger.R;
import info.guardianproject.iocipher.VirtualFileSystem;
/**
* TODO
*/
public class MainActivity extends BaseActivity {
private ViewPager mViewPager;
private TabLayout mTabLayout;
private FloatingActionButton mFab;
private Toolbar mToolbar;
private ImApp mApp;
public final static int REQUEST_ADD_CONTACT = 9999;
public final static int REQUEST_CHOOSE_CONTACT = REQUEST_ADD_CONTACT+1;
public final static int REQUEST_CHANGE_SETTINGS = REQUEST_CHOOSE_CONTACT+1;
private ConversationListFragment mConversationList;
private ContactsListFragment mContactList;
private MoreFragment mMoreFragment;
private AccountFragment mAccountFragment;
private boolean mIsArchiveView = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
if (settings.getBoolean("prefBlockScreenshots",true))
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.awesome_activity_main);
mApp = (ImApp)getApplication();
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mTabLayout = (TabLayout) findViewById(R.id.tabs);
setSupportActionBar(mToolbar);
final ActionBar ab = getSupportActionBar();
mConversationList = new ConversationListFragment();
mContactList = new ContactsListFragment();
mMoreFragment = new MoreFragment();
mAccountFragment = new AccountFragment();
Adapter adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(mConversationList, getString(R.string.title_chats), R.drawable.ic_message_white_36dp);
adapter.addFragment(mContactList, getString(R.string.contacts), R.drawable.ic_people_white_36dp);
adapter.addFragment(mMoreFragment, getString(R.string.title_more), R.drawable.ic_more_horiz_white_36dp);
mAccountFragment = new AccountFragment();
// fragAccount.setArguments();
adapter.addFragment(mAccountFragment, getString(R.string.title_me), R.drawable.ic_face_white_24dp);
mViewPager.setAdapter(adapter);
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
TabLayout.Tab tab = mTabLayout.newTab();
tab.setIcon(R.drawable.ic_discuss);
mTabLayout.addTab(tab);
tab = mTabLayout.newTab();
tab.setIcon(R.drawable.ic_people_white_36dp);
mTabLayout.addTab(tab);
tab = mTabLayout.newTab();
tab.setIcon(R.drawable.ic_explore_white_24dp);
mTabLayout.addTab(tab);
tab = mTabLayout.newTab();
tab.setIcon(R.drawable.ic_face_white_24dp);
mTabLayout.addTab(tab);
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
mViewPager.setCurrentItem(tab.getPosition());
setToolbarTitle(tab.getPosition());
applyStyleColors ();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
setToolbarTitle(tab.getPosition());
applyStyleColors ();
}
});
mFab = (FloatingActionButton) findViewById(R.id.fab);
mFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int tabIdx = mViewPager.getCurrentItem();
if (tabIdx == 0) {
if (mContactList.getContactCount() > 0) {
Intent intent = new Intent(MainActivity.this, ContactsPickerActivity.class);
startActivityForResult(intent, REQUEST_CHOOSE_CONTACT);
}
else
{
inviteContact();
}
} else if (tabIdx == 1) {
inviteContact();
} else if (tabIdx == 2) {
startPhotoTaker();
}
}
});
setToolbarTitle(0);
//don't wnat this to happen to often
checkForUpdates();
installRingtones ();
applyStyle();
}
private void installRingtones ()
{
AssetUtil.installRingtone(getApplicationContext(),R.raw.bell,"Zom Bell");
AssetUtil.installRingtone(getApplicationContext(),R.raw.chant,"Zom Chant");
AssetUtil.installRingtone(getApplicationContext(),R.raw.yak,"Zom Yak");
AssetUtil.installRingtone(getApplicationContext(),R.raw.dranyen,"Zom Dranyen");
}
private void setToolbarTitle (int tabPosition)
{
StringBuffer sb = new StringBuffer();
sb.append(getString(R.string.app_name_zom));
sb.append(" | ");
switch (tabPosition) {
case 0:
if (mIsArchiveView)
sb.append(getString(R.string.title_archive));
else
sb.append(getString(R.string.chats));
break;
case 1:
if (mIsArchiveView)
sb.append(getString(R.string.title_archive));
else
sb.append(getString(R.string.friends));
break;
case 2:
sb.append(getString(R.string.title_more));
break;
case 3:
sb.append(getString(R.string.me_title));
break;
}
mToolbar.setTitle(sb.toString());
if (mFab != null) {
mFab.setVisibility(View.VISIBLE);
if (tabPosition == 1) {
mFab.setImageResource(R.drawable.ic_person_add_white_36dp);
} else if (tabPosition == 2) {
// mFab.setImageResource(R.drawable.ic_photo_camera_white_36dp);
mFab.setVisibility(View.GONE);
} else if (tabPosition == 3) {
mFab.setVisibility(View.GONE);
} else {
mFab.setImageResource(R.drawable.ic_add_white_24dp);
}
}
}
public void inviteContact ()
{
Intent i = new Intent(MainActivity.this, AddContactActivity.class);
startActivityForResult(i, MainActivity.REQUEST_ADD_CONTACT);
}
@Override
protected void onResume() {
super.onResume();
applyStyleColors ();
//if VFS is not mounted, then send to WelcomeActivity
if (!VirtualFileSystem.get().isMounted()) {
finish();
startActivity(new Intent(this, RouterActivity.class));
} else {
ImApp app = (ImApp) getApplication();
mApp.maybeInit(this);
mApp.initAccountInfo();
}
handleIntent();
checkConnection();
}
private boolean checkConnection() {
try {
if (mApp.getDefaultProviderId() != -1) {
IImConnection conn = mApp.getConnection(mApp.getDefaultProviderId(), mApp.getDefaultAccountId());
if (conn.getState() == ImConnection.DISCONNECTED
|| conn.getState() == ImConnection.SUSPENDED
|| conn.getState() == ImConnection.SUSPENDING) {
Snackbar sb = Snackbar.make(mViewPager, R.string.error_suspended_connection, Snackbar.LENGTH_LONG);
sb.setAction(getString(R.string.connect), new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, AccountsActivity.class);
startActivity(i);
}
});
sb.show();
return false;
}
else if (conn.getState() == ImConnection.LOGGING_IN)
{
Snackbar sb = Snackbar.make(mViewPager, R.string.signing_in_wait, Snackbar.LENGTH_LONG);
sb.show();
}
else if (conn.getState() == ImConnection.LOGGING_OUT)
{
Snackbar sb = Snackbar.make(mViewPager, R.string.signing_out_wait, Snackbar.LENGTH_LONG);
sb.show();
}
}
return true;
} catch (Exception e) {
return false;
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleIntent();
}
private void handleIntent ()
{
Intent intent = getIntent();
if (intent != null)
{
Uri data = intent.getData();
String type = intent.getType();
if (data != null && Imps.Chats.CONTENT_ITEM_TYPE.equals(type)) {
long chatId = ContentUris.parseId(data);
Intent intentChat = new Intent(this, ConversationDetailActivity.class);
intentChat.putExtra("id", chatId);
startActivity(intentChat);
}
else if (Imps.Contacts.CONTENT_ITEM_TYPE.equals(type))
{
long providerId = intent.getLongExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID,mApp.getDefaultProviderId());
long accountId = intent.getLongExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID,mApp.getDefaultAccountId());
String username = intent.getStringExtra(ImServiceConstants.EXTRA_INTENT_FROM_ADDRESS);
startChat(providerId, accountId, username, true, true);
}
else if (intent.hasExtra("username"))
{
//launch a new chat based on the intent value
startChat(mApp.getDefaultProviderId(), mApp.getDefaultAccountId(), intent.getStringExtra("username"), true, true);
}
setIntent(null);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_CHANGE_SETTINGS)
{
finish();
startActivity(new Intent(this, MainActivity.class));
}
else if (requestCode == REQUEST_ADD_CONTACT)
{
String username = data.getStringExtra(ContactsPickerActivity.EXTRA_RESULT_USERNAME);
long providerId = data.getLongExtra(ContactsPickerActivity.EXTRA_RESULT_PROVIDER, -1);
long accountId = data.getLongExtra(ContactsPickerActivity.EXTRA_RESULT_ACCOUNT,-1);
startChat(providerId, accountId, username, false, false);
}
else if (requestCode == REQUEST_CHOOSE_CONTACT)
{
String username = data.getStringExtra(ContactsPickerActivity.EXTRA_RESULT_USERNAME);
if (username != null) {
long providerId = data.getLongExtra(ContactsPickerActivity.EXTRA_RESULT_PROVIDER, -1);
long accountId = data.getLongExtra(ContactsPickerActivity.EXTRA_RESULT_ACCOUNT, -1);
startChat(providerId, accountId, username, true, true);
}
else {
ArrayList<String> users = data.getStringArrayListExtra(ContactsPickerActivity.EXTRA_RESULT_USERNAMES);
if (users != null)
{
//start group and do invite here
startGroupChat(users);
}
}
}
else if (requestCode == ConversationDetailActivity.REQUEST_TAKE_PICTURE)
{
if (mLastPhoto != null)
importPhoto ();
}
else if (requestCode == OnboardingManager.REQUEST_SCAN) {
ArrayList<String> resultScans = data.getStringArrayListExtra("result");
for (String resultScan : resultScans)
{
try {
String address = null;
if (resultScan.startsWith("xmpp:"))
{
address = XmppUriHelper.parse(Uri.parse(resultScan)).get(XmppUriHelper.KEY_ADDRESS);
String fingerprint = XmppUriHelper.getOtrFingerprint(resultScan);
new AddContactAsyncTask(mApp.getDefaultProviderId(), mApp.getDefaultAccountId(), mApp).execute(address, fingerprint);
}
else {
//parse each string and if they are for a new user then add the user
String[] parts = OnboardingManager.decodeInviteLink(resultScan);
address = parts[0];
String fingerprint = null, nickname = null;
if (parts.length > 1)
fingerprint = parts[1];
if (parts.length > 2)
nickname = parts[2];
new AddContactAsyncTask(mApp.getDefaultProviderId(), mApp.getDefaultAccountId(), mApp).execute(address, fingerprint, nickname);
}
if (address != null)
startChat(mApp.getDefaultProviderId(), mApp.getDefaultAccountId(), address, false, false);
//if they are for a group chat, then add the group
}
catch (Exception e)
{
Log.w(ImApp.LOG_TAG, "error parsing QR invite link", e);
}
}
}
}
}
private void startGroupChat (ArrayList<String> invitees)
{
String chatRoom = "groupchat" + UUID.randomUUID().toString().substring(0,8);
String chatServer = ""; //use the default
String nickname = mApp.getDefaultUsername().split("@")[0];
try
{
IImConnection conn = mApp.getConnection(mApp.getDefaultProviderId(),mApp.getDefaultAccountId());
if (conn.getState() == ImConnection.LOGGED_IN)
{
this.startGroupChat(chatRoom, chatServer, nickname, invitees, conn);
}
} catch (RemoteException re) {
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
if (mLastPhoto != null)
savedInstanceState.putString("lastphoto", mLastPhoto.toString());
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
String lastPhotoPath = savedInstanceState.getString("lastphoto");
if (lastPhotoPath != null)
mLastPhoto = Uri.parse(lastPhotoPath);
}
private void importPhoto ()
{
// import
SystemServices.FileInfo info = SystemServices.getFileInfoFromURI(this, mLastPhoto);
String sessionId = "self";
String offerId = UUID.randomUUID().toString();
try {
Uri vfsUri = SecureMediaStore.resizeAndImportImage(this, sessionId, mLastPhoto, info.type);
delete(mLastPhoto);
//adds in an empty message, so it can exist in the gallery and be forwarded
Imps.insertMessageInDb(
getContentResolver(), false, new Date().getTime(), true, null, vfsUri.toString(),
System.currentTimeMillis(), Imps.MessageType.OUTGOING_ENCRYPTED_VERIFIED,
0, offerId, info.type);
mLastPhoto = null;
}
catch (IOException ioe)
{
Log.e(ImApp.LOG_TAG,"error importing photo",ioe);
}
}
private boolean delete(Uri uri) {
if (uri.getScheme().equals("content")) {
int deleted = getContentResolver().delete(uri,null,null);
return deleted == 1;
}
if (uri.getScheme().equals("file")) {
java.io.File file = new java.io.File(uri.toString().substring(5));
return file.delete();
}
return false;
}
private SearchView mSearchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
if (mSearchView != null )
{
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
mSearchView.setIconifiedByDefault(false);
SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
{
public boolean onQueryTextChange(String query)
{
mConversationList.doSearch(query);
return true;
}
public boolean onQueryTextSubmit(String query)
{
mConversationList.doSearch(query);
return true;
}
};
mSearchView.setOnQueryTextListener(queryTextListener);
mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
mConversationList.doSearch(null);
return false;
}
});
}
MenuItem mItem = menu.findItem(R.id.menu_lock_reset);
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
if (!settings.contains(ImApp.PREFERENCE_KEY_TEMP_PASS))
mItem.setVisible(true);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
//mDrawerLayout.openDrawer(GravityCompat.START);
return true;
case R.id.menu_settings:
Intent sintent = new Intent(this, SettingActivity.class);
startActivityForResult(sintent, REQUEST_CHANGE_SETTINGS);
return true;
case R.id.menu_archive:
toggleArchiveFilter();
return true;
case R.id.menu_lock:
handleLock();
return true;
case R.id.menu_new_account:
Intent i = new Intent(MainActivity.this, AccountsActivity.class);
startActivity(i);
return true;
case R.id.menu_lock_reset:
resetPassphrase();
return true;
}
return super.onOptionsItemSelected(item);
}
public void toggleArchiveFilter ()
{
mIsArchiveView = !mIsArchiveView;
setToolbarTitle(mTabLayout.getSelectedTabPosition());
mConversationList.setArchiveFilter(mIsArchiveView);
}
public void resetPassphrase ()
{
/**
Intent intent = new Intent(this, LockScreenActivity.class);
intent.setAction(LockScreenActivity.ACTION_RESET_PASSPHRASE);
startActivity(intent);**/
//need to setup new user passphrase
Intent intent = new Intent(this, LockScreenActivity.class);
intent.setAction(LockScreenActivity.ACTION_CHANGE_PASSPHRASE);
startActivity(intent);
}
public void handleLock ()
{
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
if (settings.contains(ImApp.PREFERENCE_KEY_TEMP_PASS))
{
//need to setup new user passphrase
Intent intent = new Intent(this, LockScreenActivity.class);
intent.setAction(LockScreenActivity.ACTION_CHANGE_PASSPHRASE);
startActivity(intent);
}
else {
//time to do the lock
Intent intent = new Intent(this, RouterActivity.class);
intent.setAction(RouterActivity.ACTION_LOCK_APP);
startActivity(intent);
finish();
}
}
static class Adapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
private final List<Integer> mFragmentIcons = new ArrayList<>();
public Adapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title, int icon) {
mFragments.add(fragment);
mFragmentTitles.add(title);
mFragmentIcons.add(icon);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
public void startChat (long providerId, long accountId, String username, boolean startCrypto, final boolean openChat)
{
if (username != null)
new ChatSessionInitTask(((ImApp)getApplication()),providerId, accountId, Imps.Contacts.TYPE_NORMAL, startCrypto)
{
@Override
protected void onPostExecute(Long chatId) {
if (chatId != -1 && openChat) {
Intent intent = new Intent(MainActivity.this, ConversationDetailActivity.class);
intent.putExtra("id", chatId);
startActivity(intent);
}
super.onPostExecute(chatId);
}
}.executeOnExecutor(ImApp.sThreadPoolExecutor,username);
}
public void showGroupChatDialog ()
{
// This example shows how to add a custom layout to an AlertDialog
LayoutInflater factory = LayoutInflater.from(this);
final View dialogGroup = factory.inflate(R.layout.alert_dialog_group_chat, null);
//TextView tvServer = (TextView) dialogGroup.findViewById(R.id.chat_server);
// tvServer.setText(ImApp.DEFAULT_GROUPCHAT_SERVER);// need to make this a list
// final Spinner listAccounts = (Spinner) dialogGroup.findViewById(R.id.choose_list);
// setupAccountSpinner(listAccounts);
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle(R.string.create_group)
.setView(dialogGroup)
.setPositiveButton(R.string.connect, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked OK so do some stuff */
String chatRoom = null;
String chatServer = "";
String nickname = "";
TextView tv = (TextView) dialogGroup.findViewById(R.id.chat_room);
chatRoom = tv.getText().toString();
/**
tv = (TextView) dialogGroup.findViewById(R.id.chat_server);
chatServer = tv.getText().toString();
tv = (TextView) dialogGroup.findViewById(R.id.nickname);
nickname = tv.getText().toString();
**/
try {
IImConnection conn = mApp.getConnection(mApp.getDefaultProviderId(), mApp.getDefaultAccountId());
if (conn.getState() == ImConnection.LOGGED_IN)
startGroupChat(chatRoom, chatServer, nickname, null, conn);
} catch (RemoteException re) {
}
dialog.dismiss();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
/* User clicked cancel so do some stuff */
dialog.dismiss();
}
})
.create();
dialog.show();
Typeface typeface;
if ((typeface = CustomTypefaceManager.getCurrentTypeface(this))!=null) {
TextView textView = (TextView) dialog.findViewById(android.R.id.message);
if (textView != null)
textView.setTypeface(typeface);
textView = (TextView) dialog.findViewById(R.id.alertTitle);
if (textView != null)
textView.setTypeface(typeface);
Button btn = (Button)dialog.findViewById(android.R.id.button1);
if (btn != null)
btn.setTypeface(typeface);
btn = (Button)dialog.findViewById(android.R.id.button2);
if (btn != null)
btn.setTypeface(typeface);
btn = (Button)dialog.findViewById(android.R.id.button3);
if (btn != null)
btn.setTypeface(typeface);
}
}
private IImConnection mLastConnGroup = null;
private long mRequestedChatId = -1;
public void startGroupChat (String room, String server, String nickname, final ArrayList<String> invitees, IImConnection conn)
{
mLastConnGroup = conn;
new AsyncTask<String, Long, String>() {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(MainActivity.this);
dialog.setMessage(getString(R.string.connecting_to_group_chat_));
dialog.setCancelable(true);
dialog.show();
}
@Override
protected String doInBackground(String... params) {
String subject = params[0];
String chatRoom = "group" + UUID.randomUUID().toString().substring(0,8);
String server = params[1];
try {
IChatSessionManager manager = mLastConnGroup.getChatSessionManager();
String roomAddress = (chatRoom + '@' + server).toLowerCase(Locale.US);
String nickname = params[2];
IChatSession session = manager.getChatSession(roomAddress);
if (session == null) {
session = manager.createMultiUserChatSession(roomAddress, subject, nickname, true);
if (session != null)
{
mRequestedChatId = session.getId();
publishProgress(mRequestedChatId);
} else {
return getString(R.string.unable_to_create_or_join_group_chat);
}
} else {
mRequestedChatId = session.getId();
publishProgress(mRequestedChatId);
}
if (invitees != null && invitees.size() > 0) {
//wait a second for the server to sort itself out
try {
Thread.sleep(100);
} catch (Exception e) {
}
for (String invitee : invitees)
session.inviteContact(invitee);
}
return null;
} catch (RemoteException e) {
return e.toString();
}
}
@Override
protected void onProgressUpdate(Long... showChatId) {
showChat(showChatId[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (dialog.isShowing()) {
dialog.dismiss();
}
if (result != null)
{
// mHandler.showServiceErrorAlert(result);
}
}
}.executeOnExecutor(ImApp.sThreadPoolExecutor,room, server, nickname);
}
private void showChat (long chatId)
{
Intent intent = new Intent(this, ConversationDetailActivity.class);
intent.putExtra("id",chatId);
startActivity(intent);
}
@Override
protected void onPause() {
super.onPause();
// UpdateManager.unregister();
}
private void checkForUpdates() {
// Remove this for store builds!
// UpdateManager.register(this, ImApp.HOCKEY_APP_ID);
//only check github for updates if there is no Google Play
if (!hasGooglePlay()) {
try {
String version = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
//if this is a full release, without -beta -rc etc, then check the appupdater!
if (version.indexOf("-") == -1) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
long timeNow = new Date().getTime();
long timeSinceLastCheck = prefs.getLong("updatetime", -1);
//only check for updates once per day
if (timeSinceLastCheck == -1 || (timeNow - timeSinceLastCheck) > 86400) {
AppUpdater appUpdater = new AppUpdater(this);
appUpdater.setDisplay(Display.DIALOG);
appUpdater.setUpdateFrom(UpdateFrom.XML);
appUpdater.setUpdateXML(ImApp.URL_UPDATER);
// appUpdater.showAppUpdated(true);
appUpdater.start();
prefs.edit().putLong("updatetime", timeNow).commit();
}
}
} catch (Exception e) {
Log.d("AppUpdater", "error checking app updates", e);
}
}
}
boolean hasGooglePlay() {
try {
getApplication().getPackageManager().getPackageInfo("com.android.vending", 0);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return true;
}
Uri mLastPhoto = null;
void startPhotoTaker() {
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "cs_" + new Date().getTime() + ".jpg");
mLastPhoto = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
mLastPhoto);
// start the image capture Intent
startActivityForResult(intent, ConversationDetailActivity.REQUEST_TAKE_PICTURE);
}
/**
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.awesome_activity_main);
}*/
public void applyStyle() {
//first set font
checkCustomFont();
Typeface typeface = CustomTypefaceManager.getCurrentTypeface(this);
if (typeface != null) {
for (int i = 0; i < mToolbar.getChildCount(); i++) {
View view = mToolbar.getChildAt(i);
if (view instanceof TextView) {
TextView tv = (TextView) view;
tv.setTypeface(typeface);
break;
}
}
}
applyStyleColors ();
}
private void applyStyleColors ()
{
final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
//not set color
int themeColorHeader = settings.getInt("themeColor",-1);
int themeColorText = settings.getInt("themeColorText",-1);
int themeColorBg = settings.getInt("themeColorBg",-1);
if (themeColorHeader != -1) {
if (themeColorText == -1)
themeColorText = getContrastColor(themeColorHeader);
if (Build.VERSION.SDK_INT >= 21) {
getWindow().setNavigationBarColor(themeColorHeader);
getWindow().setStatusBarColor(themeColorHeader);
getWindow().setTitleColor(getContrastColor(themeColorHeader));
}
mToolbar.setBackgroundColor(themeColorHeader);
mToolbar.setTitleTextColor(getContrastColor(themeColorHeader));
mTabLayout.setBackgroundColor(themeColorHeader);
mTabLayout.setTabTextColors(themeColorText, themeColorText);
mFab.setBackgroundColor(themeColorHeader);
}
if (themeColorBg != -1)
{
if (mConversationList != null && mConversationList.getView() != null)
mConversationList.getView().setBackgroundColor(themeColorBg);
if (mContactList != null && mContactList.getView() != null)
mContactList.getView().setBackgroundColor(themeColorBg);
if (mMoreFragment != null && mMoreFragment.getView() != null)
mMoreFragment.getView().setBackgroundColor(themeColorBg);
if (mAccountFragment != null && mAccountFragment.getView() != null)
mAccountFragment.getView().setBackgroundColor(themeColorBg);
}
}
public static int getContrastColor(int colorIn) {
double y = (299 * Color.red(colorIn) + 587 * Color.green(colorIn) + 114 * Color.blue(colorIn)) / 1000;
return y >= 128 ? Color.BLACK : Color.WHITE;
}
private void checkCustomFont ()
{
if (Preferences.isLanguageTibetan())
{
CustomTypefaceManager.loadFromAssets(this,true);
}
else
{
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
List<InputMethodInfo> mInputMethodProperties = imm.getEnabledInputMethodList();
final int N = mInputMethodProperties.size();
boolean loadTibetan = false;
for (int i = 0; i < N; i++) {
InputMethodInfo imi = mInputMethodProperties.get(i);
//imi contains the information about the keyboard you are using
if (imi.getPackageName().equals("org.ironrabbit.bhoboard")) {
// CustomTypefaceManager.loadFromKeyboard(this);
loadTibetan = true;
break;
}
}
CustomTypefaceManager.loadFromAssets(this, loadTibetan);
}
}
}