2015-02-08 21:53:12 +00:00
package org.thoughtcrime.securesms ;
2015-10-19 18:23:12 +00:00
import android.annotation.TargetApi ;
2019-09-18 05:40:18 +00:00
import android.app.ActivityManager ;
2020-03-19 02:45:55 +00:00
import android.content.BroadcastReceiver ;
2019-03-25 20:23:38 +00:00
import android.content.Context ;
2015-06-22 16:52:46 +00:00
import android.content.Intent ;
2020-03-19 02:45:55 +00:00
import android.content.IntentFilter ;
2019-09-18 05:40:18 +00:00
import android.graphics.Bitmap ;
import android.graphics.BitmapFactory ;
2015-06-22 16:52:46 +00:00
import android.os.Build ;
2015-10-19 18:23:12 +00:00
import android.os.Build.VERSION_CODES ;
2015-02-10 23:33:57 +00:00
import android.os.Bundle ;
2020-08-19 00:06:26 +00:00
import androidx.annotation.NonNull ;
import androidx.core.app.ActivityCompat ;
import androidx.core.app.ActivityOptionsCompat ;
import androidx.localbroadcastmanager.content.LocalBroadcastManager ;
import androidx.appcompat.app.AppCompatActivity ;
2015-02-08 21:53:12 +00:00
import android.view.KeyEvent ;
2015-06-22 16:52:46 +00:00
import android.view.View ;
2015-02-10 23:33:57 +00:00
import android.view.ViewConfiguration ;
2015-09-30 23:42:39 +00:00
import android.view.WindowManager ;
2020-03-19 02:45:55 +00:00
import android.widget.Toast ;
2015-02-10 23:33:57 +00:00
2018-08-01 15:09:24 +00:00
import org.thoughtcrime.securesms.logging.Log ;
2015-09-30 23:42:39 +00:00
import org.thoughtcrime.securesms.util.TextSecurePreferences ;
2019-03-25 20:23:38 +00:00
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageActivityHelper ;
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper ;
2015-09-30 23:42:39 +00:00
2015-02-10 23:33:57 +00:00
import java.lang.reflect.Field ;
2020-03-19 03:18:00 +00:00
import java.util.Date ;
2015-02-08 21:53:12 +00:00
2019-09-18 05:40:18 +00:00
import network.loki.messenger.R ;
2015-06-09 14:37:20 +00:00
public abstract class BaseActionBarActivity extends AppCompatActivity {
2015-02-10 23:33:57 +00:00
private static final String TAG = BaseActionBarActivity . class . getSimpleName ( ) ;
2020-03-19 02:45:55 +00:00
private BroadcastReceiver broadcastReceiver ;
2020-03-19 03:18:00 +00:00
private Date lastUnexpectedDeviceLinkRequestDate ;
2015-02-10 23:33:57 +00:00
@Override
protected void onCreate ( Bundle savedInstanceState ) {
if ( BaseActivity . isMenuWorkaroundRequired ( ) ) {
forceOverflowMenu ( ) ;
}
super . onCreate ( savedInstanceState ) ;
}
2015-09-30 23:42:39 +00:00
@Override
protected void onResume ( ) {
super . onResume ( ) ;
initializeScreenshotSecurity ( ) ;
2019-03-25 20:23:38 +00:00
DynamicLanguageActivityHelper . recreateIfNotInCorrectLanguage ( this , TextSecurePreferences . getLanguage ( this ) ) ;
2019-09-18 05:40:18 +00:00
String name = getResources ( ) . getString ( R . string . app_name ) ;
Bitmap icon = BitmapFactory . decodeResource ( getResources ( ) , R . drawable . ic_launcher_foreground ) ;
2020-01-09 00:35:43 +00:00
int color = getResources ( ) . getColor ( R . color . app_icon_background ) ;
2019-09-18 05:40:18 +00:00
setTaskDescription ( new ActivityManager . TaskDescription ( name , icon , color ) ) ;
2020-03-19 02:45:55 +00:00
broadcastReceiver = new BroadcastReceiver ( ) {
@Override
public void onReceive ( Context context , Intent intent ) {
2020-03-19 03:18:00 +00:00
Date now = new Date ( ) ;
if ( lastUnexpectedDeviceLinkRequestDate ! = null ) {
if ( now . getTime ( ) - lastUnexpectedDeviceLinkRequestDate . getTime ( ) < 30 * 1000 ) { return ; }
}
lastUnexpectedDeviceLinkRequestDate = now ;
2020-03-19 02:45:55 +00:00
Toast . makeText ( BaseActionBarActivity . this , " Open the device link screen by going to \" Settings \" > \" Devices \" > \" Link a Device \" to link your devices. " , Toast . LENGTH_LONG ) . show ( ) ;
}
} ;
LocalBroadcastManager . getInstance ( this ) . registerReceiver ( broadcastReceiver , new IntentFilter ( " unexpectedDeviceLinkRequestReceived " ) ) ;
}
@Override
protected void onDestroy ( ) {
LocalBroadcastManager . getInstance ( this ) . unregisterReceiver ( broadcastReceiver ) ;
super . onDestroy ( ) ;
2015-09-30 23:42:39 +00:00
}
2015-02-08 21:53:12 +00:00
@Override
public boolean onKeyDown ( int keyCode , KeyEvent event ) {
2015-02-10 23:33:57 +00:00
return ( keyCode = = KeyEvent . KEYCODE_MENU & & BaseActivity . isMenuWorkaroundRequired ( ) ) | | super . onKeyDown ( keyCode , event ) ;
2015-02-08 21:53:12 +00:00
}
@Override
public boolean onKeyUp ( int keyCode , @NonNull KeyEvent event ) {
2015-02-10 23:33:57 +00:00
if ( keyCode = = KeyEvent . KEYCODE_MENU & & BaseActivity . isMenuWorkaroundRequired ( ) ) {
2015-02-08 21:53:12 +00:00
openOptionsMenu ( ) ;
return true ;
}
return super . onKeyUp ( keyCode , event ) ;
}
2015-02-10 23:33:57 +00:00
2015-09-30 23:42:39 +00:00
private void initializeScreenshotSecurity ( ) {
2019-03-20 22:09:27 +00:00
if ( TextSecurePreferences . isScreenSecurityEnabled ( this ) ) {
2015-09-30 23:42:39 +00:00
getWindow ( ) . addFlags ( WindowManager . LayoutParams . FLAG_SECURE ) ;
} else {
getWindow ( ) . clearFlags ( WindowManager . LayoutParams . FLAG_SECURE ) ;
}
}
2015-02-10 23:33:57 +00:00
/ * *
* Modified from : http : //stackoverflow.com/a/13098824
* /
private void forceOverflowMenu ( ) {
try {
ViewConfiguration config = ViewConfiguration . get ( this ) ;
Field menuKeyField = ViewConfiguration . class . getDeclaredField ( " sHasPermanentMenuKey " ) ;
if ( menuKeyField ! = null ) {
menuKeyField . setAccessible ( true ) ;
menuKeyField . setBoolean ( config , false ) ;
}
2015-06-09 14:37:20 +00:00
} catch ( IllegalAccessException e ) {
Log . w ( TAG , " Failed to force overflow menu. " ) ;
} catch ( NoSuchFieldException e ) {
2015-02-10 23:33:57 +00:00
Log . w ( TAG , " Failed to force overflow menu. " ) ;
}
}
2015-06-22 16:52:46 +00:00
protected void startActivitySceneTransition ( Intent intent , View sharedView , String transitionName ) {
2015-06-27 03:14:51 +00:00
Bundle bundle = ActivityOptionsCompat . makeSceneTransitionAnimation ( this , sharedView , transitionName )
. toBundle ( ) ;
ActivityCompat . startActivity ( this , intent , bundle ) ;
2015-06-22 16:52:46 +00:00
}
2015-10-19 18:23:12 +00:00
2020-08-26 12:19:45 +00:00
//TODO AC: I don't think we need this method,
// setting any colors directly will most likely clash with the current theme.
@Deprecated
2015-10-19 18:23:12 +00:00
@TargetApi ( VERSION_CODES . LOLLIPOP )
protected void setStatusBarColor ( int color ) {
if ( Build . VERSION . SDK_INT > = Build . VERSION_CODES . LOLLIPOP ) {
getWindow ( ) . setStatusBarColor ( color ) ;
}
}
2019-03-25 20:23:38 +00:00
@Override
protected void attachBaseContext ( Context newBase ) {
super . attachBaseContext ( DynamicLanguageContextWrapper . updateContext ( newBase , TextSecurePreferences . getLanguage ( newBase ) ) ) ;
}
2015-02-08 21:53:12 +00:00
}