diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a1698f89..f53bbafe 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -90,6 +90,11 @@ android:screenOrientation="portrait" android:configChanges="orientation|screenSize|keyboardHidden" /> + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index d2e245e5..36202a82 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -35,6 +35,9 @@ Exit Settings > Settings + + Welcome to the latest version of the Graphene OS Messaging App! + Please note that SMS/MMS are a non-private and insecure form of communication. We highly recommend using a more secure and private service, such as Molly/Signal. Messaging needs permission to SMS, Phone and Contacts. You can change permissions in Settings > Apps > Messaging > Permissions. diff --git a/src/com/android/messaging/ui/BaseBugleActivity.java b/src/com/android/messaging/ui/BaseBugleActivity.java index 43ba1d1d..e493a39f 100644 --- a/src/com/android/messaging/ui/BaseBugleActivity.java +++ b/src/com/android/messaging/ui/BaseBugleActivity.java @@ -32,7 +32,7 @@ public class BaseBugleActivity extends AppCompatActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (UiUtils.redirectToPermissionCheckIfNeeded(this)) { + if (UiUtils.checkToShowWelcomeAndPermissionScreens(this)) { return; } } diff --git a/src/com/android/messaging/ui/BugleActionBarActivity.java b/src/com/android/messaging/ui/BugleActionBarActivity.java index b7e72cd7..59c39812 100644 --- a/src/com/android/messaging/ui/BugleActionBarActivity.java +++ b/src/com/android/messaging/ui/BugleActionBarActivity.java @@ -61,7 +61,7 @@ public class BugleActionBarActivity extends AppCompatActivity implements ImeUtil @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (UiUtils.redirectToPermissionCheckIfNeeded(this)) { + if (UiUtils.checkToShowWelcomeAndPermissionScreens(this)) { return; } diff --git a/src/com/android/messaging/ui/UIIntents.java b/src/com/android/messaging/ui/UIIntents.java index 9d7e8bcd..702f047f 100644 --- a/src/com/android/messaging/ui/UIIntents.java +++ b/src/com/android/messaging/ui/UIIntents.java @@ -115,6 +115,12 @@ public static UIIntents get() { */ public abstract void launchPermissionCheckActivity(final Context context); + /** + * Launch the welcome and warning activity + */ + + public abstract void launchWelcomeSMSWarningActivity(final Context context); + public abstract void launchConversationListActivity(final Context context); /** diff --git a/src/com/android/messaging/ui/UIIntentsImpl.java b/src/com/android/messaging/ui/UIIntentsImpl.java index 9c5d18f0..9c645cec 100644 --- a/src/com/android/messaging/ui/UIIntentsImpl.java +++ b/src/com/android/messaging/ui/UIIntentsImpl.java @@ -137,6 +137,14 @@ private Intent getConversationActivityIntent(final Context context, @Override public void launchPermissionCheckActivity(final Context context) { final Intent intent = new Intent(context, PermissionCheckActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + context.startActivity(intent); + } + + @Override + public void launchWelcomeSMSWarningActivity(final Context context) { + final Intent intent = new Intent(context, WelcomeSMSWarningActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent); } diff --git a/src/com/android/messaging/ui/WelcomeSMSWarningActivity.java b/src/com/android/messaging/ui/WelcomeSMSWarningActivity.java new file mode 100644 index 00000000..5566b1d1 --- /dev/null +++ b/src/com/android/messaging/ui/WelcomeSMSWarningActivity.java @@ -0,0 +1,76 @@ +/* + * 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 com.android.messaging.ui; + +import static com.android.messaging.util.BuglePrefs.KEY_LAST_VERSION; + +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.activity.OnBackPressedCallback; +import androidx.appcompat.app.AppCompatActivity; + +import com.android.messaging.BuildConfig; +import com.android.messaging.R; +import com.android.messaging.util.BuglePrefs; +import com.android.messaging.util.UiUtils; + +/** + * Activity to warn user that sms/mms is insecure and should not be used. + */ +public class WelcomeSMSWarningActivity extends AppCompatActivity { + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.welcome_sms_warning); + UiUtils.setStatusBarColor(this, getColor(R.color.permission_check_activity_background)); + + // Remove title bar added by AppCompatActivity + if (getSupportActionBar() != null) { + getSupportActionBar().hide(); + } + + findViewById(R.id.exit).setOnClickListener(view -> finish()); + + final BuglePrefs prefs = BuglePrefs.getApplicationPrefs(); + + TextView mNextView = findViewById(R.id.next); + mNextView.setVisibility(View.VISIBLE); + + mNextView.setOnClickListener(v -> { + UIIntents.get().launchPermissionCheckActivity(this); + prefs.putInt(KEY_LAST_VERSION, BuildConfig.VERSION_CODE); + finish(); + }); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + finish(); + } + }; + getOnBackPressedDispatcher().addCallback(this, callback); + } + + @Override + public void onResume() { + super.onResume(); + } +} diff --git a/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java b/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java index c869839e..67b6eb16 100644 --- a/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java +++ b/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java @@ -57,7 +57,7 @@ public class LaunchConversationActivity extends Activity implements @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (UiUtils.redirectToPermissionCheckIfNeeded(this)) { + if (UiUtils.checkToShowWelcomeAndPermissionScreens(this)) { return; } diff --git a/src/com/android/messaging/util/BuglePrefs.java b/src/com/android/messaging/util/BuglePrefs.java index 74a0d468..1571649c 100644 --- a/src/com/android/messaging/util/BuglePrefs.java +++ b/src/com/android/messaging/util/BuglePrefs.java @@ -41,6 +41,8 @@ public abstract class BuglePrefs { */ public static final int NO_SHARED_PREFERENCES_VERSION = -1; + public static final String KEY_LAST_VERSION = "last_version"; + /** * Returns the shared preferences file name to use. * Subclasses should override and return the shared preferences file. diff --git a/src/com/android/messaging/util/UiUtils.java b/src/com/android/messaging/util/UiUtils.java index ac7e3f9d..17ece8aa 100644 --- a/src/com/android/messaging/util/UiUtils.java +++ b/src/com/android/messaging/util/UiUtils.java @@ -16,6 +16,9 @@ package com.android.messaging.util; +import static com.android.messaging.util.BuglePrefs.KEY_LAST_VERSION; +import static com.android.messaging.util.BuglePrefs.NO_SHARED_PREFERENCES_VERSION; + import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; @@ -40,6 +43,7 @@ import android.widget.RemoteViews; import android.widget.Toast; +import com.android.messaging.BuildConfig; import com.android.messaging.Factory; import com.android.messaging.R; import com.android.messaging.ui.SnackBar; @@ -302,6 +306,23 @@ public static boolean isRtlMode() { .getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; } + /** + * Check if app has just been updated, so we can show the launchWelcomeSMSWarningActivity + */ + + public static boolean isFirstRunAfterUpdate(final Activity activity) { + final BuglePrefs prefs = BuglePrefs.getApplicationPrefs(); + + final int savedVersion = prefs.getInt(KEY_LAST_VERSION, NO_SHARED_PREFERENCES_VERSION); + final int currentVersion = BuildConfig.VERSION_CODE; + + if (currentVersion != savedVersion) { + UIIntents.get().launchWelcomeSMSWarningActivity(activity); + return true; + } + return false; + } + /** * Check if the activity needs to be redirected to permission check * @return true if {@link Activity#finish()} was called because redirection was performed @@ -319,6 +340,19 @@ public static boolean redirectToPermissionCheckIfNeeded(final Activity activity) return true; } + /** + * Checks whether or not to show the welcome/warning activity, + * and then checks whether or not to show the permission activity + * @param activity The current activity context + * @return true if either the welcome screen or permission check screen is shown + */ + public static boolean checkToShowWelcomeAndPermissionScreens (Activity activity) { + if (UiUtils.isFirstRunAfterUpdate(activity)) { + return true; + } + return UiUtils.redirectToPermissionCheckIfNeeded(activity); + } + /** * Called to check if all conditions are nominal and a "go" for some action, such as deleting * a message, that requires this app to be the default app. This is also a precondition