Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1106b1fc authored by Moez Bhatti's avatar Moez Bhatti
Browse files

Merge branch 'conversation-activity' into release-2.6

parents 9044f221 303a292a
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -68,9 +68,8 @@
            android:name=".ui.MainActivity"
            android:icon="@mipmap/ic_launcher_teal"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:logo="@color/transparent"
            android:windowSoftInputMode="stateUnchanged|adjustResize">
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.MAIN" />
@@ -81,6 +80,8 @@
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
@@ -88,6 +89,20 @@
                <data android:scheme="sms_body" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.messagelist.MessageListActivity"
            android:launchMode="singleTop"
            android:windowSoftInputMode="adjustResize" />

        <activity
            android:name=".ui.settings.SettingsActivity"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".ui.search.SearchActivity"
            android:windowSoftInputMode="adjustResize" />
        <activity
            android:name=".ui.compose.ComposeActivity"
            android:windowSoftInputMode="adjustResize" />

        <activity-alias
            android:name=".ui.MainActivity-Teal"
+5 −2
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ import com.moez.QKSMS.ui.MainActivity;
import com.moez.QKSMS.ui.base.QKActivity;
import com.moez.QKSMS.ui.dialog.DefaultSmsHelper;
import com.moez.QKSMS.ui.dialog.QKDialog;
import com.moez.QKSMS.ui.messagelist.MessageListActivity;

import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -30,7 +31,7 @@ public class DialogHelper {
        showDeleteConversationsDialog(context, threadIds);
    }

    public static void showDeleteConversationsDialog(final MainActivity context, final Set<Long> threadIds) {
    public static void showDeleteConversationsDialog(final QKActivity context, final Set<Long> threadIds) {
        new DefaultSmsHelper(context, R.string.not_default_delete).showIfNotDefault(null);

        Set<Long> threads = new HashSet<>(threadIds); // Make a copy so the list isn't reset when multi-select is disabled
@@ -43,7 +44,9 @@ public class DialogHelper {
                    Conversation.ConversationQueryHandler handler = new Conversation.ConversationQueryHandler(context.getContentResolver());
                    Conversation.startDelete(handler, 0, false, threads);
                    Conversation.asyncDeleteObsoleteThreads(handler, 0);
                    context.showMenu();
                    if (context instanceof MessageListActivity) {
                        context.onBackPressed();
                    }
                })
                .setNegativeButton(R.string.cancel, null)
                .show();
+0 −1
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ public enum QKPreference {
    AVATAR_RECEIVED("pref_key_avatar_received", true),

    MESSAGE_COUNT("pref_key_message_count", false),
    SLIDING_TAB("pref_key_sliding_tab", false),
    TIMESTAMPS_24H("pref_key_24h", false),

    // General
+4 −3
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import com.moez.QKSMS.receiver.WearableIntentReceiver;
import com.moez.QKSMS.ui.MainActivity;
import com.moez.QKSMS.ui.ThemeManager;
import com.moez.QKSMS.ui.messagelist.MessageItem;
import com.moez.QKSMS.ui.messagelist.MessageListActivity;
import com.moez.QKSMS.ui.popup.QKComposeActivity;
import com.moez.QKSMS.ui.popup.QKReplyActivity;
import com.moez.QKSMS.ui.settings.SettingsFragment;
@@ -316,7 +317,7 @@ public class NotificationManager {
                if (failedCursor.getCount() == 1) {
                    title = sRes.getString(R.string.failed_message);
                    Intent intent = new Intent(context, MainActivity.class);
                    intent.putExtra(MainActivity.EXTRA_THREAD_ID, failedCursor.getLong(0));
                    intent.putExtra(MessageListActivity.ARG_THREAD_ID, failedCursor.getLong(0));
                    PI = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                } else {
                    title = failedCursor.getCount() + " " + sRes.getString(R.string.failed_messages);
@@ -475,7 +476,7 @@ public class NotificationManager {
        final PendingIntent replyPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 0), replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent threadIntent = new Intent(context, MainActivity.class);
        threadIntent.putExtra(MainActivity.EXTRA_THREAD_ID, threadId);
        threadIntent.putExtra(MessageListActivity.ARG_THREAD_ID, threadId);
        final PendingIntent threadPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 1), threadIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent readIntent = new Intent(ACTION_MARK_READ);
@@ -575,7 +576,7 @@ public class NotificationManager {
        PendingIntent replyPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 0), replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent threadIntent = new Intent(context, MainActivity.class);
        threadIntent.putExtra(MainActivity.EXTRA_THREAD_ID, threadId);
        threadIntent.putExtra(MessageListActivity.ARG_THREAD_ID, threadId);
        PendingIntent threadPI = PendingIntent.getActivity(context, buildRequestCode(threadId, 1), threadIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent readIntent = new Intent(ACTION_MARK_READ);
+20 −221
Original line number Diff line number Diff line
@@ -14,10 +14,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.content.ContextCompat;
import android.telephony.PhoneNumberUtils;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
@@ -30,45 +27,37 @@ import butterknife.ButterKnife;
import com.google.android.mms.pdu_alt.PduHeaders;
import com.moez.QKSMS.R;
import com.moez.QKSMS.common.ConversationPrefsHelper;
import com.moez.QKSMS.common.DialogHelper;
import com.moez.QKSMS.common.DonationManager;
import com.moez.QKSMS.common.LiveViewManager;
import com.moez.QKSMS.common.QKRateSnack;
import com.moez.QKSMS.common.google.DraftCache;
import com.moez.QKSMS.common.utils.KeyboardUtils;
import com.moez.QKSMS.common.utils.MessageUtils;
import com.moez.QKSMS.common.utils.Units;
import com.moez.QKSMS.data.Conversation;
import com.moez.QKSMS.enums.QKPreference;
import com.moez.QKSMS.mmssms.Utils;
import com.moez.QKSMS.receiver.IconColorReceiver;
import com.moez.QKSMS.transaction.NotificationManager;
import com.moez.QKSMS.transaction.SmsHelper;
import com.moez.QKSMS.ui.base.QKActivity;
import com.moez.QKSMS.ui.compose.ComposeFragment;
import com.moez.QKSMS.ui.conversationlist.ConversationListFragment;
import com.moez.QKSMS.ui.dialog.ConversationSettingsDialog;
import com.moez.QKSMS.ui.dialog.DefaultSmsHelper;
import com.moez.QKSMS.ui.dialog.QKDialog;
import com.moez.QKSMS.ui.dialog.mms.MMSSetupFragment;
import com.moez.QKSMS.ui.messagelist.MessageListActivity;
import com.moez.QKSMS.ui.messagelist.MessageListFragment;
import com.moez.QKSMS.ui.popup.QKReplyActivity;
import com.moez.QKSMS.ui.search.SearchFragment;
import com.moez.QKSMS.ui.search.SearchActivity;
import com.moez.QKSMS.ui.settings.SettingsFragment;
import com.moez.QKSMS.ui.view.slidingmenu.SlidingMenu;
import com.moez.QKSMS.ui.welcome.WelcomeActivity;
import org.ligi.snackengage.SnackEngage;
import org.ligi.snackengage.snacks.BaseSnack;

import java.net.URLDecoder;
import java.util.Collection;


public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuListener {
public class MainActivity extends QKActivity {
    private final String TAG = "MainActivity";

    public final static String EXTRA_THREAD_ID = "thread_id";

    public static long sThreadShowing;

    private static final int THREAD_LIST_QUERY_TOKEN = 1701;
@@ -80,7 +69,6 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
    public static final String MMS_SETUP_DONT_ASK_AGAIN = "mmsSetupDontAskAgain";

    @Bind(R.id.root) View mRoot;
    @Bind(R.id.sliding_menu) SlidingMenu mSlidingMenu;

    private ConversationListFragment mConversationList;
    private ContentFragment mContent;
@@ -97,37 +85,21 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        launchWelcomeActivity();
        onNewIntent(getIntent());

        setContentView(R.layout.activity_main);
        setContentView(R.layout.activity_fragment);
        setTitle(R.string.title_conversation_list);
        ButterKnife.bind(this);

        setSlidingTabEnabled(mPrefs.getBoolean(SettingsFragment.SLIDING_TAB, false));
        mSlidingMenu.setListener(this);
        mSlidingMenu.setContent();
        mSlidingMenu.setMenu();
        mSlidingMenu.showContent(false);
        mSlidingMenu.showMenu(false);

        FragmentManager fm = getFragmentManager();

        mConversationList = (ConversationListFragment) fm.findFragmentById(R.id.menu_frame);
        mConversationList = (ConversationListFragment) fm.findFragmentById(R.id.content_frame);
        if (mConversationList == null) {
            mConversationList = new ConversationListFragment();
        }
        FragmentTransaction menuTransaction = fm.beginTransaction();
        menuTransaction.replace(R.id.menu_frame, mConversationList);
        menuTransaction.replace(R.id.content_frame, mConversationList);
        menuTransaction.commit();

        mContent = (ContentFragment) fm.findFragmentById(R.id.content_frame);
        if (mContent == null) {
            mContent = ComposeFragment.getInstance(null);
        }
        FragmentTransaction contentTransaction = fm.beginTransaction();
        contentTransaction.replace(R.id.content_frame, (Fragment) mContent);
        contentTransaction.commit();

        onNewIntent(getIntent());
        showDialogIfNeeded(savedInstanceState);

        LiveViewManager.registerView(QKPreference.BACKGROUND, this, key -> {
@@ -192,39 +164,13 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
        startActivityForResult(welcomeIntent, WelcomeActivity.WELCOME_REQUEST_CODE);
    }

    public void showMenu() {
        mSlidingMenu.showMenu();
    }

    public SlidingMenu getSlidingMenu() {
        return mSlidingMenu;
    }

    /**
     * Configured the sliding menu view to peek the content or not.
     *
     * @param slidingTabEnabled true to peek the content
     */
    public void setSlidingTabEnabled(boolean slidingTabEnabled) {
        if (slidingTabEnabled) {
            mSlidingMenu.setBehindOffset(Units.dpToPx(this, 48));
        } else {
            mSlidingMenu.setBehindOffset(0);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        menu.clear();

        if (mSlidingMenu.isMenuShowing() || mContent == null) {
        showBackButton(false);
        mConversationList.inflateToolbar(menu, inflater, this);
        } else {
            showBackButton(true);
            mContent.inflateToolbar(menu, inflater, this);
        }

        return super.onPrepareOptionsMenu(menu);
    }
@@ -238,19 +184,10 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
        switch (item.getItemId()) {
            case android.R.id.home:
                onKeyUp(KeyEvent.KEYCODE_BACK, null);
                break;
            case R.id.menu_settings:
                switchContent(SettingsFragment.newInstance(R.xml.settings_main), true);
                break;
                return true;
            case R.id.menu_search:
                switchContent(new SearchFragment(), true);
                break;
            case R.id.menu_changelog:
                DialogHelper.showChangelog(this);
                break;
            case R.id.menu_donate:
                DonationManager.getInstance(this).showDonateDialog();
                break;
                startActivity(SearchActivity.class);
                return true;
        }

        return super.onOptionsItemSelected(item);
@@ -306,23 +243,12 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (!mSlidingMenu.isMenuShowing()) {
                Fragment category = getFragmentManager().findFragmentByTag(SettingsFragment.CATEGORY_TAG);
                if (category != null) {
                    getFragmentManager().beginTransaction()
                            .replace(R.id.content_frame, SettingsFragment.newInstance(R.xml.settings_main)).commit();
                } else {
                    mSlidingMenu.showMenu();
                }
                return true;
            } else {
            if (mConversationList.isShowingBlocked()) {
                mConversationList.setShowingBlocked(false);
            } else {
                finish();
            }
        }
        }

        return false;
    }
@@ -331,9 +257,6 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
    protected void onPause() {
        super.onPause();
        sThreadShowing = 0;
        if (!mSlidingMenu.isMenuShowing()) {
            mContent.onContentClosed();
        }
    }

    @Override
@@ -353,10 +276,6 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
    protected void onResume() {
        super.onResume();

        if (!mSlidingMenu.isMenuShowing()) {
            mContent.onContentOpened();
        }

        if (mContent != null && mContent instanceof MessageListFragment) {
            sThreadShowing = ((MessageListFragment) mContent).getThreadId();
            QKReplyActivity.dismiss(sThreadShowing);
@@ -386,41 +305,19 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
        // that makes the most sense.
        setIntent(intent);

        // This method is called whenever a MainActivity intent is started. Sometimes this is from a
        // notification; other times it's from the user clicking on the app icon in the home screen
        long threadId = intent.getLongExtra(EXTRA_THREAD_ID, -1);
        boolean shouldOpenConversation = intent.hasExtra(MessageListActivity.ARG_THREAD_ID);

        // The activity can also be launched by clicking on the message button from the contacts app
        // Check for {sms,mms}{,to}: schemes, in which case we know to open a conversation
        if (intent.getData() != null) {
            String data = intent.getData().toString();
            String scheme = intent.getData().getScheme();

            if (scheme.startsWith("smsto") || scheme.startsWith("mmsto")) {
                String address = data.replace("smsto:", "").replace("mmsto:", "");
                threadId = Utils.getThreadId(this, formatPhoneNumber(address));
            } else if (scheme.startsWith("sms") || (scheme.startsWith("mms"))) {
                String address = data.replace("sms:", "").replace("mms:", "");
                threadId = Utils.getThreadId(this, formatPhoneNumber(address));
            }
            shouldOpenConversation = shouldOpenConversation || scheme.startsWith("sms") || scheme.startsWith("mms");
        }

        // If it has a thread id, then we know it's from a notification and we can set the
        // conversation.
        if (threadId != -1) {
            Log.v(TAG, "Opening thread: " + threadId);
            setConversation(threadId);
            mSlidingMenu.showContent();
        if (shouldOpenConversation) {
            intent.setClass(this, MessageListActivity.class);
            startActivity(intent);
        }

        // Otherwise we'll just resume what was previously there, which doesn't require any code.
    }

    private String formatPhoneNumber(String address) {
        address = URLDecoder.decode(address);
        address = "" + Html.fromHtml(address);
        address = PhoneNumberUtils.formatNumber(address);
        return address;
    }

    private void beginMmsSetup() {
@@ -458,104 +355,6 @@ public class MainActivity extends QKActivity implements SlidingMenu.SlidingMenuL
        }
    }

    public void switchContent(ContentFragment fragment, boolean animate) {
        // Make sure that the activity isn't destroyed before making fragment transactions.
        if (fragment != null && !mIsDestroyed) {
            KeyboardUtils.hide(this);

            mContent = fragment;
            FragmentManager m = getFragmentManager();

            // Only do a replace if it is a different fragment.
            if (fragment != m.findFragmentById(R.id.content_frame)) {
                getFragmentManager()
                        .beginTransaction()
                        .replace(R.id.content_frame, (Fragment) fragment)
                        .commitAllowingStateLoss();
            }

            mSlidingMenu.showContent(animate);
            invalidateOptionsMenu();

        } else {
            Log.w(TAG, "Null fragment, can't switch content");
        }
    }

    public void setConversation(long threadId) {
        setConversation(threadId, -1, null, false);
    }

    public void setConversation(long threadId, long rowId) {
        setConversation(threadId, rowId, null, false);
    }

    public void setConversation(long threadId, long rowId, String pattern) {
        setConversation(threadId, rowId, pattern, false);
    }

    public void setConversation(long threadId, long rowId, String pattern, boolean animate) {
        MessageListFragment fragment = MessageListFragment.getInstance(threadId, rowId, pattern, !animate);

        // Save the thread ID here and switch the content
        sThreadShowing = threadId;
        switchContent(fragment, animate);
    }

    @Override
    public void onOpen() {
        invalidateOptionsMenu();
        sThreadShowing = 0;

        // Notify the content that it is being closed, since the menu (i.e. conversation list) is being opened.
        if (mContent != null) mContent.onContentClosing();

        // Hide the soft keyboard
        KeyboardUtils.hide(this, getCurrentFocus());

        showBackButton(false);
    }

    @Override
    public void onClose() {
        invalidateOptionsMenu();

        // Notify the content that it is being opened, since the menu (i.e. conversation list) is being closed.
        if (mContent != null) {
            mContent.onContentOpening();
        }

        if (mContent != null && mContent instanceof MessageListFragment) {
            sThreadShowing = ((MessageListFragment) mContent).getThreadId();
        } else {
            sThreadShowing = 0;
        }

        // Hide the soft keyboard
        KeyboardUtils.hide(this, getCurrentFocus());

        showBackButton(true);
    }

    @Override
    public void onOpened() {
        // When the menu (i.e. the conversation list) has been opened, the content has been opened.
        // So notify the content fragment.
        if (mContent != null) mContent.onContentClosed();
    }

    @Override
    public void onClosed() {
        // When the menu (i.e. the conversation list) has been closed, the content has been opened.
        // So notify the content fragment.
        if (mContent != null && ((Fragment) mContent).isAdded()) mContent.onContentOpened();
    }

    @Override
    public void onChanging(float percentOpen) {
        if (mContent != null) mContent.onMenuChanging(percentOpen);
    }

    /**
     * Build and show the proper delete thread dialog. The UI is slightly different
     * depending on whether there are locked messages in the thread(s) and whether we're
Loading