1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.tv.settings.device.apps; 18 19 import android.annotation.Nullable; 20 import android.app.Activity; 21 import android.app.Fragment; 22 import android.content.Context; 23 import android.content.Intent; 24 import android.content.pm.ApplicationInfo; 25 import android.content.pm.PackageManager; 26 import android.os.Bundle; 27 import android.os.Handler; 28 import android.os.storage.VolumeInfo; 29 import android.support.annotation.NonNull; 30 import android.util.Log; 31 import android.widget.Toast; 32 33 import com.android.tv.settings.device.storage.MoveAppProgressFragment; 34 import com.android.tv.settings.device.storage.MoveAppStepFragment; 35 36 public class MoveAppActivity extends Activity implements MoveAppStepFragment.Callback { 37 38 private static final String TAG = "MoveAppActivity"; 39 40 private static final String SAVE_STATE_MOVE_ID = "MoveAppActivity.moveId"; 41 42 private static final String ARG_PACKAGE_NAME = "packageName"; 43 private static final String ARG_PACKAGE_DESC = "packageDesc"; 44 45 private PackageManager mPackageManager; 46 private int mAppMoveId = -1; 47 private final PackageManager.MoveCallback mMoveCallback = new PackageManager.MoveCallback() { 48 @Override 49 public void onStatusChanged(int moveId, int status, long estMillis) { 50 if (moveId != mAppMoveId || !PackageManager.isMoveStatusFinished(status)) { 51 return; 52 } 53 54 finish(); 55 56 if (status != PackageManager.MOVE_SUCCEEDED) { 57 Log.d(TAG, "Move failure status: " + status); 58 Toast.makeText(MoveAppActivity.this, 59 MoveAppProgressFragment.moveStatusToMessage(MoveAppActivity.this, status), 60 Toast.LENGTH_LONG).show(); 61 } 62 } 63 }; 64 getLaunchIntent(Context context, String packageName, String packageDesc)65 public static Intent getLaunchIntent(Context context, String packageName, String packageDesc) { 66 final Intent i = new Intent(context, MoveAppActivity.class); 67 i.putExtra(ARG_PACKAGE_NAME, packageName); 68 i.putExtra(ARG_PACKAGE_DESC, packageDesc); 69 return i; 70 } 71 72 @Override onCreate(@ullable Bundle savedInstanceState)73 protected void onCreate(@Nullable Bundle savedInstanceState) { 74 super.onCreate(savedInstanceState); 75 76 mPackageManager = getPackageManager(); 77 mPackageManager.registerMoveCallback(mMoveCallback, new Handler()); 78 79 if (savedInstanceState != null) { 80 mAppMoveId = savedInstanceState.getInt(SAVE_STATE_MOVE_ID); 81 } else { 82 final String packageDesc = getIntent().getStringExtra(ARG_PACKAGE_DESC); 83 final String packageName = getIntent().getStringExtra(ARG_PACKAGE_NAME); 84 85 final Fragment fragment = MoveAppStepFragment.newInstance(packageName, packageDesc); 86 getFragmentManager().beginTransaction() 87 .add(android.R.id.content, fragment) 88 .commit(); 89 } 90 } 91 92 @Override onSaveInstanceState(@onNull Bundle outState)93 protected void onSaveInstanceState(@NonNull Bundle outState) { 94 super.onSaveInstanceState(outState); 95 outState.putInt(SAVE_STATE_MOVE_ID, mAppMoveId); 96 } 97 98 @Override onDestroy()99 protected void onDestroy() { 100 super.onDestroy(); 101 mPackageManager.unregisterMoveCallback(mMoveCallback); 102 } 103 104 @Override onRequestMovePackageToVolume(String packageName, VolumeInfo destination)105 public void onRequestMovePackageToVolume(String packageName, VolumeInfo destination) { 106 mAppMoveId = mPackageManager.movePackage(packageName, destination); 107 final ApplicationInfo applicationInfo; 108 try { 109 applicationInfo = mPackageManager 110 .getApplicationInfo(packageName, 0); 111 } catch (final PackageManager.NameNotFoundException e) { 112 throw new IllegalStateException(e); 113 } 114 115 final MoveAppProgressFragment fragment = MoveAppProgressFragment 116 .newInstance(mPackageManager.getApplicationLabel(applicationInfo)); 117 118 getFragmentManager().beginTransaction() 119 .replace(android.R.id.content, fragment) 120 .commit(); 121 } 122 123 } 124